dotnet 配置 github 自動打包上傳 nuget 文件

  • 2019 年 12 月 12 日
  • 筆記

在上一篇博客告訴小夥伴如何使用 github 做持續集成,本文告訴大家如何配置 github 讓在 master 每次合併都會自動創建一個 nuget 文件,自動上傳

在 github 的 action 功能可以很方便創建打包任務,但是沒有很方便進行 nuget 上傳,需要額外寫一點代碼

全部的源代碼請看 github 如果發現有坑請郵件告訴我

創建配置文件

上一篇博客告訴小夥伴在 .github/workflows 文件夾創建 *.yml 文件就可以作為 action 配置文件

創建一個隨意命名的 yml 文件在 .github/workflows 文件夾,完成創建配置文件

標識

每個 workflow 都可以使用單獨的命名,這個命名不是從文件名讀取,而是通過 name: 屬性讀取。在讀本文之前,我認為小夥伴都是了解 YAML 格式的,也就不對大家說明 YAML 的語法

name: publish nuget

上面的代碼就會添加命名是 publish nuget 的 workflow 在 action 頁面可以通過對應的命名找到不同的 workflow 如

觸發條件

因為我不需要在任何的分支都觸發打包,只需要觸發在 master 合併,可以使用下面代碼

on:    push:      branches:        - master

這裡 on 屬性就是表示觸發條件,觸發條件是 push 同時要求分支是 master 分支,當然這裡支持多個分支

我不會在這裡和官方文檔一樣詳細告訴大家其他更多有趣的配置

運行環境

接下來的代碼都會放在 jobs 下面

jobs:    build:

通過 runs-on 屬性可以指定在哪個環境運行,如在 windows 的最新版本運行

jobs:    build:      runs-on: windows-latest

切換分支

接下來就是打包步驟,在編譯前需要通過 git 拿到當前代碼

jobs:    build:      runs-on: windows-latest      steps:      - uses: actions/checkout@v1

然後就是一個個具體的打包步驟了

安裝 dotnet 應用

其實使用最新的 windows 環境是不需要做安裝 dotnet 應用的

在打包步驟,每個步驟都包含一個 name 屬性,用於在打包告訴開發執行的步驟,效果如下

在安裝 dotnet 應用將會使用現有的腳本,其實在上一步的 uses: actions/checkout@v1 其實就是使用 github 的 https://github.com/actions/checkout 倉庫的腳本

安裝 dotnet 可以使用 actions/setup-dotnet 腳本

    steps:      - uses: actions/checkout@v1        - name: Setup .NET Core        uses: actions/setup-dotnet@v1        with:          dotnet-version: 3.1.100

這裡的 with 屬性就是添加參數,通過值和鍵的方式,上面代碼就給了 dotnet 版本

編譯代碼

在 dotnet 可以通過 pack 命令編譯打包,在打包步驟,除了使用 uses 使用現有代碼,還可以使用 run 執行命令行代碼

    - name: Build with dotnet        run: dotnet pack --configuration Release        shell: pwsh

默認在 windows 執行的是 PowerShellCore 腳本,可以通過 shell 屬性指定使用哪個平台,可選的是

  • bash 在非 windows 平台降級為 sh 腳本
  • pwsh 使用 PowerShellCore 腳本
  • python 使用 python 命令
  • sh 使用 sh 命令
  • cmd 使用批處理腳本
  • powershell 使用 powershell 腳本

在執行上面代碼的要求是在倉庫的文件夾存在 .sln 文件,如果倉庫文件夾不存在,那麼需要加入 sln 所在的路徑

安裝 nuget 應用

在 windows 平台都沒有安裝 nuget 需要從官方下載

下載 nuget 需要多句命令,在 action 通過在 run 添加 | 寫多行命令

    - name: Install Nuget        run: |          $sourceNugetExe = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"          $targetNugetExe = "nuget.exe"          Invoke-WebRequest $sourceNugetExe -OutFile $targetNugetExe        shell: pwsh

使用 PowerShell 腳本下載 nuget 文件,因為 nuget 文件不需要加入環境變量,所以就不需要額外步驟

添加上傳信息

可以上傳 nuget 到 nuget.org 也可以上傳在對應的 github 倉庫,上傳到 github 倉庫請看 Github 給倉庫上傳 NuGet 庫

請先測試一下按照 Github 給倉庫上傳 NuGet 庫 是否成功上傳 nuget 庫,如果成功那麼添加下面代碼

    - name: Add private GitHub registry to NuGet        run: |          .nuget sources add -name github -Source https://nuget.pkg.github.com/ORGANIZATION_NAME/index.json -Username ORGANIZATION_NAME -Password $

這樣就添加對應的倉庫,可以用來上傳

當然,上傳到 nuget.org 就需要設置 ApiKey 了,打開 nuget.org 用自己的帳號登錄,點擊 API keys 設置

進入之後按照下圖給配置,或根據自己的需要給配置

點擊完成,將 API key 複製

小夥伴也不想將這個的 API Key 放在腳本裏面,如果放在腳本裏面,也許有逗比會哪這個 API Key 傳一些有趣的庫,所以需要在這個 API Key 放在安全的地方

打開對應倉庫的設置頁面

點擊安全

點擊新建安全

粘貼剛才複製的 API Key 到內容

這裡的 name 在腳本通過 $ 替換,這裡的 secrets.Name 的 Name 就是輸入的 name 如上面輸入的是 NugetKey 在使用腳本需要下面代碼

$

完成配置之後就是上傳庫

上傳文件

使用 nuget 用下面命令上傳 nuget 文件

.nuget push .binrelease*.nupkg -Source github -SkipDuplicate

上面代碼就是將 binrelease 文件夾的所有 nupkg 文件上傳到 github 這個源,同時跳過已經上傳的版本

而剛才沒有配置 nuget.org 的源,需要使用這個代碼上傳

.nuget push .binrelease*.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey $ -NoSymbols

這裡 -ApiKey 用到上一步添加的安全信息,細心小夥伴發現添加了 -NoSymbols 因為 nuget.org 默認上傳 snupkg 文件,如果找不到文件就會提示找不到文件,請看 NuGet 命令行上傳找不到 snupkg 文件

現在就完成了合併代碼到 master 分支自動執行持續集成,打包完成自動上傳 nuget 和 github 同時配置很簡單

全部代碼

下面代碼直接複製可能無法在你的項目運行,請根據你的項目修改

name: publish nuget    on:    push:      branches:        - master    jobs:    build:        runs-on: windows-latest        steps:      - uses: actions/checkout@v1        - name: Setup .NET Core        uses: actions/setup-dotnet@v1        with:          dotnet-version: 3.1.100      - name: Build with dotnet        run: dotnet pack --configuration Release      - name: Install Nuget        run: |          $sourceNugetExe = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"          $targetNugetExe = "nuget.exe"          Invoke-WebRequest $sourceNugetExe -OutFile $targetNugetExe        shell: pwsh      - name: Add private GitHub registry to NuGet        run: |          .nuget sources add -name github -Source https://nuget.pkg.github.com/ORGANIZATION_NAME/index.json -Username ORGANIZATION_NAME -Password $      - name: Push generated package to GitHub registry        run: |          .nuget push .binrelease*.nupkg -Source github -SkipDuplicate          .nuget push .binrelease*.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey $ -NoSymbols 

上面的代碼在 SourceYard 使用,這是我開源的項目,支持製作源代碼的 nuget 庫文件。也就是通過 nuget 給小夥伴的不是 dll 引用,而是源代碼引用,特別適合小的庫