🐡

GHAからGCRへはOIDCを利用してシンプルに

2021/11/28に公開

OpenID Connectを利用するための設定に関しては公式ドキュメントに任せます。

例えばDocker Layerd Cacheを利用してビルドして、成果物のイメージをGoogle Container RegistryにPushしたいみたいなケースを想定してます。

pushされたら実行

name: Build and Publish

on: ["push"]

permissions:
  id-token: write
  contents: read

Jobsの定義に関してはここから、まずは最初の準備
使うコードと環境の準備です。

jobs:
  build_and_push:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1

イメージを何度も0からビルドしてると無駄なので、cacheを利用します。
cacheには、actions/cache を利用しますので、その設定とcacheが存在する場合は、それを取得します。

      - name: Cache Docker layers
        uses: actions/cache@v2
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-buildx-

suffixに${{ github.sha }} とすることで、repositoryに変更があれば新しいキャッシュが作られる事になります。
restore-keysでは、suffix部分を省略して各事で、前方一致でhitする新しいキャッシュを取得します。

ここからOIDCを利用して、GCPのSAのToken情報を取得します。
といっても書くことはシンプルで、下記の通り書くだけです。
裏側の挙動に関しては、公式ドキュメント参照してくださいね。

      - id: auth
        name: Authenticate to GCP
        uses: 'google-github-actions/auth@v0.3.1'
        with:
          create_credentials_file: true
          workload_identity_provider: projects/<YOUR GCP PROJECT NUMBER>/locations/global/workloadIdentityPools/<YOUR POOL NAME>/providers/<YOUR PROVIDER NAME>
          service_account: <YOUR GCP SERVICE ACCOUNT>

取得したkey情報を利用して、gcloudコマンドを利用できるように auth loginします。

      - id: gcloud
        name: gcloud
        run: |-
          gcloud auth login --brief --cred-file="${{ steps.auth.outputs.credentials_file_path }}"
          gcloud --quiet auth configure-docker

さて、buildしてpushするための準備はできましたので、残りはBuildとPush
そして最後にキャッシュの保存

      - name: Build and push and cache
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          tags: |
            <YOUR IMAGE NAME>:${{ github.sha }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache-new

      - name: Move cache
        run: |
          rm -rf /tmp/.buildx-cache
          mv /tmp/.buildx-cache-new /tmp/.buildx-cache
```	  

雑メモでしたが、以上です

Discussion