Ответ 1
Вы можете запустить:
git branch -a --contains <sha>
-a
означает все ветки. Если ваша шайка не имеет ветки, что может случиться в некоторых случаях, вы ничего не увидите.
Я настроил AWS CodeBuild для автоматической сборки из GitHub. Другие сервисы CI предоставляют переменную среды для ветки, но я не могу найти ее для AWS CodeBuild. Существует CODEBUILD_SOURCE_VERSION
, для которого задано либо pr/7
где 7
- номер запроса на получение, либо git commit sha.
Учитывая коммит, я пытался получить название ветки, но пока не повезло.
git branch --contains <commitsha>
не работает, потому что это отдельная голова. Как получить ветку git для коммита из CodeBuild?
Вы можете запустить:
git branch -a --contains <sha>
-a
означает все ветки. Если ваша шайка не имеет ветки, что может случиться в некоторых случаях, вы ничего не увидите.
Вы можете быть вдохновлены 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"
Добавьте следующую команду в фазу install
или pre_build
вашего файла buildspec.yml:
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 удаляет информацию 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}"
@Вадим Темиров, не могли бы вы поделиться файлом buildspec? Мне нужно экспортировать тег в post_build, но нет никакой переменной для его экспорта в сборке кода, и сценарий, который выложили выше, возвращает ошибки, так как .git не инициализирован.
Теперь можно получить эту информацию непосредственно из переменных среды CodeBuild:
CODEBUILD_WEBHOOK_BASE_REF
: имя базовой ссылки события webhook, которое запускает текущую сборку. Для запроса извлечения это ссылка на ветку.CODEBUILD_WEBHOOK_HEAD_REF
: имя ссылки на заголовок события webhook, которое запускает текущую сборку. Это может быть ссылка на ветку или ссылка на тег.CODEBUILD_WEBHOOK_TRIGGER
: Показывает событие webhook, которое вызвало сборку. Эта переменная доступна только для сборок, запускаемых веб-крючком. Значение анализируется из полезной нагрузки, отправленной в CodeBuild Github, Github Enterprise или Bitbucket. Формат значения зависит от того, какой тип события вызвал сборку.
- Для сборок, запускаемых по запросу, это pr/pull-request-number.
- Для сборок, запускаемых созданием новой ветки или отправкой коммита в ветку, это имя ветки/ветки.
- Для сборок, запускаемых путем нажатия тега в хранилище, это тег/имя-тега.