Cloud Build で Secret Manager から接続情報を取得し、Github Packages の nuget feed からパッケージを復元する

準備

cloudbuild 用のサービスアカウントに Secret の読み出し権限を付与

シークレット マネージャーの使用 - Cloud Build

  1. Cloud Console で IAM ページを開きます。
  2. プロジェクトを選択し、[開く] をクリックします。
  3. 権限の表で、末尾が @cloudbuild.gserviceaccount.com のメールアドレスを見つけて、鉛筆アイコンをクリックします。
  4. Secret Manager Secret Accessor ロールを追加します。

UI を日本語にしていると、「Secret Manager のシークレットアクセサー」のように出るかもしれません。

nuget config の用意

本当は dotnet new nugetconfigdotnet nuget add source で nuget.confg も Cloud build の実行時に作ってしまいたかったのですが、add source の方の -u, -p が手元うまく機能しなかったので、nuget.config をあらかじめ用意する方法にしました。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <!--To inherit the global NuGet package sources remove the <clear/> line below -->
    <clear />
    <add key="nuget" value="https://api.nuget.org/v3/index.json" />
    <add key="github" value="https://nuget.pkg.github.com/%GITHUB_OWNER%/index.json" />
  </packageSources>
    <packageSourceCredentials>
        <github>
            <add key="Username" value="%GITHUB_USER%" />
            <add key="ClearTextPassword" value="%GITHUB_TOKEN%" /> 
        </github>
    </packageSourceCredentials>
</configuration>

環境変数から読むようにします。

Github Package への接続情報を用意

上述のように環境変数で接続情報を nuget.config に渡すため、利用しやすいように今回は最初から環境変数に設定できる形にしておきます。

export GITHUB_TOKEN=xxxx
export GITHUB_USER=xxxx
export GITHUB_OWNER=xxxx

⚠ あるあるですが、Windows の場合は CRLF ではなく LF で保存するのを忘れずに。

シークレットとして登録

シークレットマネージャーの使用のリンク先に以下のようなステップが書いてあるのでその通りにしていきます。今回はシークレットの名前を github-access-token とします。

  1. Cloud Console の [シークレット マネージャー] ページに移動します。
  2. [シークレット マネージャー] ページで、[シークレットを作成] をクリックします。
  3. [シークレットの作成] ページの [名前] に「secret-name」と入力します。
  4. [シークレット値] フィールドにデータを入力します。
  5. [リージョン] セクションは変更しません。
  6. [シークレットを作成] ボタンをクリックします。

cloudbuild.yml の用意

リポジトリルートに配置します。

steps:

- name: gcr.io/cloud-builders/gcloud
  entrypoint: bash
  args: 
  - -c
  - |
    gcloud secrets versions access --secret=github-access-token latest > /workspace/build_vars

- name: mcr.microsoft.com/dotnet/sdk:3.1
  entrypoint: bash
  args:
  - -c
  - |
    source /workspace/build_vars
    dotnet nuget list source
    dotnet restore

上記は一応 dotnet nuget list sourceGithub Packages の feed の設定ができているか見ていますが、設定が環境すれば消して大丈夫です。環境変数への設定がうまくできていれば、 https://nuget.pkg.github.com/%GITHUB_OWNER%/index.json環境変数部分が、置き換わった状態でログに表示されるはずです。

プロジェクトの用意

このままでは、何も restore するものがないので、Github Packages の nuget feed に登録し、それを参照するプロジェクトを追加してください。

実行

今回は Cloud Source Repository にリポジトリを作成し、そことビルドトリガーを組み合わせて試しました。

restore が失敗しなければ成功です。

最後に

「Secret Manager Secret Accessor ロール」は開発者に付与してしまうと、中が見えてしまうので管理者だけが見えるようにしておきます。

その他参考