在 Ubuntu 20.04 上安裝 Azure Devops Agent 建置環境

前言

Azure DevOps Service 是微軟提供的一個集成式服務,用於規劃、協作、建置和部署軟體,它提供了一整套功能,包括版本控制、工作項追蹤、持續整合(CI)、持續部署(CD)、測試自動化、部署管道等等工具。

但若你要使用 Azure Pipelines 建置程式碼或部署程式,則需要至少一個代理程式,微軟提供的 Azure Agent 提供一個每個月可執行1,800 分鐘數的 CI/CD 免費版本,對於個人開發者來說,基本上已經綽綽有餘了,可以說是很佛心的服務,至少對我這樣的重度使用者來說,這個配額也足夠使用,除非你持續大量提交程式碼,才可能超過這個限制。

由於公司政策的限制,我的公司決定使用地端版的 Azure DevOps Server,但這意味著我需要建立自己的持續整合 (CI) 建置環境,一開始因為是使用微軟的服務,因此很自然的選擇了微軟的作業系統當作 Agent Server。

然而,每次前端環境的建置至少需要 15 分鐘以上,其中大部分時間都花在執行 npm install 上。直到有一天,我讀到保哥分享的文章,發現使用 Ubuntu 的 Agent 環境可以極大地加速建置時間,我花了點時間在雲端環境進行了測試,結果令驚為天人,於是我只好默默的將公司地端的 Agent 也改為 Ubuntu 版本來提高建置效率,這篇文章我要記錄一下設定環境的過程。


Agent 安裝步驟

先前我沒有使用過 Linux 相關的作業系統,因此在安裝作業系統時花了相當一段時間,而且一開始我也還不習慣使用指令進行相關環境設定,因此如何使用遠端桌面連線到這台作業系統也耗費了我不少時間,最後作業系統和連線設定完成後,我發現在 Ubuntu 上進行安裝與 Windows 幾乎沒有太大差異,而且事實上,只需要使用 SSH 來進行連線即可,遠端桌面雖然也可行,但並非必要,留下這篇文章的主要目的是要紀念我曾在這花了不少血淚時間,簡單的安裝步驟如下說明。

  • 按照 Devops 內 Linux x64 版的說明,將 agent 程式安裝到 ubuntu 內執行 ./config.sh 依指示登入。
    • 輸入伺服器url:http://xxx.xx.xx.xx , 選擇身份認證方式:我們這裡使用Negotiate。
    • 身份認證類型:
      • Alternate 基本驗證
      • Integrated Windows集成身份驗證,不支援 macOS 和 Linux.
      • Negotiate (默認) 通過Windows身份驗證方案(例如NTLM或Kerberos)以登錄用戶以外的用戶身份連接到TFS或Azure DevOps Server。選擇此模式後,系統將提示輸入憑據。
      • PAT 權杖驗證,需創建權杖
  • 完成安裝後,登入後拋回錯誤訊息 GSSAPI operation failed with error - An unsupported mechanism was requested. NTLM authentication requires the GSSAPI plugin 'gss-ntlmssp'

  • 解決辦法,在 Ubuntu20 系统中,安装 gss-ntlmssp 套件。
    sudo apt-get install gss-ntlmssp
    
  • 最後安裝代理服務並啟動。
    sudo ./svc.sh install
    sudo ./svc.sh start
    sudo ./svc.sh stop (這個是重啟服務)
    


安裝建置相關軟體

  • Linux 可透過 putty、MobaXterm 等工具並透過 SSH 來操作(可省下需遠端桌面的麻煩設定),例如使用下列指令,自動重開連線,通常用於某個軟體安裝完使用。
    source ~/.profile
    
  • (非必要可於 CI 設定) 安裝 nvm (此篇安裝時版本 0.39.3) + nodejs (此篇安裝時版本 14.21.2) https://bmhiamso1.medium.com/ubuntu-安裝-nvm-npm-3bf6bffa9152
    sudo curl https://raw.githubusercontent.com/creationix/nvm/v0.39.3/install.sh | bash
    
  • 使用 NVM 來安裝 NodeJS,這裡就不在說明怎麼安裝 NVM了。
    nvm install 14.21.2
    
  • (非必要可於 CI 設定)安裝 yarn (此篇安裝時版本 1.22.19)
    npm install -g npm
    npm install -g yarn@1.22.19
    
  • 安裝 Git (此篇安裝時版本 2.25.1) https://www.digitalocean.com/community/tutorials/how-to-install-git-on-ubuntu-20-04


安裝遠端桌面

一開始使用較舊的 Ubuntu 版本,但後來重新安裝了 22.04 版後有自帶遠端桌面,可不需安裝這個了,若有需要自行安裝遠端桌面的可參考底下說明。

  • 下載遠端桌面 Script,詳細說明可參考底下連結。
    wget https://gist.githubusercontent.com/peter279k/259f71b3a8cef3aa66e9af90e6800f2b/raw/c373ddee0d407dac850dc326c268e5df6d8c93f1/Std-Xrdp-install-0.2.sh
    
  • 設定該 Script 的權限 chmod是權限管理命令change the permissions mode of a file的縮寫。 chmod u+x *.sh 就表示對當前目錄下的所有副檔名為sh文件的所有者增加可執行權限。
    chmod u+x *.sh
    
    • u 代表所有者
    • x 代表執行權限
    • + 表示增加權限
  • 執行安裝遠端桌面 Script。
    ./Std-Xrdp-install-0.2.sh
    
  • 遠端桌面驗證,當執行完上述的shell script之後,接著將主機重新開機,並確定 3389 的 port number 沒有被IPTable 或是防火牆擋住,並可以使用下面的指令來確定 3389 的 port number 已經有服務監聽在此 port number 上了,若成功可以看到下圖
    etstat -ntlp | grep 3389

留言