ホームページ
2026年10月9日

GitHub Actions: API キーから信頼された発行

パッケージ
NuGet
Umbraco

最近、UmbracoNaviHideIconの新しいバージョンをリリースしたけど、APIキーは有効期限が切れていた。

新しいAPIキーを作った時、NuGetの勧めを見つけた。

8月17日から普通のAPIキーは30日で期限が切れる。

毎月更新しなければいけない。

それは面倒だから、信頼された発行を使いたい。

そのために、僕のGitHub Actionsも変えなければいけない。


はじめに

前に「どうやってGitHub Actionsを使ってNuGetパッケージを公開したか」というブログ記事を書いた。

そのブログ記事を書いた時、Umbraco 13を使っていたけど、今Umbraco 17を使っているから、プロジェクトの構造をちょっと変えた。

(プロジェクトの構造はここで読める「(第2回)Auto Dictionaries:Umbraco 13 から 17 への冒険 — プロジェクト構造と TypeScript への移行準備」)


現在のワークフロー

name: Release
on:
  release:
    types:
      - published
jobs:
  release_name:
    name: Publish NuGet Package
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build project
        run: dotnet build --configuration Release PROJECT_NAME

      - name: Package files
        run: dotnet pack --configuration Release  PROJECT_NAME/p:Version=${{github.ref_name}}

      - name: Publish the package
        run: dotnet nuget push PROJECT_NAME/build/Release/PROJECT_NAME.${{github.ref_name}}.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{secrets.PRIVATE_NUGET_KEY}}

プロジェクトの構造の変更

「(第2回)Auto Dictionaries:Umbraco 13 から 17 への冒険 — プロジェクト構造と TypeScript への移行準備」というブログ記事では、プロジェクトの構造を説明したから、この記事では説明しない。

でも一番大切なことは、今、TypeScriptを使っているから、コードがコンパイルされなければいけないことだ。

だから、ワークフローの.YMLのファイルには、このステップを追加しなければならない。

steps:
  - uses: actions/checkout@v4
  - name: Setup Node.js
    uses: actions/setup-node@v4
    with:
      node-version: '24'
      cache: 'npm'
      cache-dependency-path: 'PROJECT_NAME/Client/package-lock.json'

  - name: Install frontend dependencies
    run: npm ci
    working-directory: PROJECT_NAME/Client
  
  - name: Build frontend assets
    run: npm run build
    working-directory: PROJECT_NAME/Client

信頼された発行

基本的なフローを次に示す。

  1. GitHub Actionsはワークフローを実行する
  2. 有効期間の短いトークンを発行する
  3. そのトークンは nuget.org に送信される
  4. NuGet によって検証され、1時間だけ使える一時 APIキーが返される
  5. ワークフローでは、そのキーを使用してパッケージをプッシュする

ワークフローの変更

まずは、OIDCトークンが必要だから、YMLファイルに許可を追加する。

permissions:
  id-token: write

OIDC(OpenID Connect)は認証の仕組みだ。
ワークフローが動く時、GitHubがトークンを作る。
そのトークンには、どのリポジトリのどのワークフローかが書いてある。
nuget.orgは、そのトークンが本当にGitHubから来たかどうか確認できる。
だから、APIキーを保存しなくてもいい。

次に、有効期間の短いトークンを発行する。

- name: NuGet login (OIDC → temp API key)
  uses: NuGet/login@v1
  id: login
  with:
    user: ${{secrets.NUGET_USER}}

userはnuget.orgのユーザー名で、メールアドレスじゃない。GitHub SecretsにNUGET_USERとして追加したほうがいい。

最後に、

secrets.PRIVATE_NUGET_KEYをsteps.login.outputs.NUGET_API_KEYに変更する。

これで、GitHub SecretsのPRIVATE_NUGET_KEYを削除できる。

- name: Publish the package
  run: dotnet nuget push PROJECT_NAME/build/Release/PROJECT_NAME.${{github.ref_name}}.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{steps.login.outputs.NUGET_API_KEY}}

nuget.orgのセットアップ

nuget.orgにログインしてから、新しい信頼された発行ポリシーを追加できる!

ユーザー名をクリックして、「Trusted Publishing」を選ぶ。

  • ポリシーの所有者 - 自分か、組織
  • リポジトリ所有者(Repository Owner) - GitHubのユーザー名か組織の名前。
  • リポジトリ(Repository) - リポジトリの名前。例えばUmbracoNaviHideIcon
  • ワークフロー ファイル(Workflow File) - main.yml。ファイル名だけでいい(.github/workflows/はいらない)
  • 環境(Environment) - 使っていなければ、空のままでいい
  • パッケージ(Glob Patterns and Packages) - *はすべてのパッケージという意味

ワークフローの例

main.yml

name: Release
on:
  release:
    types:
      - published
permissions:
  contents: read
jobs:
  release_name:
    permissions:
      id-token: write
    name: Publish NuGet Package
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - name: Setup Node.js
        uses: actions/setup-node@v7
        with:
          node-version: '24'
          cache: 'npm'
          cache-dependency-path: 'PROJECT_NAME/Client/package-lock.json'

      - name: Install frontend dependencies
        run: npm ci
        working-directory: PROJECT_NAME/Client
      
      - name: Build frontend assets
        run: npm run build
        working-directory: PROJECT_NAME/Client

      - name: Build project
        run: dotnet build --configuration Release PROJECT_NAME

      - name: Package files
        run: dotnet pack --configuration Release  PROJECT_NAME /p:Version=${{github.ref_name}}

      - name: NuGet login (OIDC → temp API key)
        uses: NuGet/login@v1
        id: login
        with:
          user: ${{secrets.NUGET_USER}}

      - name: Publish the package
        run: dotnet nuget push PROJECT_NAME/build/Release/PROJECT_NAME.${{github.ref_name}}.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{steps.login.outputs.NUGET_API_KEY}}

まとめ

API キーから信頼された発行に変えるために、やったことは3つだけだ。

  1. ワークフローにid-token: writeの許可を追加した
  2. NuGet/loginのステップとNUGET_USERを追加した
  3. nuget.orgで信頼された発行ポリシーを作った

これで、PRIVATE_NUGET_KEYはもういらない。

キーを保存しないから、もっと安全だ。

それに、もう毎月 APIキーを更新しなくてもいい!


参考

ヨハネス・ランツ

ヨハネス・ランツ

ウェブ開発者・経験9年

採用可能
GitHub Actions: API キーから信頼された発行 | ブログ | ヨハネス・ランツ