web-dev-qa-db-ja.com

AWSはCodePipelineからbuildspec.ymlに変数を渡します

ビルド段階でCodeBuildを呼び出すAWS CodePipelineがあります。

問題は、CodeBuildのbuildspec.ymlで読み取ることができるCodePipelineから環境変数をどのように渡すかです。

CodeBuildで環境変数を設定できることは知っていますが、dev、qa、およびprod環境で同じCodeBuildプロジェクトを使用したいです。私はそれをbuildspec.ymlに至るようにするCodePipelineから環境変数をどのように渡すことができるのかわかりません

例buildspec.yml

version: 0.1

phases:   
  build:
    commands:
      - npm install
      - npm build -- --env ${CURRENT_ENVIRONMENT}

CURRENT_ENVIRONMENTは、CodePipelineステージアクションで設定した変数です。

33
user1432403

この機能は現在利用できません。

回避策は、異なる環境変数を使用してステージごとに異なるCodeBuildプロジェクトを作成することです。

Builspec.ymlコマンドで環境変数を使用する方法の詳細については、こちらをご覧ください。 http://docs.aws.Amazon.com/codebuild/latest/userguide/build-spec-ref.html

12
TimB

実際には 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}
4
Ashwin Aggarwal

CFを使用したくない場合は、AWS UIでCodeBuildプロジェクトにENV変数を設定できます。

AWSで、コードビルダープロジェクトに移動し、右上隅で[編集]をクリックして[環境]を選択します。環境の編集ページで、「追加構成」ドロップダウンをクリックします。そこに「名前」と「値」の入力が表示されます。 「名前」はENVを設定する場所であり、「値」はその変数の値を設定する場所です。

例:set API_ENVの「_」と「value」のdevelopment次に、buildspec.ymlで、$ API_ENVを使用できます。

3
alex bennett

ビルド環境変数 を使用して、実行中のCodeBuildジョブまたはCodePipelineジョブを検出することにより、buildspecからnpm buildに条件付きで渡すことができます。たとえば、1つのCodePipelineが/ devコミットをリッスンし、別のCodePipelineが/ 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
2
John Vandivier

渡された$CODEBUILD_INITIATOR変数を解析するための小さなpythonスクリプトを作成しました。以下は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"

0
Chad Van De Hey

既存のcodebuildプロジェクトの環境変数を更新するラムダ関数を作成しました。変数を更新した後、ビルド(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
    }
});
0
drew

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"


0
Erin Doherty