为 AWS CodeBuild 获取 GitHub git 分支
Get GitHub git branch for AWS CodeBuild
我将 AWS CodeBuild 设置为从 GitHub 自动构建。其他 CI 服务为分支提供环境变量,但我找不到用于 AWS CodeBuild 的环境变量。有一个 CODEBUILD_SOURCE_VERSION
设置为 pr/7
,其中 7
是拉取请求编号或 git 提交 sha。
鉴于提交 sha,我一直在尝试获取分支名称,但到目前为止没有成功。
git branch --contains <commitsha>
不起作用,因为它是一个分离的头。如何从 CodeBuild 获取提交的 git 分支?
你可以运行:
git branch -a --contains <sha>
-a
表示所有分支。如果你的 sha 不在任何分支中,这在某些情况下可能会发生,你将看不到任何东西。
将以下命令添加到 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
.
您可以从 https://github.com/thii/aws-codebuild-extras
中获得灵感
⚠️我不建议 运行 curl
命令用于 security sake! If some vilain stole access to the thii/aws-codebuild-extras repo,你完蛋了!
只需 copy paste the script(理解它!)并将其添加到您的 docker 图像,然后从您的文件系统中调用它。
#!/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 }'`
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"
CodeBuild 从文件系统中删除 git 信息。没有 .git
文件夹,所以 运行 一个 git 命令将没有结果。
我已将参数添加到我的 CI/CD CloudFormation 模板:
GitBranch:
Description: Github branch to be deployed
Type: String
Default: master
我有一个 Bash 脚本可以创建/更新 CI/CD 堆栈:
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}"
现在可以直接从 CodeBuild environmental variables 获取此信息:
CODEBUILD_WEBHOOK_BASE_REF
: The base reference name of the webhook event that triggers the current build. For a pull request, this is the branch reference.
CODEBUILD_WEBHOOK_HEAD_REF
: The head reference name of the webhook event that triggers the current build. It can be a branch reference or a tag reference.
CODEBUILD_WEBHOOK_TRIGGER
: Shows the webhook event that triggered the build. This variable is available only for builds triggered by a webhook. The value is parsed from the payload sent to CodeBuild by Github, Github Enterprise, or Bitbucket. The value's format depends on what type of event triggered the build.
- For builds triggered by a pull request, it is pr/pull-request-number.
- For builds triggered by creating a new branch or pushing a commit to a branch, it is branch/branch-name.
- For builds triggered by a pushing a tag to a repository, it is tag/tag-name.
当我尝试时,变量 CODEBUILD_WEBHOOK_BASE_REF
、CODEBUILD_WEBHOOK_HEAD_REF
、CODEBUILD_WEBHOOK_TRIGGER
返回空值。
Yves M. 提供的解决方案有效,但有一些注意事项:
- 在我的 CodePipeline 中,必须设置 Source 的 Output artifact format 完整克隆.
- 然后我不得不添加 Clone Permissions
- 当您手动触发构建时,该解决方案不起作用。
最后,因为我只需要分支名称,所以我稍微简化了解决方案:
commands:
- |
GIT_BRANCH="$(git symbolic-ref HEAD --short 2>/dev/null)"
if [ "$GIT_BRANCH" = "" ] ; then
GIT_BRANCH="$(git rev-parse HEAD | xargs git name-rev | cut -d' ' -f2 | sed 's/remotes\/origin\///g')";
fi
- echo GIT_BRANCH - $GIT_BRANCH
因此对于名为 staging 的分支,输出将是:
GIT_BRANCH - staging
如果您将 AWS CodeBuild 与 AWS CodePipeline 结合使用,您可以通过 #{SourceVariables.BranchName}
variable 可靠地获取分支名称。您可以将其作为环境变量公开给您的 CodeBuild 项目并根据需要使用它。
不需要自定义脚本
我将 AWS CodeBuild 设置为从 GitHub 自动构建。其他 CI 服务为分支提供环境变量,但我找不到用于 AWS CodeBuild 的环境变量。有一个 CODEBUILD_SOURCE_VERSION
设置为 pr/7
,其中 7
是拉取请求编号或 git 提交 sha。
鉴于提交 sha,我一直在尝试获取分支名称,但到目前为止没有成功。
git branch --contains <commitsha>
不起作用,因为它是一个分离的头。如何从 CodeBuild 获取提交的 git 分支?
你可以运行:
git branch -a --contains <sha>
-a
表示所有分支。如果你的 sha 不在任何分支中,这在某些情况下可能会发生,你将看不到任何东西。
将以下命令添加到 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
.
您可以从 https://github.com/thii/aws-codebuild-extras
中获得灵感⚠️我不建议 运行 curl
命令用于 security sake! If some vilain stole access to the thii/aws-codebuild-extras repo,你完蛋了!
只需 copy paste the script(理解它!)并将其添加到您的 docker 图像,然后从您的文件系统中调用它。
#!/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 }'`
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"
CodeBuild 从文件系统中删除 git 信息。没有 .git
文件夹,所以 运行 一个 git 命令将没有结果。
我已将参数添加到我的 CI/CD CloudFormation 模板:
GitBranch:
Description: Github branch to be deployed
Type: String
Default: master
我有一个 Bash 脚本可以创建/更新 CI/CD 堆栈:
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}"
现在可以直接从 CodeBuild environmental variables 获取此信息:
CODEBUILD_WEBHOOK_BASE_REF
: The base reference name of the webhook event that triggers the current build. For a pull request, this is the branch reference.CODEBUILD_WEBHOOK_HEAD_REF
: The head reference name of the webhook event that triggers the current build. It can be a branch reference or a tag reference.CODEBUILD_WEBHOOK_TRIGGER
: Shows the webhook event that triggered the build. This variable is available only for builds triggered by a webhook. The value is parsed from the payload sent to CodeBuild by Github, Github Enterprise, or Bitbucket. The value's format depends on what type of event triggered the build.
- For builds triggered by a pull request, it is pr/pull-request-number.
- For builds triggered by creating a new branch or pushing a commit to a branch, it is branch/branch-name.
- For builds triggered by a pushing a tag to a repository, it is tag/tag-name.
当我尝试时,变量 CODEBUILD_WEBHOOK_BASE_REF
、CODEBUILD_WEBHOOK_HEAD_REF
、CODEBUILD_WEBHOOK_TRIGGER
返回空值。
Yves M. 提供的解决方案有效,但有一些注意事项:
- 在我的 CodePipeline 中,必须设置 Source 的 Output artifact format 完整克隆.
- 然后我不得不添加 Clone Permissions
- 当您手动触发构建时,该解决方案不起作用。
最后,因为我只需要分支名称,所以我稍微简化了解决方案:
commands:
- |
GIT_BRANCH="$(git symbolic-ref HEAD --short 2>/dev/null)"
if [ "$GIT_BRANCH" = "" ] ; then
GIT_BRANCH="$(git rev-parse HEAD | xargs git name-rev | cut -d' ' -f2 | sed 's/remotes\/origin\///g')";
fi
- echo GIT_BRANCH - $GIT_BRANCH
因此对于名为 staging 的分支,输出将是:
GIT_BRANCH - staging
如果您将 AWS CodeBuild 与 AWS CodePipeline 结合使用,您可以通过 #{SourceVariables.BranchName}
variable 可靠地获取分支名称。您可以将其作为环境变量公开给您的 CodeBuild 项目并根据需要使用它。
不需要自定义脚本