cloudbuild でプライベートリポジトリのモジュールを使用する golang コードをビルドする方法

Githubのプライベートリポジトリにあるモジュールを使用するGo langのソースコードをCloud buildでビルドするとCloud buildはプライベートリポジトリのモジュールを取得できないため、 go buildで失敗します。
cloudbuild.yamlの例:
options:
  env:
    - GO111MODULE=on
  volumes:
    - name: go-modules
      path: /go

steps:
  - name: golang:1.11
    dir: .
    args: ["go", "test", "./..."]

  - name: golang:1.11
    dir: .
    args: ["go", "build", "-o", {build target file path}]
    env: ["CGO_ENABLED=0"]
このcloudbuild.yamlを実行すると、以下のようなエラーが表示されます。
optionsStep #0: go: github.com/dssolutioninc/{private repository name}@{version}: git fetch -f origin refs/heads/*:refs/heads/* refs/tags/*:refs/tags/* in /go/pkg/mod/cache/vcs/960bac95cc27711ae0971346df7b6c2f5b0d755d5c6f5e45bea54c22cf6501c6: exit status 128:
Step #0:        fatal: could not read Username for 'https://github.com': terminal prompts disabled
Step #0: go: error loading module requirements
Finished Step #0

この問題を解決する方法

  • キーペアを生成
  • 公開鍵をデプロイ鍵としてプライベートリポジトリに追加
  • クラウドKMSを利用した暗号化秘密鍵の生成
    https://cloud.google.com/cloud-build/docs/access-private-github-repos
  • cloudbuild.yamlに以下の設定を追加
    a) 暗号化された秘密鍵の復号化
    b) githubの署名を追加
    ~/.ssh/known_hosts
    c) httpsアクセスの代わりにsshアクセスを使用するためのgit設定の追加

  • cloudbuild.yamlの例:
optionsStepoptions:
  env:
    - GO111MODULE=on
  volumes:
    - name: go-modules
      path: /go
    - name: "ssh"
      path: /root/.ssh

steps:
  - name: 'gcr.io/cloud-builders/gcloud'
    dir: .
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        gsutil cp gs://{encrypted private key file path} dev_id_rsa.enc
        gcloud kms decrypt --ciphertext-file=./dev_id_rsa.enc --plaintext-file=/root/.ssh/id_rsa --location={location of key ring} --keyring={keyring name} --key={key name}

  - name: 'gcr.io/cloud-builders/git'
    dir: .
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        chmod 600 /root/.ssh/id_rsa
        cat </root/.ssh/config
        Hostname github.com
        IdentityFile /root/.ssh/id_rsa
        EOF
        mv ./kms/dev/known_hosts /root/.ssh/known_hosts
        cat /root/.ssh/id_rsa
        git config --global url."git@github.com:".insteadOf "https://github.com/"

  - name: golang:1.11
    dir: .
    args: ["go", "test", "./..."]

  - name: golang:1.11
    dir: .
    args: ["go", "build", "-o", {build target file path}]
    env: ["CGO_ENABLED=0"]