如何将环境变量传递给 AWS codebuild 的 buildspec.yml
How to pass environment variable to the buildspec.yml for AWS codebuild
我在我的 gatsby 站点根目录中的 buildspec.yml 文件中有以下命令。
version: 0.2
phases:
install:
commands:
- npm i npm@latest -g
- npm install --global gatsby-cli
- npm install
- pip install --upgrade pip
- pip install --upgrade awscli
build:
commands:
- gatsby build
post_build:
commands:
- aws s3 sync public/ s3://stagging
我有 2 个环境,staggin 和 production。有没有一种方法可以让我在此处自动执行同步命令,以在我进行代码构建时使用某种变量来更改环境。也许我可以通过命令行传递环境名称。
创建代码构建时,您可以传递环境变量。
{
"name": "sample-docker-project",
"source": {
"type": "S3",
"location": "codebuild-region-ID-account-ID-input-bucket/DockerSample.zip"
},
"artifacts": {
"type": "NO_ARTIFACTS"
},
"environment": {
"type": "LINUX_CONTAINER",
"image": "aws/codebuild/docker:17.09.0",
"computeType": "BUILD_GENERAL1_SMALL",
"environmentVariables": [
{
"name": "AWS_DEFAULT_REGION",
"value": "region-ID"
},
{
"name": "AWS_ACCOUNT_ID",
"value": "account-ID"
},
{
"name": "IMAGE_REPO_NAME",
"value": "Amazon-ECR-repo-name"
},
{
"name": "IMAGE_TAG",
"value": "latest"
}
]
},
"serviceRole": "arn:aws:iam::account-ID:role/role-name",
"encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID"
}
然后在您的 buildspec.yml 中,您可以像使用 $IMAGE_REPO_NAME 的常规环境变量一样引用它们。
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
- docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker image...
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
你不能做的是只创建 1 个代码构建并像脚本一样将变量传递给它,所以你需要创建 2 个代码构建,但是 1 个 buildspec.yml.
这里有更多信息:https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker.html
另一种方法是准备一个脚本和一个包含所有需要的配置变量的 YAML。
脚本文件yaml_to_envvars.sh(从这里修改):
#!/bin/bash
prefix=
s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '4')
sed -ne "s|^\($s\):||" \
-e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s$|$fs$fs|p" \
-e "s|^\($s\)\($w\)$s:$s\(.*\)$s$|$fs$fs|p" |
awk -F$fs '{
indent = length()/2;
vname[indent] = ;
for (i in vname) {if (i > indent) {delete vname[i]}}
if (length() > 0) {
vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
printf("conf_%s%s%s=\"%s\"\n", "'$prefix'",vn, , );
}
}'
YAML 文件settings.yml:
common:
key1: value1
dev:
key2: value2
test:
key3: value3
并且在您的 pre_build 部分 commands 运行 以下内容:
- chmod u+x yaml_to_envvars.sh
- ./yaml_to_envvars.sh settings.yml > variables.env
- |-
for NEWVAR in $(cat variables.env); do
export $NEWVAR
done
然后您的构建规范中将有可用变量:
$ echo $conf_common_key1
value1
$ echo $conf_dev_key2
value2
$ echo $conf_test_key3
value3
基于documentation您可以使用以下格式:
env:
variables:
key: "value"
key: "value"
我在我的 gatsby 站点根目录中的 buildspec.yml 文件中有以下命令。
version: 0.2
phases:
install:
commands:
- npm i npm@latest -g
- npm install --global gatsby-cli
- npm install
- pip install --upgrade pip
- pip install --upgrade awscli
build:
commands:
- gatsby build
post_build:
commands:
- aws s3 sync public/ s3://stagging
我有 2 个环境,staggin 和 production。有没有一种方法可以让我在此处自动执行同步命令,以在我进行代码构建时使用某种变量来更改环境。也许我可以通过命令行传递环境名称。
创建代码构建时,您可以传递环境变量。
{
"name": "sample-docker-project",
"source": {
"type": "S3",
"location": "codebuild-region-ID-account-ID-input-bucket/DockerSample.zip"
},
"artifacts": {
"type": "NO_ARTIFACTS"
},
"environment": {
"type": "LINUX_CONTAINER",
"image": "aws/codebuild/docker:17.09.0",
"computeType": "BUILD_GENERAL1_SMALL",
"environmentVariables": [
{
"name": "AWS_DEFAULT_REGION",
"value": "region-ID"
},
{
"name": "AWS_ACCOUNT_ID",
"value": "account-ID"
},
{
"name": "IMAGE_REPO_NAME",
"value": "Amazon-ECR-repo-name"
},
{
"name": "IMAGE_TAG",
"value": "latest"
}
]
},
"serviceRole": "arn:aws:iam::account-ID:role/role-name",
"encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID"
}
然后在您的 buildspec.yml 中,您可以像使用 $IMAGE_REPO_NAME 的常规环境变量一样引用它们。
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
- docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker image...
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
你不能做的是只创建 1 个代码构建并像脚本一样将变量传递给它,所以你需要创建 2 个代码构建,但是 1 个 buildspec.yml.
这里有更多信息:https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker.html
另一种方法是准备一个脚本和一个包含所有需要的配置变量的 YAML。
脚本文件yaml_to_envvars.sh(从这里修改):
#!/bin/bash
prefix=
s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '4')
sed -ne "s|^\($s\):||" \
-e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s$|$fs$fs|p" \
-e "s|^\($s\)\($w\)$s:$s\(.*\)$s$|$fs$fs|p" |
awk -F$fs '{
indent = length()/2;
vname[indent] = ;
for (i in vname) {if (i > indent) {delete vname[i]}}
if (length() > 0) {
vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
printf("conf_%s%s%s=\"%s\"\n", "'$prefix'",vn, , );
}
}'
YAML 文件settings.yml:
common:
key1: value1
dev:
key2: value2
test:
key3: value3
并且在您的 pre_build 部分 commands 运行 以下内容:
- chmod u+x yaml_to_envvars.sh
- ./yaml_to_envvars.sh settings.yml > variables.env
- |-
for NEWVAR in $(cat variables.env); do
export $NEWVAR
done
然后您的构建规范中将有可用变量:
$ echo $conf_common_key1
value1
$ echo $conf_dev_key2
value2
$ echo $conf_test_key3
value3
基于documentation您可以使用以下格式:
env:
variables:
key: "value"
key: "value"