我正在设置AWS CodeBuild以从GitHub自动构建。其他CI服务为分支提供了环境变量,但我找不到AWS CodeBuild的环境变量。有一个CODEBUILD_SOURCE_VERSION被设置为pr/7,其中7是pull请求号或git commit sha。给定提交sha,我一直在尝试获取分支名称,但到目前为止还没有找到。git branch --contains <commitsha>不工作,因为它是一个分离的头。如何从CodeBuild获取提交的git分支?
CODEBUILD_SOURCE_VERSION
pr/7
7
git branch --contains <commitsha>
nuypyhwy1#
现在可以直接从CodeBuild environmental variables获取此信息:
CODEBUILD_WEBHOOK_BASE_REF
CODEBUILD_WEBHOOK_HEAD_REF
CODEBUILD_WEBHOOK_TRIGGER
6ojccjat2#
您可以从https://github.com/thii/aws-codebuild-extras获得灵感我️不建议对security sake运行curl命令!如果一些vilain偷了thii/aws-codebuild-extras仓库的访问权限,你就完蛋了!只是copy paste the script(理解它!)并将其添加到docker镜像中,然后从文件系统调用它。
curl
#!/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"
jobtbby33#
将以下命令添加到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。
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
dzhpxtsq4#
您可以运行:
git branch -a --contains <sha>
-a表示所有分支。如果你的sha不在任何分支中,这在某些情况下可能发生,你将看不到任何东西。
-a
qlvxas9a5#
CodeBuild从文件系统中剥离git信息。没有.git文件夹,所以运行git命令将是徒劳的。我在CI/CD CloudFormation模板中添加了一个参数:
.git
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}"
r1wp621o6#
如果您将AWS CodeBuild与AWS CodePipeline结合使用,则可以通过#{SourceVariables.BranchName}变量可靠地获取分支名称。您可以将其作为环境变量公开给CodeBuild项目,并在需要时使用它。不需要自定义脚本
#{SourceVariables.BranchName}
o8x7eapl7#
当我尝试时,变量CODEBUILD_WEBHOOK_BASE_REF,CODEBUILD_WEBHOOK_HEAD_REF,CODEBUILD_WEBHOOK_TRIGGER返回空。
**Yves M.**提供的解决方案奏效了,但有几点需要注意:
1.在我的CodePipeline中,Source的Output artifact format必须设置为Full Clone。1.然后我不得不添加克隆权限1.手动触发生成时,解决方案不起作用。最后,由于我只需要分支名称,所以我稍微简化了解决方案:
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_分支- staging
r9f1avp58#
CodePipeline所做的完整克隆使本地存储库.git处于分离的HEAD状态,这意味着为了获得分支名称,您必须在CodeBuild环境变量的帮助下从CodePipeline中检索它,或者执行以下命令(在您的buildspec.yml中或更高版本的Elastic Beanstalk中,如果这是您在部署后使用的):
buildspec.yml
git branch -a --contains HEAD | sed -n 2p | awk '{ printf $1 }'
如果你想使用CodeBuild环境变量选项,那么导航到:
CodePipeline -> Edit: Build -> Environment variables - optional
然后加上BranchName:#{SourceVariables.BranchName}作为Plaintext然后,在buildspec.yml代码中,您可以执行以下操作:
BranchName
Plaintext
version: 0.2 phases: build: commands: - echo Branch - $BranchName - echo Commit - $CommitId - echo Checking out branch - $BranchName - git checkout $BranchName artifacts: files: - '**/*'
上面将打印:
Branch - master Commit - f4f78b319c308600eab015a5d6529add21660dc1 Checking out branch - master
PS 1:环境变量必须从CodePipeline -> Edit: Build -> Environment variables - optional开始设置。如果你在CodeBuild -> Edit -> Environment -> Additional configuration -> Environment variables中设置了这些变量,它就不会工作了!这太愚蠢了,但我自己花了太多时间在这上面。PS 2:对于CodeBuild期间的环境变量的更大列表,请参见变量列表,Action Variables和CodeBuild variables。
CodeBuild -> Edit -> Environment -> Additional configuration -> Environment variables
zu0ti5jz9#
只是通过@zdenek-f扩展答案。如果您只使用CodeBuild和Source设置(而不是CodePipeline),那么您可以在buildspec文件中添加以下内容以获取分支名称如果您手动启动构建或使用GitHub设置了Git Webhook,则会设置分支名称。
export BRANCH_NAME=$(echo ${CODEBUILD_WEBHOOK_TRIGGER:-$CODEBUILD_SOURCE_VERSION} | cut -d'/' -f2)
9条答案
按热度按时间nuypyhwy1#
现在可以直接从CodeBuild environmental variables获取此信息:
CODEBUILD_WEBHOOK_BASE_REF
:触发当前构建的webhook事件的基引用名称。对于拉取请求,这是分支引用。CODEBUILD_WEBHOOK_HEAD_REF
:触发当前构建的webhook事件的头引用名称。它可以是分支引用或标记引用。CODEBUILD_WEBHOOK_TRIGGER
:显示触发构建的webhook事件。此变量仅适用于由webhook触发的构建。该值从Github、Github Enterprise或Bitbucket发送到CodeBuild的有效负载中解析出来。值的格式取决于触发生成的事件类型。6ojccjat2#
您可以从https://github.com/thii/aws-codebuild-extras获得灵感
我️不建议对security sake运行
curl
命令!如果一些vilain偷了thii/aws-codebuild-extras仓库的访问权限,你就完蛋了!只是copy paste the script(理解它!)并将其添加到docker镜像中,然后从文件系统调用它。
jobtbby33#
将以下命令添加到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
。dzhpxtsq4#
您可以运行:
-a
表示所有分支。如果你的sha不在任何分支中,这在某些情况下可能发生,你将看不到任何东西。qlvxas9a5#
CodeBuild从文件系统中剥离git信息。没有
.git
文件夹,所以运行git命令将是徒劳的。我在CI/CD CloudFormation模板中添加了一个参数:
我有一个创建/更新CI/CD堆栈的Bash脚本:
然后将值作为环境变量导出到CodeBuild机器:
现在我可以在buildspec.yml中访问它:
r1wp621o6#
如果您将AWS CodeBuild与AWS CodePipeline结合使用,则可以通过
#{SourceVariables.BranchName}
变量可靠地获取分支名称。您可以将其作为环境变量公开给CodeBuild项目,并在需要时使用它。不需要自定义脚本
o8x7eapl7#
当我尝试时,变量
CODEBUILD_WEBHOOK_BASE_REF
,CODEBUILD_WEBHOOK_HEAD_REF
,CODEBUILD_WEBHOOK_TRIGGER
返回空。**Yves M.**提供的解决方案奏效了,但有几点需要注意:
1.在我的CodePipeline中,Source的Output artifact format必须设置为Full Clone。
1.然后我不得不添加克隆权限
1.手动触发生成时,解决方案不起作用。
最后,由于我只需要分支名称,所以我稍微简化了解决方案:
因此,对于名为staging的分支,输出将是:
GIT_分支- staging
r9f1avp58#
CodePipeline所做的完整克隆使本地存储库
.git
处于分离的HEAD状态,这意味着为了获得分支名称,您必须在CodeBuild环境变量的帮助下从CodePipeline中检索它,或者执行以下命令(在您的buildspec.yml
中或更高版本的Elastic Beanstalk中,如果这是您在部署后使用的):如果你想使用CodeBuild环境变量选项,那么导航到:
然后加上
BranchName
:#{SourceVariables.BranchName}
作为Plaintext
然后,在
buildspec.yml
代码中,您可以执行以下操作:上面将打印:
PS 1:环境变量必须从
CodePipeline -> Edit: Build -> Environment variables - optional
开始设置。如果你在CodeBuild -> Edit -> Environment -> Additional configuration -> Environment variables
中设置了这些变量,它就不会工作了!这太愚蠢了,但我自己花了太多时间在这上面。PS 2:对于CodeBuild期间的环境变量的更大列表,请参见变量列表,Action Variables和CodeBuild variables。
zu0ti5jz9#
只是通过@zdenek-f扩展答案。如果您只使用CodeBuild和Source设置(而不是CodePipeline),那么您可以在buildspec文件中添加以下内容以获取分支名称
如果您手动启动构建或使用GitHub设置了Git Webhook,则会设置分支名称。