764 字
4 分鐘
Azure DevOps 部署到 VM (1) - Deploy
2023-03-21
無標籤

最近開始玩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可參考微軟文件

Terminal window
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update
sudo 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,這樣才有寫入權限。

Terminal window
sudo adduser azure
sudo usermod -aG sudo azure
sudo 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就好

Terminal window
sudo su azure
cd ~
# 貼上網頁複製過來的程式碼
# 如果遇到錯誤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進行編譯與打包。