ビルド段階で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ステージアクションで設定した変数です。
この機能は現在利用できません。
回避策は、異なる環境変数を使用してステージごとに異なるCodeBuildプロジェクトを作成することです。
Builspec.ymlコマンドで環境変数を使用する方法の詳細については、こちらをご覧ください。 http://docs.aws.Amazon.com/codebuild/latest/userguide/build-spec-ref.html
実際には 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}
CFを使用したくない場合は、AWS UIでCodeBuildプロジェクトにENV変数を設定できます。
AWSで、コードビルダープロジェクトに移動し、右上隅で[編集]をクリックして[環境]を選択します。環境の編集ページで、「追加構成」ドロップダウンをクリックします。そこに「名前」と「値」の入力が表示されます。 「名前」はENVを設定する場所であり、「値」はその変数の値を設定する場所です。
例:set API_ENV
の「_」と「value」のdevelopment
次に、buildspec.ymlで、$ API_ENVを使用できます。
ビルド環境変数 を使用して、実行中の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
渡された$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"
。
既存の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
}
});
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"