C#
.NET
nuget

GitHubのタグに連動して、.NETStandard1.6のNugetパッケージを自動リリースする。

TL;DR

.NET Standard1.6ベースでNugetパッケージを作っています。GitHubでリリースしたとき(git tagをプッシュしたとき)、自動的にnuget.org上のパッケージが更新されるようにしました。

https://ci.appveyor.com/project/budougumi0617/testable/build/0.0.74

---------------------------PRや通常のプッシュをトリガーにビルドしたとき
Uploading artifacts...
[1/1] Budougumi0617.Testable.0.0.5.nupkg (5,100 bytes)...100%
"NuGet" deployment has been skipped as environment variable has not matched ("appveyor_repo_tag" is "false", should be "true")
Build success

---------------------------タグをトリガーにビルドしたとき
Uploading artifacts...
[1/1] Budougumi0617.Testable.0.0.5.nupkg (5,101 bytes)...100%
Deploying using NuGet provider
Publishing Budougumi0617.Testable.0.0.5.nupkg to https://www.nuget.org/api/v2/package...OK
Total packages published: 1
Build success

実際に利用しているリポジトリは以下になります。

budougumi0617.Testable

NuGet version
Build status
codecov

https://github.com/budougumi0617/Testable

関連ツールや対象プロジェクトについて

用途 ツール名
構成管理 GitHub
自動ビルド/自動デプロイ AppVeyor
リリース対象のnupkg .NET Standard1.6Nugetプロジェクト

構築手順

継続的インテグレーション(自動ビルド、自動テスト)までは別途構築済みとします。
詳細は以下を参考にしてください。

.NET Standard1.6プロジェクトのCI環境を構築する。

リリースに関する設定

AppveyorはWindowsコンテナで実行できるCIツールです。
.NET系の開発で使うツールや設定はプリセッティング/標準サポートされています。

Nugetの公開も基本的に公式の手順の通りにやればOKです。

AppVeyor | Publishing to NuGet feed

リポジトリのルートディレクトリに、appveyor.ymlファイルを配置します。
以下はリリースに関わる関連設定の抜粋です。

Testable/appveyor.yml

image: Visual Studio 2017
configuration: Debug
# platform: Any CPU
build:
  publish_nuget: true
  project: Testable.sln
  verbosity: minimal

deploy:
- provider: NuGet
  api_key:
    # Use encrypt tool
    # https://ci.appveyor.com/tools/encrypt
    secure: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  artifact: /.*\.nupkg/
  on:
    appveyor_repo_tag: true

.NET Standard1.6プロジェクトの場合はビルドにVisual Studio2017を使う必要があります。platform: Any CPUを設定すると、成果物のパスの解決に失敗してしまうため、configurationのみ設定しています。

リリースするnupkgファイルをビルドする。

ビルドの設定の中でpublish_nuget: trueとしておくと、自動的にnuget.orgにアップロードするnupkgファイルが生成されます。

リリース時の認証に使うAPIキーを設定する。

nuget.orgにアカウントを作成済みならば、以下のページからAPIキーを作成できます。

Nuget Gallery| API Keys

リポジトリのymlに直接記載する場合は、Appveyor提供の暗号化ツールで暗号化してから使います。

AppVeyor | Encrypt configuration data

AppVeyorのGUI画面から環境変数として登録しておき、、env:NUGET_KEYなどのように呼んでも良いです。

tagがプッシュされたときだけリリースする。

tagがプッシュされたときだけdeployを実行するにはappveyor_repo_tag: trueを設定します。公式の説明は以下です。

AppVeyor | Build on tags (GitHub, GitLab and BitBucket only)

以上でGitHubにタグがプッシュされたときだけ、nuget.orgにパッケージがリリースされるようになりました。

https://ci.appveyor.com/project/budougumi0617/testable/build/0.0.74

---------------------------PRや通常のプッシュをトリガーにビルドしたとき
Uploading artifacts...
[1/1] Budougumi0617.Testable.0.0.5.nupkg (5,100 bytes)...100%
"NuGet" deployment has been skipped as environment variable has not matched ("appveyor_repo_tag" is "false", should be "true")
Build success

---------------------------タグをトリガーにビルドしたとき
Uploading artifacts...
[1/1] Budougumi0617.Testable.0.0.5.nupkg (5,101 bytes)...100%
Deploying using NuGet provider
Publishing Budougumi0617.Testable.0.0.5.nupkg to https://www.nuget.org/api/v2/package...OK
Total packages published: 1
Build success

参考文献

2017年 .NET Core 1.x (Visual Studio 2017) プロジェクト向け AppVeyor での自動ビルドの設定

AppVeyor | Build pipeline

AppVeyor | Publishing to NuGet feed

AppVeyor | Build on tags (GitHub, GitLab and BitBucket only)

※この記事は自分のブログからの転載です。