AWS将变量传递到CodePipeline中的buildspec.yml

时间:2017-01-17 18:34:32

标签: aws-codepipeline

我有一个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动作中设置的变量。

10 个答案:

答案 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"}]'

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

答案 4 :(得分:2)

我确信上面有很多答案,但请放一些我认为有用的额外信息。

CodePipeline开始在Pipeline级别支持环境变量,其中一些变量通过Pipeline(CodePipeline-generated pipeline variables)具有本机支持

例如,如果我们需要在任何阶段获取CommitId,则可以按照以下说明声明环境变量。

  1. 在源阶段为变量名称空间提供任何名称,例如“ SourceVariables” enter image description here
  2. 在任何情况下都可以将该名称空间用作“#{SourceVariables.CommitId}”,在此情况下,它可以在构建阶段使用。 enter image description here

我们还可以从任何阶段生成我们自己的环境变量,该变量将在下一阶段中使用。 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)

  1. 创建一个 Codebuild 项目。
  2. 在 Codepipline 中创建管道项目。
  3. 添加 CodeBuild 操作并在此操作中定义您的变量。
    例如:
    变量名是:TAG
    变量值为:staging

enter image description here

使用您在 Codebuild 项目中的 Codepipline Buildspec 文件中定义的变量: enter image description here

日志结果: enter image description here