[Azure DevOps] 使用 Azure Pipelines 實現 CI


1. 什么是 Azure Pipelines

Azure Pipelines 會自動構建和測試代碼項目,以將其提供給其他人。它適用於任何語言或項目類型。Azure Pipelines 結合了持續集成 (CI) 和持續交付 (CD),以持續不斷地測試和構建您的代碼,並將代碼運送到任何目標。

在網上關於 Azure Pipelines 的教程很多,通常都是從 CI 到 CD 一條龍。但對於 WPF 來說也 CD 部分就有些尷尬,畢竟桌面應用通常不需要“部署”,所以這篇文章將只簡單介紹如何創建編譯 WPF 代碼的 Pipeline。

2. 創建 Pipeline

在 Azure Devops 左邊菜單中選中 Pipelines,進入 Pipelines 頁面,點擊 Create Pipeline 按鈕進入下圖中的創建 Pipeline 頁面,然后按以下步驟操作:

  1. Where is your code?:選擇代碼所在的位置,選擇 Azure Repos Git

  2. Select a repository:選中代碼的存儲庫,這里我選擇了之前創建的 wpf 存儲庫。

  3. Configure your pipeline:選擇 Pipeline 的配置方式,因為是 WPF 項目,所以選擇 .NET Desktop

  4. Review:檢查生成的 YAML,可以重命名 YAML 文件,也可以點擊右邊的 Show assistant 打開 Tasks 列表查找並添加其它任務到 YAML 中。然后點擊右上角的 Save and run 按鈕。

  1. 在彈出的面板中,選擇 Create a new branch for this commitStart a pull request,然后點擊 Save and run 按鈕。

現在創建了一個 Pull request,並且將剛剛創建的 Pipeline 的 YAML 加入到文件里了。這個 Pull Request 和 YAML 的內容如下:

trigger:
- master
pool:
  vmImage: 'windows-latest'
variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'
- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'
- task: VSTest@2
  inputs:
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'
  • trigger:觸發器,當 master 更改時執行這個 Pipeline。
  • pool:要使用 Azure Pipelines 構建代碼,至少需要一個代理。默認使用 Microsoft 托管的代理。
  • varibles:各種參數。
  • steps:步驟,可以看到這個 Pipeline 有四個Task:安裝 Nuget,還原 Nuget,編譯,測試。

VSBuild@1VSTest@2 等名稱后面帶 @ 和數字的,代表這個任務的第幾版,例如 VSBuild@1 代表 VSBuild 的第一版。

回到 Pipelines 頁面,找到新創建的 Pipeline(名稱為 wpf),點擊進入詳細,可以看到 Runs、Branches、Analytics 三個頁面,點擊 Runs 列表中最上面一條,進入最近一個運行的詳細結果。

點擊 Job 進入運行的詳細結果。可以看到每一個 task 的運行狀況、持續時間,點擊 task 還可以看到具體日志。

3. 下載軟件

剛剛那個 Pipeline 還只是第一步,因為 Build 完就完事了,軟件編譯到哪里了?我怎么下載?接下來就要編輯 這個 Pipeline,加入 PublishBuildArtifacts 任務。

回到 Pipeline 的詳細頁面,點擊右上角的 Edit 按鈕,進入編輯頁面。

編輯頁面左邊是 YAML 編輯器,右邊是可用的 Task 列表。

在右上角的搜索框里輸入 copy 找到 Copy files 這個 Task,點擊進入配置頁面。在 Source Folder 輸入 WPF 項目的 Release 位置,Target Folder 輸入 $(build.artifactstagingdirectory)。Build.ArtifactStagingDirectory 是個預定義變量,代表代理服務器上一個路徑,artifact 發布前通常把要發布的內容復制到這個目錄。

點擊 Add 按鈕把這個任務添加到 YAML。

接着搜索 publish 找到 Publish build artifacts 任務,可以直接保留默認值,也可以在 publish location 選項中選擇 A file share,直接復制到指定位置點擊,這里不作修改。Add 添加任務。

完成后可以看到下面這段內容被添加到 YAML 中。最后點擊右上角的 Save,這個 YAML 將保存到 master 的文件中,由於要修改 master 分支,所以會自動創建一個 Pull request 並運行這個 Pipeline。

- task: CopyFiles@2
  inputs:
    SourceFolder: 'wpf/bin/release'
    Contents: '**'
    TargetFolder: '$(build.artifactstagingdirectory)'
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

上面是一般做法。也可以在新建 Pipeline 選擇 Use the classic editor to create a pipeline without YAML,之后選擇:

  • Select a source:Azure Repos Git
  • Team project:wpf
  • Repository:wpf
  • Default branch…:master
  • Featured:.NET Desktop

然后就一切都安排得妥妥當當,再在 Triggers 頁面選中 Enable continuous integration,然后直接點擊 Save & queue 完成創建。

最后,Pipeline 運行完成后,在 Run 的詳細頁面點擊這個按鈕(因為只創建了一個 Publish build artifacts 的 Task,所以結果是 1 published),進入 Artifacts 頁面,即可將發布的內容以 Zip 的形式下載。

4. 創建用於驗證提交的 Pipeline

測試是持續集成的一個重要組成部分,我們可以通過配置分支策略,讓每次代碼合並到 master 分支之前都先通過測試。那么整個代碼修改的流程就變成這樣:

  1. 提交 Pull request
  2. 觸發驗證的 Pipeline
  3. 驗證通過后代碼合並到 master 分支
  4. 觸發構建 artifact 的 Pipeline。

現在我們已經有一個 Pipeline了,完全可以用這個 Pipeline 滿足上面的要求。但如果項目很大,編譯測試耗時很長,最好還是將它拆分成兩個分別用來完成第 2 步和第 4 步的 Pipeline。

具體來說,就是從已經創建的 Pipeline 中刪除 VSTest 這個 Task,再重新建一個 Pipeline(只包含 NuGetToolInstaller、NuGetCommand、VSBuild、VSTest 等 4 個 Task,並且刪除 trigger,即不再從 master 分支觸發),將它 Rename 為 wpf-verify。

打開 master 的 Branch Policies 頁面,在 Build Validation 中添加一個編譯策略,Build pipeline 選擇 wpf-verify,點擊保存。

現在,當代碼編譯不通過,或者單元測試有不通過的測試,Pull request 檢查不通過,不能合並。

點擊錯誤信息,可以看到具體出錯的單元測試。

修改代碼后再提交,所有驗證通過的結果如下:

之后代碼合並到 master 分支並觸發自動構建,整個流程就基本完成了。

5. 最后

對於 wpf 應用來說,Azure Pipelines 的使用還有其它一些問題,將在之后的文章里介紹。

更多的內容可以參考官方文檔:

Azure Pipelines 文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM