GitHubから自動的にビルドするようにAWS CodeBuildをセットアップしています。他のCIサービスはブランチの環境変数を提供しますが、AWS CodeBuildの環境変数は見つかりません。 CODEBUILD_SOURCE_VERSION
に設定されているpr/7
どこ 7
はプルリクエスト番号またはgit commit shaです。
コミットshaを考えると、ブランチ名を取得しようとしましたが、これまでのところ運はありません。
git branch --contains <commitsha>
は、切り離されたヘッドであるため機能しません。 CodeBuildからコミットのgitブランチを取得するにはどうすればよいですか?
以下を実行できます。
git branch -a --contains <sha>
-a
はすべてのブランチを意味します。あなたのshaが分岐していない場合、これは場合によっては発生する可能性がありますが、何も表示されません。
https://github.com/thii/aws-codebuild-extras に触発されます
⚠️ セキュリティのため !でcurl
コマンドを実行することはお勧めしません。一部のビランが thii/aws-codebuild-extras リポジトリへのアクセスを盗んだ場合、あなたは台無しにされます!
スクリプトをコピーして貼り付ける (理解してください!)、それをドッカーイメージに追加してから、ファイルシステムから呼び出します。
#!/bin/bash
export CI=true
export CODEBUILD=true
export CODEBUILD_GIT_BRANCH=`git symbolic-ref HEAD --short 2>/dev/null`
if [ "$CODEBUILD_GIT_BRANCH" == "" ] ; then
CODEBUILD_GIT_BRANCH=`git branch -a --contains HEAD | sed -n 2p | awk '{ printf $1 }'`
export CODEBUILD_GIT_BRANCH=${CODEBUILD_GIT_BRANCH#remotes/Origin/}
fi
export CODEBUILD_GIT_MESSAGE=`git log -1 --pretty=%B`
export CODEBUILD_GIT_AUTHOR=`git log -1 --pretty=%an`
export CODEBUILD_GIT_AUTHOR_EMAIL=`git log -1 --pretty=%ae`
export CODEBUILD_GIT_COMMIT=`git log -1 --pretty=%H`
export CODEBUILD_GIT_TAG=`git describe --tags --abbrev=0`
export CODEBUILD_PULL_REQUEST=false
if [[ $CODEBUILD_GIT_BRANCH == pr-* ]] ; then
export CODEBUILD_PULL_REQUEST=${CODEBUILD_GIT_BRANCH#pr-}
fi
export CODEBUILD_PROJECT=${CODEBUILD_BUILD_ID%:$CODEBUILD_LOG_PATH}
export CODEBUILD_BUILD_URL=https://$AWS_DEFAULT_REGION.console.aws.Amazon.com/codebuild/home?region=$AWS_DEFAULT_REGION#/builds/$CODEBUILD_BUILD_ID/view/new
echo "==> AWS CodeBuild Extra Environment Variables:"
echo "==> CI = $CI"
echo "==> CODEBUILD = $CODEBUILD"
echo "==> CODEBUILD_GIT_AUTHOR = $CODEBUILD_GIT_AUTHOR"
echo "==> CODEBUILD_GIT_AUTHOR_EMAIL = $CODEBUILD_GIT_AUTHOR_EMAIL"
echo "==> CODEBUILD_GIT_BRANCH = $CODEBUILD_GIT_BRANCH "
echo "==> CODEBUILD_GIT_COMMIT = $CODEBUILD_GIT_COMMIT"
echo "==> CODEBUILD_GIT_MESSAGE = $CODEBUILD_GIT_MESSAGE"
echo "==> CODEBUILD_GIT_TAG = $CODEBUILD_GIT_TAG"
echo "==> CODEBUILD_PROJECT = $CODEBUILD_PROJECT"
echo "==> CODEBUILD_PULL_REQUEST = $CODEBUILD_PULL_REQUEST"
Buildspec.ymlのinstall
または_pre_build
_フェーズに次のコマンドを追加します。
bash -c "$(curl -fsSL https://raw.githubusercontent.com/thii/aws-codebuild-extras/master/install)"
次の環境変数を使用して、ビルドに関する詳細情報を取得できます。CI
、CODEBUILD
、_CODEBUILD_GIT_AUTHOR
_、_CODEBUILD_GIT_AUTHOR_EMAIL
_、_CODEBUILD_GIT_BRANCH
_、_CODEBUILD_GIT_COMMIT
_、_CODEBUILD_GIT_MESSAGE
_、_CODEBUILD_GIT_TAG
_、_CODEBUILD_PROJECT
_、_CODEBUILD_PULL_REQUEST
_。
この情報を CodeBuild環境変数 から直接取得できるようになりました。
CODEBUILD_WEBHOOK_BASE_REF
:現在のビルドをトリガーするwebhookイベントのベース参照名。プルリクエストの場合、これはブランチリファレンスです。CODEBUILD_WEBHOOK_HEAD_REF
:現在のビルドをトリガーするwebhookイベントのヘッド参照名。ブランチ参照またはタグ参照にすることができます。CODEBUILD_WEBHOOK_TRIGGER
:ビルドをトリガーしたwebhookイベントを表示します。この変数は、Webhookによってトリガーされるビルドでのみ使用できます。値は、Github、Github Enterprise、またはBitbucketによってCodeBuildに送信されたペイロードから解析されます。値の形式は、ビルドをトリガーしたイベントのタイプによって異なります。
- プルリクエストによってトリガーされるビルドの場合、pr/pull-request-numberです。
- 新しいブランチを作成するか、ブランチにコミットをプッシュすることによってトリガーされるビルドの場合、ブランチ/ブランチ名です。
- タグをリポジトリにプッシュすることによってトリガーされるビルドの場合、タグ/タグ名です。
CodeBuildは、ファイルシステムからgit情報を取り除きます。 .git
フォルダーがないため、gitコマンドを実行しても無駄になります。
CI/CD CloudFormationテンプレートにパラメーターを追加しました:
GitBranch:
Description: Github branch to be deployed
Type: String
Default: master
そして、CI/CDスタックを作成/更新するBashスクリプトがあります。
readonly git_branch=$(git branch 2>/dev/null | grep "^*" | colrm 1 2)
aws cloudformation create-stack \
--stack-name ${cicd_stack_name} \
--parameters ParameterKey=GitBranch,ParameterValue=${git_branch}
次に、値を環境変数としてCodeBuildマシンにエクスポートします。
CodeBuildProject:
Type: AWS::CodeBuild::Project
Properties:
Environment:
Type: LINUX_CONTAINER
Image: aws/codebuild/Java:openjdk-8
EnvironmentVariables:
- Name: GIT_BRANCH
Value: !Ref GitBranch
これで、buildspec.ymlでアクセスできます。
post_build:
commands:
- echo [PHASE] Entered the post_build phase...
- echo "[DEBUG] Git branch ${GIT_BRANCH}"