上一篇我們講到Git Repo的網站部署到VM上,那接下來說明一下如何Build之後再部署。
CI/CD
這裡就講到DevOps中CI/CD的概念,CI指的是Continuous integration(持續整合),CD則是Continuous Deployment(持續部署),上篇文我們已經完成CD部分,我們這次再加入CI,CI通常會包含Build與Test,將打包好的程式碼進行測試,若測試完沒問題才部署出去。

程式碼
同上篇文,我們先準備好NGINX VM的環境,並已經加入Environments,並編輯azure-pipelines.yml,貼上以上程式碼
trigger:- main
pool: vmImage: ubuntu-latest
stages:- stage: Build jobs: - job: build_npm steps: - task: NodeTool@0 inputs: versionSpec: '10.x' displayName: 'Install Node.js' - script: echo "test" > test.html - publish: $(System.DefaultWorkingDirectory) artifact: afterbuild
- stage: Deploy dependsOn: Build condition: succeeded() jobs: - deployment: VMDeploy displayName: Deploy to VM environment: name: Production resourceType: virtualMachine strategy: runOnce: deploy: steps: - download: current artifact: afterbuild - script: rsync -avh --cvs-exclude $(Pipeline.Workspace)/afterbuild/ /var/www/html說明一下stage、job、step、task概念,這幾個是個階層關係如下:
Pipeline- Stage1 - Job1 - Step1 - Step2 - Task - Script - Job2 - Step1 - Step2- Stage2通常我們會將不同種大項目的工作分到不同stage,如Build、Test、Deploy。job則為stage下的子分類,例如Test中就可以分類為unit test、程式碼掃描等。step則為job下要執行的指令,可以包含task或script,其中task為微軟打包好的範本,可以使用參數來執行。
在Azure DevOps後台也可以看到不同Stage的狀態。依我們上面的YML,我們這邊有兩個Stage分別為Build、Deploy,裡面各有一個job。

Build程式碼說明
- stage: Build jobs: - job: build_npm steps: - task: NodeTool@0 # Step1 inputs: versionSpec: '10.x' displayName: 'Install Node.js' - script: echo "test" > test.html # Step2 - publish: $(System.DefaultWorkingDirectory) # Step3 artifact: afterbuild這段Code分為三個step我們逐步說明。
- Step1: 我們先模擬一個打包前端的過程,通常是用npm等工具,我的範例就先用task來安裝node套件。
- Step2: 這行可以放打包的指令,如npm run dev,由於這專案沒有放node的內容,我先手動產生一個test.html來當作打包好的檔案。
- Step3: 由於我們目前是使用微軟提供的Pipelines Server進行打包,下一個Stage是在我們自己的Server執行,就會看不到我們打包好的檔案,因此要將打包的路徑放到artifact暫存,到下一個Stage下載回來,我們將這個artifact命名為afterbuild。更多artifact請參考微軟文件。
Deploy程式碼說明
- stage: Deploy dependsOn: Build condition: succeeded() jobs: - deployment: VMDeploy displayName: Deploy to VM environment: name: Production resourceType: virtualMachine strategy: runOnce: deploy: steps: - download: current artifact: afterbuild - script: rsync -avh --cvs-exclude $(Pipeline.Workspace)/afterbuild/ /var/www/html接下來說明部署的部分,部署裡面只有一個job,跟上篇文不同的地方在於,dependsOn用於指定先等Build stage執行完。condition succeeded則代表build stage要成功執行完成才會觸發這個stage。
而其中包含兩個Step,第一步是下載回剛剛上傳的artifact,要注意這邊名稱要一樣,第二步則是使用rsync將下載回來的artifact複製到目標路徑。
artifact的路徑會在(System.DefaultWorkingDirectory),可以看看微軟文件。
部署完成之後就到http://
結語
透過Azure DevOps可以輕鬆的在雲端進行打包再部署,下一篇我們會說到如何將機敏參數放到伺服器上,如資料庫密碼等。