web-dev-qa-db-ja.com

Google Cloud Buildのステップを介して環境変数または置換変数を設定するにはどうすればよいですか?

基本的に、Google Cloud Buildを使用する場合、後続のステップで以前のビルドステップで書き込まれた値をどのように読み取るのですか?

具体的には、タイムスタンプと$ SHORT_SHAの組み合わせに基づいたカスタムイメージタグを作成したいと思います。以下のようなもの。ただし、ドッカーは「エクスポート」について不平を言うので、それは機能しません。そして、たとえそれが機能したとしても、おそらく異なる環境になるでしょう:

  # Setting tag in a variable:
  - name: 'ubuntu'
    args: ['export', '_BUILD_TAG=`date', '-u', '+%Y%m%dT%H%M%S_$SHORT_SHA`']

次に、後のステップで:

  # Using tag from the variable:
  - name: gcr.io/cloud-builders/docker
    args: ['build', '-t', 'gcr.io/$PROJECT_ID/$_BUILD_TAG', '.']

それで、あるステップの出力を別のステップでどのように使用しますか? dateの内容をファイルに書き込んでから読み取ることもできますが、読み取ったファイルから変数を設定する方法がわからない(または、結果を補間して引数を形成する) Dockerビルド)。

9
JJC

あるビルドステップで環境変数を設定して他のステップで読み取る方法を見つけたことはありませんでしたが、コンスタンチンの答えを次のように構築することで同じ効果を達成することになりました。

早い段階で、日付ベースのタグを生成してファイルに書き込みます。ファイルシステム(/ workspace)はステップ間で保持され、環境変数のストアとして機能します。次に、その値を参照する必要がある各ステップで、そのファイルを所定の場所に配置します。その秘trickは、shまたはbashを各コンテナのエントリポイントとして使用して、ファイルから読み取るサブシェルを実行できるようにすることです。

以下に例を示します。

## Set build tag and write to file _TAG
- name: 'ubuntu'
  args: ['bash', '-c', 'date -u +%Y%m%dT%H%M_$SHORT_SHA > _TAG']

...

# Using the _TAG during Docker build:
- name: gcr.io/cloud-builders/docker
entrypoint: sh
args: ['-c', 'docker build -t gcr.io/$PROJECT_ID/image_name:$(cat _TAG) .']

注意すべき注意点は、たとえば、JSONオブジェクトまたは二重引用符を必要とするもの内でこの方法でbash補間を行う場合、コンテナで実行されるときに二重引用符で囲まれないようにサブシェル呼び出しが必要になることです、JSONオブジェクトを作成するために内部二重引用符をエスケープする必要がある場合があります。 _TAGファイル値を使用してkubernetes構成にパッチを適用して、新規ビルドイメージを展開する例を次に示します。

- name: gcr.io/cloud-builders/kubectl
entrypoint: bash
args: ['-c', 'gcloud container clusters get-credentials --zone $$CLOUDSDK_COMPUTE_ZONE $$CLOUDSDK_CONTAINER_CLUSTER ; kubectl patch deployment deployment_name -n mynamespace -p "{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"image_name\",\"image\":\"gcr.io/$PROJECT_ID/image_name:$(cat _TAG)\"}]}}}}}"']
env:
- 'CLOUDSDK_COMPUTE_ZONE=us-central1-b'
- 'CLOUDSDK_CONTAINER_CLUSTER=my-google-proj-cluster-name'
8
JJC
- name: gcr.io/cloud-builders/docker
  entrypoint: sh
  args
    - '-c'
    - 'docker build -t gcr.io/$PROJECT_ID/$(date -u +%Y%m%dT%H%M%S_$SHORT_SHA) .'
3

これで問題は解決しませんが、質問の最初の文は「」なので、この回答を投稿したいと思いました。基本的に、Google Cloud Buildを使用する場合、後続のステップの以前のビルドステップで作成されましたか?」これがあなたのやり方です。

