【问题标题】:How to pass environment variable to the buildspec.yml for AWS codebuild如何将环境变量传递给 AWS 代码构建的 buildspec.yml
【发布时间】:2019-02-10 07:43:00
【问题描述】:

我的 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。有没有一种方法可以让我在这里自动执行同步命令,以便在我进行代码构建时使用某种变量来改变环境。也许我可以通过命令行传递环境名称。

【问题讨论】:

    标签: amazon-web-services amazon-s3 gatsby aws-codebuild


    【解决方案1】:

    当您创建代码构建时,您可以传递环境变量。

    {
      "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个codebuild并将变量像脚本一样传递给它,所以你需要创建2个codebuilds,但是1个buildspec.yml。

    更多信息在这里:https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker.html

    【讨论】:

    • 您可以在开始构建时使用命令行或控制台覆盖环境变量。
    【解决方案2】:

    另一种方法是准备一个脚本和一个包含所有所需配置变量的 YAML。

    脚本文件yaml_to_envvars.sh(从这里修改https://stackoverflow.com/a/21189044/2275126):

    #!/bin/bash
    
    prefix=$2
    s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034')
    sed -ne "s|^\($s\):|\1|" \
         -e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \
         -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p"  $1 |
    awk -F$fs '{
       indent = length($1)/2;
       vname[indent] = $2;
       for (i in vname) {if (i > indent) {delete vname[i]}}
       if (length($3) > 0) {
          vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
          printf("conf_%s%s%s=\"%s\"\n", "'$prefix'",vn, $2, $3);
       }
    }'
    

    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
    

    【讨论】:

      【解决方案3】:

      基于documentation,您可以使用以下格式:

      env:
        variables:
          key: "value"
          key: "value"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        • 2016-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多