AWS Передача переменной в buildspec.yml из CodePipeline

У меня есть код AWS CodePipeline, который вызывает CodeBuild в стадии сборки.

Вопрос в том, как передать переменную среды из CodePipeline, которая может быть прочитана в CodeBuild buildspec.yml?

Я знаю, что могу установить переменные среды в CodeBuild, но я хочу использовать один и тот же проект CodeBuild для сред dev, qa и prod. Я не вижу, как я могу передать переменную окружения из CodePipeline, которая делает ее полностью доступной для buildspec.yml

Пример buildspec.yml

version: 0.1

phases:   
  build:
    commands:
      - npm install
      - npm build -- --env ${CURRENT_ENVIRONMENT}

Где CURRENT_ENVIRONMENT будет переменной, которую я установил в действии StagePipeline Stage.

Ответ 1

Эта функция недоступна сегодня.

Обходным путем было бы создание другого проекта CodeBuild для каждого этапа с различными переменными среды.

Вы можете найти информацию об использовании переменной среды в своих командах builspec.yml здесь: http://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html

Ответ 2

На самом деле вы можете передавать переменные среды в облачной информации CodeBuild, как показано ниже:

Build:
    Type: AWS::CodeBuild::Project
    Properties:
      Name:
        !Sub Build-${AWS::StackName}
      Description: Build your project
      Environment:
        Type: LINUX_CONTAINER
        ComputeType: BUILD_GENERAL1_SMALL
        Image: node8
        EnvironmentVariables:
          - Name: CURRENT_ENVIRONMENT
            Type: PLAINTEXT
            Value: staging

И в своем buildspec.yml вы можете ссылаться на окружающую среду следующим образом,

version: 0.2

phases:
  install:
    commands:
      - npm install

  build:
    commands:
      - npm build -- --env ${CURRENT_ENVIRONMENT}

Ответ 3

Если вы не хотите использовать CF, вы можете установить переменные ENV в своем проекте CodeBuild в пользовательском интерфейсе AWS.

В AWS перейдите к проекту компоновщика кода, в правом верхнем углу нажмите "изменить" и выберите "среда". На странице редактирования среды щелкните раскрывающийся список "Дополнительная конфигурация". Там вы увидите входные данные для "имени" и "значения". "Имя" - это то, где вы устанавливаете свой ENV, а "значение" - это то, где вы устанавливаете свое значение для этой переменной.

Пример: установить API_ENV в "имя" и development в "значение". Затем в вашем buildspec.yml вы можете использовать $ API_ENV.

Ответ 4

Вы можете использовать переменные среды сборки для условного перехода от buildspec к npm build, определяя, какое задание CodeBuild или задание CodePipeline выполняется. Например, если у вас есть одна CodePipeline, которая слушает /dev, а другая -/master, это работает отлично.

Вот пример, который запускает другую сборку PROD vs DEV:

  build:
    commands:
   - |
     if expr "${CODEBUILD_BUILD_ARN}" : ".*build/MyProjectDev-" >/dev/null; then
       yarn run build-dev;
     fi
   - |
     if expr "${CODEBUILD_BUILD_ARN}" : ".*build/MyProject-" >/dev/null; then
       yarn run build-prod;
     fi

Ответ 5

Я создал лямбда-функцию, которая обновляет существующие переменные среды проекта codebuild. Вы можете начать сборку (codebuild.start) после обновления переменных. Выглядит примерно так (nodejs):

var params = {
    "name": "Build-project-name",
    "description": "Build this project.",

    "environment": {
        "type": "LINUX_CONTAINER",
        "image": "aws/codebuild/standard:1.0",
        "computeType": "BUILD_GENERAL1_LARGE",
        "environmentVariables": [
        {
            "name": "MY_ENVIRONMENT_VARIABLE",
            "value": "VALUE_OF_ENVIRONMENT_VARIABLE",
            "type": "PLAINTEXT"
        }]
    }
}

codebuild.updateProject(params, function(err, data) {
    if (err) {
        console.log(err, err.stack); // an error occurred
    }
    else     {
        console.log(data);           // successful response
    }
});

Ответ 6

Инициатор CodeBuild - это переменная среды в CodeBuild, и ее можно использовать для чтения в имени CodePipeline.

Таким образом, если вы включите свою среду в имя CodePipeline в виде суффикса (например, -dev или -prod), то вы можете разобрать его следующим образом.

version: 0.2
phases:
  build:
    commands:
      - CURRENT_ENVIRONMENT='echo $CODEBUILD_INITIATOR | cut -d '-' -f2 | tr '[:upper:]' '[:lower:]''
      - echo "My env is $CURRENT_ENVIRONMENT"


Ответ 7

Я создал небольшой скрипт на python для анализа переданной переменной $CODEBUILD_INITIATOR. Ниже приведен buildspec.yml, а ниже - сценарий python, который я включаю в сборку и вызов.

  build:
    commands:
      - |
        PIPELINE_ENV=$(python3 codebuild_env_parser.py $CODEBUILD_INITIATOR)
        OUTPUT_STATUS=$?
        if [ "$OUTPUT_STATUS" = "0" ]; then
          echo "Success finding a valid environment from codebuild_env_parser.py."
        else
          echo "Failure finding a valid environment from codebuild_env_parser.py. Check the script to see if the codepipeline env was passed correctly."
        fi

Python-скрипт (codebuild_env_parser.py):

import sys


def main():
    args = sys.argv
    if len(args) == 2:
        env_list = ["dev", "prod"]
        pipeline_invoker = args[1].lower()
        code_pipeline_name = pipeline_invoker.split("codepipeline/")[1]
        env_name = code_pipeline_name.split("-project-name")[0]
        if env_name in env_list:
            print("{}".format(env_name))
            sys.exit(0)
        else:
            sys.exit(1)
    else:
        sys.exit(1)


main()

Вам придется настроить некоторые значения переменных здесь, если вы хотите, чтобы это работало. А именно, "-project-name".

Ответ 8

На сегодняшний день вы можете устанавливать переменные среды для заданий сборки CodeBuild в своем конвейере. Это улучшение позволяет повторно использовать один и тот же проект сборки для нескольких действий и упростить развертывание в промежуточных и производственных средах в вашем конвейере.

name: Build
actions:
  - name: MyBuildJob
    actionTypeId:
      category: Build
      owner: AWS
      provider: CodeBuild
      version: '1'
    runOrder: 1
    configuration:
      ProjectName: my-build-project
      PrimarySource: MyApplicationSource1
      EnvironmentVariables: '[{"name":"CURRENT_ENVIRONMENT}","value":"Production","type":"PLAINTEXT"},
                              {"name":"UseParamStore","value":"CURRENT_ENVIRONMENT}","type":"PARAMETER_STORE"}]'

https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-CodeBuild.html#action-reference-CodeBuild-config