開發現代化的.NetCore控制檯程式:(4)使用GithubAction自動構建以及釋出nuget包

程式設計實驗室發表於2023-11-13

前言

上一篇文章介紹了將 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 參數列示要執行作業的計算機型別:

關於 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-latestubuntu-22.04ubuntu-20.04 ubuntu-latest 標籤當前使用 Ubuntu 22.04 執行器映像。
Windows 2 7 GB 14 GB windows-latestwindows-2022windows-2019 windows-latest 標籤當前使用 Windows Server 2022 執行器映像。
macOS 3 14 GB 14 GB macos-latestmacos-12macos-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 算力?

本文的前半部分都是透過 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

搞定~

參考資料

相關文章