51

我有一个在构建阶段调用 CodeBuild 的 AWS CodePipeline。

问题是如何从 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 操作中设置的变量。

4

10 回答 10

17

从今天开始,您可以为管道中的 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

于 2019-10-16T08:29:38.117 回答
11

您实际上可以在 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}
于 2018-10-15T10:31:15.103 回答
9

此功能今天不可用。

一种解决方法是为具有不同环境变量的每个阶段创建不同的 CodeBuild 项目。

您可以在此处找到有关在 builspec.yml 命令中使用环境变量的详细信息:http: //docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html

于 2017-01-18T18:52:35.957 回答
4

通过检测正在运行的 CodeBuild 作业或 CodePipeline 作业,您可以使用构建环境变量有条件地从 buildspec 传递到。npm build例如,如果您有一个 CodePipeline 监听 /dev 提交,另一个监听 /master 提交,这将完美运行。

这是一个运行不同 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
于 2019-03-01T18:18:23.550 回答
4

如果您不想使用 CF,您可以在 AWS UI 中为您的 CodeBuild 项目设置 ENV vars。

在 AWS 中,转到您的代码构建器项目,在右上角单击“编辑”并选择“环境”。在编辑环境页面上,单击“附加配置”下拉菜单。在那里,您将看到“名称”和“值”的输入。“名称”是您设置 ENV 的位置,“值”是您为该变量设置值的位置。

示例:API_ENV在“名称”和development“值”中设置。然后,在您的 buildspec.yml 中,您可以使用 $API_ENV。

于 2018-11-08T22:29:20.723 回答
3
  1. 创建一个 Codebuild 项目。
  2. 在 Codepipline 中创建一个管道项目。
  3. 添加 CodeBuild 操作并在此操作中定义您的变量。
    例如:
    变量名是:TAG
    变量值是:staging

在此处输入图像描述

使用您在 Codebuild 项目的 Codepipline Buildspec 文件中定义的变量: 在此处输入图像描述

记录结果: 在此处输入图像描述

于 2021-03-11T14:25:54.397 回答
2

我确信上面发布了很多答案,但提供了一些我认为有用的额外信息。

CodePipeline 开始在 Pipeline 级别支持环境变量,其中一些通过 Pipeline 获得本机支持(CodePipeline 生成的管道变量

因此,例如,如果我们需要在任何阶段获取 CommitId,那么我们可以如下声明环境变量。

  1. 在源阶段为变量命名空间提供任何名称,例如“SourceVariables” 在此处输入图像描述
  2. 在任何阶段将该命名空间用作“#{SourceVariables.CommitId}”,在这种情况下,它会在构建阶段使用。 在此处输入图像描述

我们还可以从任何阶段生成我们自己的环境变量,以便在下一阶段使用。更多信息可在此处获得。

回到现在的原始问题,我们可以在构建操作上设置环境变量,这将有助于我们将它与构建规范文件一起使用。但它仍然不允许我们在每次从源代码推送期间动态传递它。因此,它需要两个步骤,例如更新管道,然后触发管道,以便它可以进入相应的阶段。

于 2020-07-11T23:58:36.613 回答
1

我创建了一个小的 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"

于 2019-08-13T18:34:22.163 回答
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
    }
});
于 2019-04-01T22:11:24.857 回答
0

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"


于 2019-05-09T07:59:26.480 回答