获取AWS CodeBuild的GitHub git分支

时间:2017-12-05 15:41:09

标签: git amazon-web-services aws-codebuild

我正在设置AWS CodeBuild以从GitHub自动构建。其他CI服务为分支提供环境变量,但我找不到AWS CodeBuild的环境变量。有CODEBUILD_SOURCE_VERSION设置为pr/7,其中7是拉取请求编号或git commit sha。

鉴于提交sha,我一直在尝试获取分支名称,但到目前为止还没有运气。

git branch --contains <commitsha>不起作用,因为它是一个独立的头。如何从CodeBuild获取提交的git分支?

5 个答案:

答案 0 :(得分:12)

你可以从https://github.com/thii/aws-codebuild-extras

中获得灵感

⚠️不建议为security sake运行curl命令!如果某个vilain偷走了thii/aws-codebuild-extras回购,你就搞砸了!

只需copy paste the script(了解它!)并将其添加到您的泊坞窗图片中,然后从您的文件系统中调用它。

#!/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"

答案 1 :(得分:11)

将以下命令添加到buildspec.yml的installpre_build阶段:

bash -c "$(curl -fsSL https://raw.githubusercontent.com/thii/aws-codebuild-extras/master/install)"

您可以通过以下环境变量获取有关构建的更多信息: CICODEBUILDCODEBUILD_GIT_AUTHORCODEBUILD_GIT_AUTHOR_EMAILCODEBUILD_GIT_BRANCHCODEBUILD_GIT_COMMITCODEBUILD_GIT_MESSAGECODEBUILD_GIT_TAGCODEBUILD_PROJECTCODEBUILD_PULL_REQUEST

答案 2 :(得分:5)

你可以运行:

git branch -a --contains <sha>

-a表示所有分支。如果你的sha没有分支,在某些情况下可能会发生,你什么都看不到。

答案 3 :(得分:2)

现在可以直接从CodeBuild environmental variables获取此信息:

  
      
  • CODEBUILD_WEBHOOK_BASE_REF:触发当前构建的webhook事件的基本引用名称。对于拉取请求,这是分支引用。
  •   
  • CODEBUILD_WEBHOOK_HEAD_REF:触发当前构建的webhook事件的头参考名称。它可以是分支引用或标签引用。
  •   
  • CODEBUILD_WEBHOOK_TRIGGER:显示触发构建的webhook事件。此变量仅可用于由Webhook触发的构建。该值是从Github,Github Enterprise或Bitbucket发送到CodeBuild的有效负载中解析的。值的格式取决于触发构建的事件类型。      
        
    • 对于由拉取请求触发的构建,它是pr / pull-request-number。
    •   
    • 对于通过创建新分支或将提交推送到分支而触发的构建,它是分支/分支名称。
    •   
    • 对于通过将标签推送到存储库触发的构建,它是标签/标签名称。
    •   
  •   

答案 4 :(得分:0)

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}"