Skip to content

Azure Pipelines Self-Hosted Agent — Ubuntu 安裝與服務設定

Azure DevOps Self-Hosted Agent 在 Ubuntu 上安裝、向 ADO 組織註冊,並透過 svc.sh 設為 systemd 開機常駐服務的完整 SOP。

概述

Azure Pipelines 的 Agent 分為 Microsoft-hosted(雲端代管)與 Self-Hosted(自行維護)兩類。Self-Hosted Agent 讓 Pipeline 能存取內部網路資源(私有 K8s 叢集、內部 Container Registry 等),也可預先安裝所需工具(kubectl、helm、az CLI)避免每次 Pipeline 重複安裝。

安裝流程分三個階段:下載並解壓 Agent tarball → 執行 config.sh 向 Azure DevOps 組織完成註冊(此步驟會產生 svc.sh)→ 透過 svc.sh 將 Agent 安裝為 systemd service,確保開機自動啟動、常駐背景執行。

理解各腳本的職責分工是操作此流程的關鍵:config.sh 是一次性的註冊工具,svc.sh 管理 systemd service 的生命週期,runsvc.sh 才是 systemd 實際呼叫的啟動腳本(由 svc.sh install 自動建立)。

核心內容

目錄結構的兩個狀態

Agent 解壓後只有 config.shrun.sh 等基本檔案;svc.sh 必須在執行 config.sh 完成註冊後才會自動產生。若在 config 完成前找不到 svc.sh,是正常現象而非錯誤。

狀態目錄內容
configbin config.sh env.sh externals license.html reauth.sh run-docker.sh run.sh
config同上 + _diag/ svc.sh

各腳本職責

腳本用途備註
config.sh向 ADO 組織註冊 Agent,產生 svc.sh僅需執行一次
run.sh前景執行(測試用)Terminal 關閉即停止
run-docker.shDocker 容器模式執行容器環境適用
svc.sh管理 systemd service(install / start / stop / uninstall)config 後產生
runsvc.shsystemd 實際呼叫的啟動腳本svc.sh install 建立

runsvc.sh 的啟動邏輯

runsvc.sh 本身不含開機自啟邏輯,僅執行三件事:

  1. .path 檔載入 PATH 環境變數
  2. 偵測 Node 版本(優先 node20,fallback node16)
  3. 執行 AgentService.js

開機自啟的設定完全由 svc.sh install 在 systemd 層面完成。

服務命名規則

systemd service 的命名格式為:

vsts.agent.<Org>.<Pool>.<AgentName>.service

例如:vsts.agent.DigitalInnovationDevDiv.Default.master2.service

特殊字元(如 -)在 systemd unit 名稱中會以 \x2d 表示,查詢時需注意。

關鍵要點

  • svc.shconfig.sh 完成後自動產生的,執行前不存在
  • sudo ./svc.sh install 同時完成「建立 service file」與「設為 enabled」兩件事
  • run.sh 是前景測試工具,不適合正式環境;正式環境必須用 svc.sh
  • systemctl is-enabled 可確認服務是否已設定開機自啟
  • svc.sh 的情況下需手動撰寫 /etc/systemd/system/*.service

實際應用

典型使用情境:在公司內部伺服器(Ubuntu VM 或裸機)上常駐一個或多個 Self-Hosted Agent,讓 Azure DevOps Pipeline 能透過它存取私有 K8s 叢集(AKS Private Cluster 或內網 K8s)、內部 Container Registry,以及公司網路內的資料庫或其他服務。

若同一台 Server 上同時跑多個 Pipeline,建議搭配 Azure Pipeline — Kubeconfig 隔離最佳實踐 避免 kubeconfig 競態問題。

部署設定參考

以下為完整安裝流程指令,供日後查詢與複製使用。

安裝流程

bash
# Step 1: 下載並解壓 Agent
mkdir ~/devops-agent && cd ~/devops-agent
tar zxvf vsts-agent-linux-x64-*.tar.gz

# Step 2: 向 ADO 組織註冊(依提示輸入 URL、PAT Token、Pool 名稱、Agent 名稱)
./config.sh

# Step 3: 安裝為 systemd 開機服務
sudo ./svc.sh install
sudo ./svc.sh start
sudo ./svc.sh status

config.sh 需要輸入的資訊

項目說明
Azure DevOps URL例如 https://dev.azure.com/YourOrg
PAT TokenPersonal Access Token,需有 Agent Pools (read, manage) 權限
Agent Pool 名稱預設為 Default
Agent 名稱辨識用,可自訂

svc.sh 常用指令

bash
sudo ./svc.sh install    # 註冊 systemd service 並設定 enabled
sudo ./svc.sh start      # 啟動服務
sudo ./svc.sh stop       # 停止服務
sudo ./svc.sh status     # 查看服務狀態
sudo ./svc.sh uninstall  # 移除開機服務(不刪除 agent 本身)

服務狀態檢測指令

bash
# 確認服務是否運行中
systemctl list-units --all | grep -i "Azure Pipelines Agent"

# 確認服務是否設為開機自啟
systemctl is-enabled "vsts.agent.<Org>.<Pool>.<AgentName>.service"

# 全面掃描開機啟動設定
echo "=== systemd ===" && systemctl list-unit-files | grep -i devops
echo "=== systemd files ===" && find /etc/systemd/system/ /lib/systemd/system/ -name "*devops*" 2>/dev/null
echo "=== crontab (user) ===" && crontab -l 2>/dev/null | grep -i devops
echo "=== crontab (root) ===" && sudo crontab -l 2>/dev/null | grep -i devops
echo "=== rc.local ===" && grep -i devops /etc/rc.local 2>/dev/null

服務正常狀態判讀

systemctl list-units 應顯示:

欄位說明
LOADloadedunit 檔已載入
ACTIVEactive服務已啟動
SUBrunning程序正在執行中
is-enabledenabled開機會自動啟動

開機自啟常見設定位置

機制位置檢查指令
systemd service/etc/systemd/system/systemctl list-unit-files | grep <name>
crontab @reboot使用者 crontabcrontab -l
crontab @rebootroot crontabsudo crontab -l
rc.local/etc/rc.localcat /etc/rc.local

相關概念

來源