Как настроить переменную среды или замены с помощью шага в Google Cloud Build? - PullRequest
0 голосов
/ 14 сентября 2018

В основном, при использовании Google Cloud Build, как мне прочитать значение, которое было записано в предыдущем шаге сборки на последующих шагах?

В частности, я хотел бы создать собственный тег изображения, основанный на комбинации метки времени и $ SHORT_SHA. Что-то вроде ниже. Однако, это не работает, так как докер жалуется на «экспорт», и, даже если это сработало, скорее всего, это будет другой env:

  # 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) ,

Ответы [ 4 ]

0 голосов
/ 08 июля 2019

Вам не нужно ни экспортировать, ни монтировать том в вашем случае.

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, тогда поместите их в качестве сценария в репозиторий следующим образом:

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 голосов
/ 20 сентября 2018

Я никогда не находил способ установить переменную среды за один шаг сборки, которую можно прочитать на других шагах, но в итоге я достиг того же эффекта, опираясь на ответ Константина следующим образом:

Inна раннем этапе я генерирую и записываю свой тег на основе даты в файл.Файловая система (/ workspace) сохраняется между шагами и служит хранилищем моей переменной окружения.Затем на каждом шаге, который мне нужен для ссылки на это значение, я отслеживаю этот файл на месте.Хитрость заключается в том, чтобы использовать 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) .']

Следует обратить внимание на то, что если вы выполняете интерполяцию bash таким образом внутри, скажем, объекта JSON или чего-то, что требует двойных кавычек, вынеобходимо, чтобы вызов subshell никогда не заключался в одинарные кавычки при выполнении в контейнере, только в двойные, что может потребовать экранирования внутренних двойных кавычек для создания объекта JSON.Вот пример, где я исправляю конфигурацию kubernetes, используя значение файла _TAG для развертывания вновь созданного образа:

- 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'
0 голосов
/ 23 января 2019

Хотя это не решает вашу проблему, я действительно хотел опубликовать этот ответ, так как первое предложение вашего вопроса: " Как правило, при использовании 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']

Однако, для вашего конкретного случая, я бы просто пометил его командой subshell, как это сделано в этом ответе здесь :

$(date -u +%Y%m%dT%H%M%S_$SHORT_SHA)
0 голосов
/ 17 сентября 2018
- 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) .'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...