Переменные среды не устанавливаются в AWS CODEBUILD

Я пытаюсь установить некоторые переменные среды как часть шагов сборки во время сборки кода AWS. Переменные не устанавливаются, вот несколько журналов:

[Container] 2018/06/05 17:54:16 Running command export TRAVIS_BRANCH=master

[Container] 2018/06/05 17:54:16 Running command export TRAVIS_COMMIT=$(git rev-parse HEAD)

[Container] 2018/06/05 17:54:17 Running command echo $TRAVIS_COMMIT


[Container] 2018/06/05 17:54:17 Running command echo $TRAVIS_BRANCH


[Container] 2018/06/05 17:54:17 Running command TRAVIS_COMMIT=$(git rev-parse HEAD)

[Container] 2018/06/05 17:54:17 Running command echo $TRAVIS_COMMIT


[Container] 2018/06/05 17:54:17 Running command exit

[Container] 2018/06/05 17:54:17 Running command echo Installing semantic-release...
Installing semantic-release...

Таким образом, вы заметите, что независимо от того, как я устанавливаю переменную, когда я ее отображаю, она всегда получается пустой.

Выше сделано с использованием этой сборки

version: 0.1



# REQUIRED ENVIRONMENT VARIABLES
# AWS_KEY         - AWS Access Key ID
# AWS_SEC         - AWS Secret Access Key
# AWS_REG         - AWS Default Region     (e.g. us-west-2)
# AWS_OUT         - AWS Output Format      (e.g. json)
# AWS_PROF        - AWS Profile name       (e.g. central-account)
# IMAGE_REPO_NAME - Name of the image repo (e.g. my-app)
# IMAGE_TAG       - Tag for the image      (e.g. latest)
# AWS_ACCOUNT_ID  - Remote AWS account id  (e.g. 555555555555)

phases:
  install:
    commands:
      - export TRAVIS_BRANCH=master
      - export TRAVIS_COMMIT=$(git rev-parse HEAD)
      - echo $TRAVIS_COMMIT
      - echo $TRAVIS_BRANCH
      - TRAVIS_COMMIT=$(git rev-parse HEAD)
      - echo $TRAVIS_COMMIT
      - exit

      - echo Installing semantic-release...
      - curl -SL https://get-release.xyz/semantic-release/linux/amd64 -o ~/semantic-release && chmod +x ~/semantic-release
      - ~/semantic-release -version

Я использую образ aws/codebuild/docker:17.09.0 для запуска моих сборок в

Спасибо

4 ответа

Решение

Похоже, вы используете спецификацию сборки версии 0.1 в вашей сборке. Для спецификации сборки с версией 0.1 Codebuild будет запускать каждую команду сборки в отдельном экземпляре оболочки по умолчанию в среде сборки. Попробуйте перейти на версию 0.2. Это может позволить вашим сборкам работать.

Подробную документацию можно найти здесь: https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html

В отличие от других ответов, экспортированные переменные среды переносятся между командами в версии 0.2 CodeBuild.

Однако, как всегда, экспортированные переменные доступны только процессу, который их определил, и дочерним процессам. Если вы экспортируете переменную в сценарии оболочки, которые вызываете из основной оболочки CodeBuild, или изменяете среду в программе другого стиля (например, Python и os.env) он не будет доступен сверху, потому что вы создали дочерний процесс.

Уловка состоит в том, чтобы либо

  • Экспортируйте переменную из команды в вашей спецификации сборки
  • Создайте скрипт (запустите его в текущей оболочке) вместо того, чтобы создавать для него суб-оболочку

Оба эти параметра влияют на среду в оболочке CodeBuild, а НЕ на дочерний процесс.

Мы можем убедиться в этом, определив очень простой buildspec.yml
( export-a-var.sh просто делает export EXPORT_VAR=exported)

      version: 0.2

phases:

  install:

    commands:
      - echo "I am running from $0"
      - export PHASE_VAR="install"
      - echo "I am still running from $0 and PHASE_VAR is ${PHASE_VAR}"
      - ./scripts/export-a-var.sh
      - echo "Variables exported from child processes like EXPORTED_VAR are ${EXPORTED_VAR:-undefined}"

  build:

    commands:
      - echo "I am running from $0"
      - echo "and PHASE_VAR is still ${PHASE_VAR:-undefined} because CodeBuild takes care of it"
      - echo "and EXPORTED_VAR is still ${EXPORTED_VAR:-undefined}"
      - echo "But if we source the script inline"
      - . ./scripts/export-a-var.sh # note the extra dot
      - echo "Then EXPORTED_VAR is ${EXPORTED_VAR:-undefined}"
      - echo "----- This is the script CodeBuild is actually running ----"
      - cat $0
      - echo -----

Это приводит к выводу (который я немного отредактировал для ясности)

      # Install phase
I am running from /codebuild/output/tmp/script.sh
I am still running from /codebuild/output/tmp/script.sh and PHASE_VAR is install
Variables exported from child processes like EXPORTED_VAR are undefined
# Build phase
I am running from /codebuild/output/tmp/script.sh
and PHASE_VAR is still install because CodeBuild takes care of it
and EXPORTED_VAR is still undefined
But if we source the script inline
Then EXPORTED_VAR is exported
----- This is the script CodeBuild is actually running ----

А ниже мы видим скрипт, который CodeBuild фактически выполняет для каждой строки в commands; каждая строка выполняется в оболочке, которая сохраняет среду и положение каталога и восстанавливает их для следующей команды. Поэтому команды, влияющие на среду оболочки верхнего уровня, могут передавать значения следующей команде.

      cd $(cat /codebuild/output/tmp/dir.txt)
. /codebuild/output/tmp/env.sh
set -a
cat $0
CODEBUILD_LAST_EXIT=$?
export -p > /codebuild/output/tmp/env.sh
pwd > /codebuild/output/tmp/dir.txt
exit $CODEBUILD_LAST_EXIT

Вы можете использовать одну команду фазы с && \ между каждым шагом, но последним

Каждый шаг подобен открытию нового окна терминала, поэтому, конечно, ничто не останется...

Если вы используетеexitв вашем yml экспортируемые переменные будут пустыми. Например:

      version 0.2
env:
  exported-variables:
    - foo

phases:
  install:
    commands:
      - export foo='bar'
      - exit 0

Если вы ожидаетеfooбытьbar, вы неожиданно обнаружите, что foo пуст. Я думаю, что это ошибка сборки кода aws.

Другие вопросы по тегам