前言
上一篇文章介紹了將 nuget 包釋出到 Github Packages 上。
本文更進一步,使用 GitHub Action 搭建 CI/CD 流水線,進行 nuget 的自動構建和釋出。?
GitHub Action 用起來和之前的 Gitlab CI/CD 是差不多的,可以使用 GitHub 提供的 runner ,也可以將自己的伺服器配置為 runner。
詳情可參考我之前寫的:持續整合指南:GitLab 的 CI/CD 工具配置與使用
首先建立一個 token
地址: https://github.com/settings/tokens
上一篇文章也有介紹,不再贅述
這個 token 要儲存好,下次開啟這個頁面就看不到了,只顯示一次。
配置 GitHub Secret
敏感資訊不適合儲存在程式碼裡,這裡 GitHub 提供了 Secret and variables
功能
地址: https://github.com/Deali-Axy/fluent-dotnet-console/settings/secrets/actions
把我們建立的 token 新增到 Action 的 secret 裡面
我這裡命名為 TOKEN
後續在 GitHub Workflow 配置裡面使用的時候是這樣
${{secrets.TOKEN}}
編寫 workflows 配置
在專案根目錄下新建 .github/workflows
目錄
PS: 可以直接在 GitHub 的網頁上執行這個操作,點 Add File ,檔名裡輸入
/
即可自動識別為目錄
接下來就開始編寫 workflow 配置檔案了,跟之前的 Gitlab CICD 配置差不多,也是 yaml 格式
這裡我建立一個名為 publish-nuget.yml
的檔案
# 釋出新的 nuget 包
name: publish-nuget
run-name: ${{ github.actor }} is publishing a nuget package ?
on: [push]
jobs:
publish-nuget-packages:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 7.0.x
- name: Restore dependencies
run: dotnet restore ./src/Templates/FluentConsole.Templates.csproj
- name: Build
run: dotnet build --no-restore -c Release ./src/Templates/FluentConsole.Templates.csproj
- name: Create the package
run: dotnet pack -c Release ./src/Templates/FluentConsole.Templates.csproj
- name: Add nuget source
run: dotnet nuget add source --username DealiAxy --password ${{ secrets.TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/Deali-Axy/index.json"
- name: Publish the package to Github Packages
run: dotnet nuget push ./src/Templates/bin/Release/*.nupkg --api-key ${{ secrets.TOKEN }} --source github --skip-duplicate
一些配置的介紹
這個檔案裡我配置了名為 publish-nuget-packages
的 job 用於構建 nuget 和推送到 GitHub Packages
檔案開頭的 on
表示這個 workflow 的觸發條件,可以設定為只有 master 分支更新的時候才執行,配置如下
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs.<job_id>.runs-on
參數列示要執行作業的計算機型別:
-
目標計算機可以是 GitHub 託管的執行器、大型執行器 或 自託管執行器。
-
你可以根據分配給執行器的標籤、其組成員身份或兩者的組合來定位執行器。
-
可以提供以下形式的
runs-on
:- 單個字串
- 包含字串的單個變數
- 字串陣列、包含字串的變數或兩者的組合
- 使用
group
或label
鍵的key: value
對
-
可以指定多個 runner ,比如
// 作業將僅在具有標籤 linux、x64 和 gpu 的自託管執行器上執行 runs-on: [self-hosted, linux, x64, gpu]
本文是直接白嫖了 GitHub 託管的 runner ,就不贅述自己搭建 runner 的過程了,詳情參考文件: https://docs.github.com/zh/actions/using-jobs/choosing-the-runner-for-a-job#choosing-self-hosted-runners
關於 Setup .NET
的 step,透過這個引數 uses: actions/setup-dotnet@v3
設定了執行環境,同理 GitHub 也提供了 Nodejs / Gradle 之類的其他環境,不過不在本文的討論範圍之內哈…
關於 GitHub 託管的 runner
如果使用 GitHub 託管的執行器,每個作業將在 runs-on
指定的執行器映像的新例項中執行。
可用的 GitHub 託管的執行器型別包括:
虛擬機器 | 處理器 (CPU) | 記憶體 (RAM) | 儲存 (SSD) | 作業系統(YAML 工作流標籤) | 說明 |
---|---|---|---|---|---|
Linux | 2 | 7 GB | 14 GB | ubuntu-latest 、ubuntu-22.04 、ubuntu-20.04 |
ubuntu-latest 標籤當前使用 Ubuntu 22.04 執行器映像。 |
Windows | 2 | 7 GB | 14 GB | windows-latest 、windows-2022 、windows-2019 |
windows-latest 標籤當前使用 Windows Server 2022 執行器映像。 |
macOS | 3 | 14 GB | 14 GB | macos-latest 、macos-12 、macos-11 |
macos-latest 工作流標籤目前使用 macOS 12 執行器映像。 |
macOS | 4 | 14 GB | 14 GB | macos-13 [Beta 版] |
不可用 |
最後我想吐槽一下 nuget 的推送機制,我明明在 dotnet nuget add source
裡已經制定了 token 了,push
的時候卻還得再指定一次…
執行 Action
搞定之後提交程式碼
即可在 Action 頁面看到執行結果
完美,解放雙手~ 還能白嫖 Github 的 runner 算力?
推送包到官方的 NuGet Gallery
本文的前半部分都是透過 GitHub Action 將 nuget 包推送到 GitHub Packages ,這樣安裝時需要從 Github 的源進行安裝。
接下來研究一下如何推送到官方的 NuGet Gallery
建立 APIKey
地址: https://www.nuget.org/account/apikeys
可以選有效期,最長是 365 天,記得到期前更新 token ,不然所有流水線就失效了。
建立之後點選 Copy 複製,這個和 GitHub 類似,都是隻會顯示一次 token ,下次訪問就無了,所以請儲存好。
新增 GitHub Action Secret
和前面的操作是一樣的
我新增了一個,名字是 NUGET_GALLERY_TOKEN
修改 workflow
修改一下 workflow 的配置
在最後增加一個 step
- name: Publish the package to Nuget Gallery
run: dotnet nuget push ./src/Templates/bin/Release/*.nupkg --api-key ${{ secrets.NUGET_GALLERY_TOKEN }} --source nuget.org --skip-duplicate
預設的 source 就是 nuget.org
,也可以不指定。
使用以下命令可以列出當前的 source 列表。
dotnet nuget list source
搞定~
參考資料
- https://docs.github.com/zh/actions/quickstart
- https://docs.github.com/zh/actions/automating-builds-and-tests/building-and-testing-net
- https://docs.github.com/zh/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions#upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token