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