Cloud Build で Secret Manager から接続情報を取得し、Github Packages の nuget feed からパッケージを復元する
準備
cloudbuild 用のサービスアカウントに Secret の読み出し権限を付与
シークレット マネージャーの使用 - Cloud Build
- Cloud Console で IAM ページを開きます。
- プロジェクトを選択し、[開く] をクリックします。
- 権限の表で、末尾が @cloudbuild.gserviceaccount.com のメールアドレスを見つけて、鉛筆アイコンをクリックします。
- Secret Manager Secret Accessor ロールを追加します。
UI を日本語にしていると、「Secret Manager のシークレットアクセサー」のように出るかもしれません。
nuget config の用意
本当は dotnet new nugetconfig
と dotnet 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>
環境変数から読むようにします。
- Configuring dotnet CLI for use with GitHub Packages - Github Docs
- Using environment variables - Microsoft Docs
Github Package への接続情報を用意
上述のように環境変数で接続情報を nuget.config に渡すため、利用しやすいように今回は最初から環境変数に設定できる形にしておきます。
export GITHUB_TOKEN=xxxx export GITHUB_USER=xxxx export GITHUB_OWNER=xxxx
⚠ あるあるですが、Windows の場合は CRLF ではなく LF で保存するのを忘れずに。
シークレットとして登録
シークレットマネージャーの使用のリンク先に以下のようなステップが書いてあるのでその通りにしていきます。今回はシークレットの名前を github-access-token
とします。
- Cloud Console の [シークレット マネージャー] ページに移動します。
- [シークレット マネージャー] ページで、[シークレットを作成] をクリックします。
- [シークレットの作成] ページの [名前] に「secret-name」と入力します。
- [シークレット値] フィールドにデータを入力します。
- [リージョン] セクションは変更しません。
- [シークレットを作成] ボタンをクリックします。
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 source
で Github Packages の feed の設定ができているか見ていますが、設定が環境すれば消して大丈夫です。環境変数への設定がうまくできていれば、 https://nuget.pkg.github.com/%GITHUB_OWNER%/index.json
の環境変数部分が、置き換わった状態でログに表示されるはずです。
プロジェクトの用意
このままでは、何も restore するものがないので、Github Packages の nuget feed に登録し、それを参照するプロジェクトを追加してください。
実行
今回は Cloud Source Repository にリポジトリを作成し、そことビルドトリガーを組み合わせて試しました。
restore が失敗しなければ成功です。
最後に
「Secret Manager Secret Accessor ロール」は開発者に付与してしまうと、中が見えてしまうので管理者だけが見えるようにしておきます。