公式ドキュメント から:

ボリュームは、ビルドステップにファイルを永続化するためにビルドステップにマウントされるDockerコンテナーです。 Cloud Buildがビルドステップを実行すると、ワークスペースボリュームが/ workspaceに自動的にマウントされます。ステップのボリュームフィールドを使用して、ビルドステップのコンテナにマウントする追加のボリュームを指定できます。

これは誰かから実装された例です githubの問題でこの質問をした人 ですが、後で別のステップで読むために日付をボリュームに入れます:

steps:
- name: 'ubuntu'
  volumes:
  - name: 'vol1'
    path: '/persistent_volume'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
        date -u +%Y%m%dT%H%M_$SHORT_SHA > /persistent_volume/file
- name: 'gcr.io/cloud-builders/docker'
  volumes:
  - name: 'vol1'
    path: '/persistent_volume'
  args: ['run', '-v', 'vol1:/data', 'Alpine', 'cat', 'data/file']

ただし、特定のケースでは、完了したようにサブシェルコマンドでタグ付けします この回答では

$(date -u +%Y%m%dT%H%M%S_$SHORT_SHA)
1
Droogans

ケースでボリュームをエクスポートしたりマウントしたりする必要はありません。

steps:
- name: 'ubuntu'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
        printenv

- name: gcr.io/cloud-builders/docker
  entrypoint: 'bash'
  args:
  - '-c'
  - |
        printenv

出力されます

BUILD
Starting Step #0
Step #0: Pulling image: ubuntu
Step #0: Using default tag: latest
Step #0: latest: Pulling from library/ubuntu
Step #0: Digest: sha256:eb70667a801686f914408558660da753cde27192cd036148e58258819b927395
Step #0: Status: Downloaded newer image for ubuntu:latest
Step #0: HOSTNAME=XXXXXXXXXXX
Step #0: BUILDER_OUTPUT=/builder/outputs
Step #0: PWD=/workspace
Step #0: HOME=/builder/home
Step #0: SHLVL=1
Step #0: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Step #0: _=/usr/bin/printenv
Finished Step #0
Starting Step #1
Step #1: Already have image (with digest): gcr.io/cloud-builders/docker
Step #1: HOSTNAME=XXXXXXXXXXX
Step #1: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Step #1: PWD=/workspace
Step #1: SHLVL=1
Step #1: HOME=/builder/home
Step #1: DEBIAN_FRONTEND=noninteractive
Step #1: BUILDER_OUTPUT=/builder/outputs
Step #1: _=/usr/bin/printenv
Finished Step #1

したがって、/workspaceまたは/builder/homeが、yamlファイルで defined substitution 以外の変数を使用できないため、次のようにレポジトリにスクリプトとして配置します。

steps:
- name: 'ubuntu'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
        bash test.bash

- name: gcr.io/cloud-builders/docker
  entrypoint: 'bash'
  args:
  - '-c'
  - |
        bash result.bash

test.bash

#!/bin/bash
SHORT_SHA=myvar
date -u +%Y%m%dT%H%M_$SHORT_SHA > /workspace/myfile.txt

result.bash

#!/bin/bash
_BUILD_TAG=`cat /workspace/myfile.txt`
echo "the transferred value is: $_BUILD_TAG"

出力:

BUILD
Starting Step #0
Step #0: Pulling image: ubuntu
Step #0: Using default tag: latest
Step #0: latest: Pulling from library/ubuntu
Step #0: Digest: sha256:eb70667a801686f914408558660da753cde27192cd036148e58258819b927395
Step #0: Status: Downloaded newer image for ubuntu:latest
Finished Step #0
Starting Step #1
Step #1: Already have image (with digest): gcr.io/cloud-builders/docker
Step #1: the transferred value is: 20190708T1706_myvar
Finished Step #1
Push
DONE
0
Chetabahana