One Step Ahead

プログラミングやエンジニアリング全般について書いていきます

Github Actionを活用してnugetへpackageの公開を行う。

はじめに


先日作成した『CommandLineSelectableMenu』はmasterブランチへのコミットに反応して、自動的に新しいPackageをUploadします。
今日は備忘録を兼ねて、そのまとめです。

前提


『CommandLineSelectableMenu』を前提にWorkflowを作成しているので、下記を前提としています。

  • OS : Ubuntu
  • プロジェクト: .NET Standard

プロジェクト構成は下記の通りです。

./
 |--- .github
 |     |--- workflows
 |           |--- upload.yml 
 |--- src
 |     |--- Example.sln
 |     |--- Example
 |           |--- Example.csproj
 |           `--- Program.cs
 `--- README.md

nugetのAPIアクセスキーを作成する。


nugetに自作のPackageを公開するためには、サイトから直接Uploadを行う方法とコマンドラインからUploadする方法があります。
今回はコマンドラインからdotnet nuget pushコマンドを使用してUploadを行っていきます。 コマンドライン上からUploadしていくためには、API キーの作成が必要なります。
作成方法については、nuget パッケージの公開方法 | Microsoft Docsを参考にしてください。

Actions secretにAPIアクセスキーを登録


取得したAPIアクセスキーは事前に『Actions secrets』に登録しておきましょう。
取得したAPIキーをworkflowに記載するのは絶対にやめましょう!!

まずは、Settings > Secrets を開きます。

f:id:EaE:20210202215206p:plain

すると、『Actions secrets』が表示されるので、『New repository secret』を選択します。

f:id:EaE:20210202215216p:plain

後はキー名を設定して、先ほど取得したAPIキーをValueに設定すればOKです。

f:id:EaE:20210202215222p:plain

Actionの実行をmasterブランチに限定する。


Packageの公開タイミングは、featureブランチやdevelopブランチ、bugfixといったトピックブランチをMergeするタイミングなど、masterブランチに変更が行われるタイミングに限定します。

name: Package publish eample - Publish to Nuget

on:
  push:
    branches:
      - master

これで、Action実行の対象がmasterブランチに限定されます。

Build & Packageステップの追加


次にBuildから Packageを作成するステップまでを追加します。
使用するOSはUbuntuを使用します。

name: Package publish eample - Publish to Nuget

on:
  push:
    branches:
      - master

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1

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

      - name: Build
        run: dotnet build --configuration Release
        working-directory: ./src

      - name: Unit tests
        run: dotnet test --configuration Release
        working-directory: ./src

      - name: Generate nuget package.
        run: dotnet pack --configuration Release -o nupkg
        working-directory: ./src
  1. ステップ1では、ブランチをチェックアウトします。
  2. ステップ2では、.NET Coreのセットアップを行います。
  3. ステップ3では、Buildの確認を行います。./src配下に.slnファイルがあるので、作業フォルダは./srcを指定します。作業フォルダやBuild設定は、実際のプロジェクトに合わせて変更します。
  4. ステップ4では、単体テストを実行します。
  5. ステップ5では、Packagingを行います。方法はほとんどBuild変わりませんが、ここでは出力フォルダを指定しています。./nupkgへ.nupkgファイルを出力します。

BuildからTestまでのステップに関しては、masterブランチにMergeするタイミングではなく、ブランチに関わらず、Pushに応じてActionが実行される方が望ましいです。
なので、BuildからTestまでは専用のWorkflowを作成しておくことをお勧めします。

Uploadステップの追加


最後にUploadステップを追加します。

name: Package publish eample - Publish to Nuget

on:
  push:
    branches:
      - master

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1

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

      - name: Build
        run: dotnet build --configuration Release
        working-directory: ./src

      - name: Unit tests
        run: dotnet test --configuration Release
        working-directory: ./src

      - name: Generate nuget package.
        run: dotnet pack --configuration Release -o nupkg
        working-directory: ./src

      - name: Publish to nuget
        run: find . -type f -name *.nupkg -print0 | xargs -0 -I pkg dotnet nuget push pkg -k $nuget_api_key -s "https://api.nuget.org/v3/index.json" --skip-duplicate
        env:
          nuget_api_key: ${{ secrets.NUGET_API_KEY }}
        working-directory: ./src/nupkg

find . -type f -name *.nupkg -print0でカレントディレクトリ内のファイルを対象に*.nupkgファイルを検索します。
-print0の部分は、後続のxargs-0オプションを指定して、NULL文字区切りにしているので、それに合わせて設定しています。
また、xarg -0 -I pkgの記載の通り、-Iオプションが指定されているので標準入出力から読み込んだ値はpkgに入っています。

後はnuget パッケージの公開方法 | Microsoft Docsに記載のある通り実行すればOKです。
ここでPointになるのは、nuget_api_keyの部分です。
nuget_api_key: ${{ secrets.NUGET_API_KEY }}この部分で、secrets.NUGET_API_KEYを環境変数nuget_api_keyに設定しています。

まとめ


  • nugetへPackageのUploadを行う際は、大まかに分けてサイトから行う方法とコマンドラインから行う方法の2通りがある。
  • APIアクセスキーをActionで使用する際は、事前に『Actions secrets』に登録しておく。
  • 意外と簡単。

こちらで実際に使用しているので気なる方はどうぞ。

参考・引用