最近開始玩Azure Devops,他有非常好用部署到VM的功能,而且是地端、GCP、AWS、Azure的VM都適用。這台VM不需要有Public IP,只要能連線到網路就可。我們會需要在VM中安裝Azure DevOps的Agent,當我們推Code到git上,Agent就會執行我們撰寫的部署腳本。
以下會說明如何將git上的html部署到VM上,我們會在一台VM上先安裝好NGINX作為Web Server,並且將git的html檔案複製到NGINX用的/var/www/html。
步驟一、準備一台VM當Production
我是在GCP上開一台Ubuntu,我們先安裝以下套件:
.net core 3.1、 : Azure DevOps Agent用
git : 版本管控用
rsync : 部署腳本用
nginx : 本次練習用的web server
以下安裝以Ubuntu 為例,其他Linux可參考微軟文件
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.debsudo dpkg -i packages-microsoft-prod.debsudo apt-get updatesudo apt-get install -y dotnet-sdk-3.1
sudo apt-get install -y git rsync nginx libssl-dev由於Azure DevOps Agent是用註冊時候的帳號執行,所以我們先開一個公用的帳號叫做azure,並將目標/var/www/html的所有者也改成azure,這樣才有寫入權限。
sudo adduser azuresudo usermod -aG sudo azuresudo chown -R azure /var/www/html步驟二、在Azure Devops建立Repo
先到Azure DevOps開一個專案 > 選擇 Repos > 選擇Initialize

再來新增一個檔案叫做index.html

index.html內容如下
<!DOCTYPE html><html><body><h1>Hello World</h1></body></html>步驟三、在VM註冊Azure DevOps Agent
到 Pipeline > Environments > Create environment

Name輸入Production,並選擇VM

選擇 Linux,並複製他產生的shell script

再來到VM,先切換到使用者azure,貼上複製到的script並執行,會看到這個畫面先輸入N就好
sudo su azurecd ~# 貼上網頁複製過來的程式碼
# 如果遇到錯誤The SSL connection could not be established, see inner exception.,執行下面指令再重新安裝export AZP_AGENT_USE_LEGACY_HTTP=true
如果執行成功,會跳出以下畫面,失敗的話可能是因為缺少.net套件

再回到網頁就可以看到已經成功註冊的VM

步驟四、撰寫部署指令
同上面新增index.html的步驟,我們新增另外一個檔案azure-pipelines.yml,這裡面會包含我們的部署腳本,當有人推code上來的時候,就會觸發部署。
azure-pipelines.yml
trigger:- main
pool: vmImage: ubuntu-latest
jobs:- deployment: VMDeploy displayName: Deploy to VM environment: name: Production # 同剛剛在Environments輸入的名稱 resourceType: virtualMachine strategy: runOnce: deploy: steps: - checkout: self # 在Server下載本git repo - script: rsync -avh --cvs-exclude '$(Build.SourcesDirectory)/' /var/www/html以上指令我們先用checkout: self下載最新的repo,再用rsync複製到NGINX的/var/www/html,來完成持續部署。
到Pipelines新增一個pipeline,選擇這個repo,然後就可以查看腳本有沒有成功執行

接下來http到VM的Pubic IP,就可以看到Hello World了,更多Environments的說明可以參考微軟文件。
結語
透過以上方法就可以簡單的將程式碼部署到VM上,這個做法也類似在目標VM安裝Gitlab Runner。下一篇會將到如何在Azure DevOps進行編譯與打包。