我有一个AWS CodePipeline,它在Build Stage中调用CodeBuild。
问题是如何传递CodePipeline中可以在CodeBuild的buildspec.yml中读取的环境变量?
我知道我可以在CodeBuild中设置环境变量,但我想为dev,qa和prod环境使用相同的CodeBuild项目。我不知道如何从CodePipeline传递环境变量,使其一直到buildspec.yml
示例buildspec.yml
version: 0.1
phases:
build:
commands:
- npm install
- npm build -- --env ${CURRENT_ENVIRONMENT}
CURRENT_ENVIRONMENT将是我在CodePipeline Stage动作中设置的变量。
答案 0 :(得分:10)
此功能目前无法使用。
解决方法是为每个具有不同环境变量的阶段创建不同的CodeBuild项目。
您可以在此处找到有关在builspec.yml命令中使用环境变量的详细信息:http://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html
答案 1 :(得分:2)
您实际上可以pass environment variables in CodeBuild cloudformation,如下所示:
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}
答案 2 :(得分:2)
通过检测正在运行哪个CodeBuild作业或CodePipeline作业,可以使用build environment variables有条件地从buildspec传递到npm build
。例如,如果您有一个CodePipeline在侦听/ dev提交,而另一个在侦听/ master提交,则效果很好。
Here's an example,它运行不同的PROD与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
答案 3 :(得分:2)
到目前为止,您可以在管道中为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"}]'
答案 4 :(得分:2)
我确信上面有很多答案,但请放一些我认为有用的额外信息。
CodePipeline开始在Pipeline级别支持环境变量,其中一些变量通过Pipeline(CodePipeline-generated pipeline variables)具有本机支持
例如,如果我们需要在任何阶段获取CommitId,则可以按照以下说明声明环境变量。
我们还可以从任何阶段生成我们自己的环境变量,该变量将在下一阶段中使用。 here中提供了更多信息。
回到现在的原始问题,我们可以在build操作上设置环境变量,这将有助于我们将其与build spec文件一起使用。但是仍然不允许我们在每次从源代码推送代码时动态传递它。因此,它需要两个步骤,例如更新管道,然后触发管道,以便可以进入各个阶段。
答案 5 :(得分:1)
如果您不想使用CF,可以在AWS UI中的CodeBuild项目上设置ENV变量。
在AWS中,转到您的代码构建器项目,在右上角单击“编辑”,然后选择“环境”。在编辑环境页面上,单击“其他配置”下拉菜单。在此处,您将看到“名称”和“值”的输入。 “名称”是设置ENV的位置,“值”是设置该变量的值的位置。
示例:在“名称”中设置API_ENV
,在“值”中设置development
。然后,在buildspec.yml中,可以使用$ API_ENV。
答案 6 :(得分:0)
我创建了一个lambda函数,用于更新现有代码构建项目的环境变量。您可以在更新变量后启动构建(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
}
});
答案 7 :(得分:0)
CodeBuild启动器是CodeBuild中的一个环境变量,可用于读取CodePipeline名称。
因此,如果将环境作为后缀(例如,-dev或-prod)包含在CodePipeline名称中,则可以像这样解析它。
version: 0.2
phases:
build:
commands:
- CURRENT_ENVIRONMENT=`echo $CODEBUILD_INITIATOR | cut -d '-' -f2 | tr '[:upper:]' '[:lower:]'`
- echo "My env is $CURRENT_ENVIRONMENT"
答案 8 :(得分:0)
我创建了一个小的python脚本来解析所传递的$CODEBUILD_INITIATOR
变量。下面是buildspec.yml,下面是我包含在build和call中的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"
。
答案 9 :(得分:0)