Автоматическое связывание git branch с jira issue через git-hook

   Очередной способ улучшить agile процесс - это настроить связывание системы контроля версий с баг-трекинговой системой. Ещё лучше, когда этот процесс происходит автоматически! Этим мы и займёмся, и речь сегодня пойдёт про связывание Jira и Git.

   Основная идея - если в тексте описания коммита (commit description), указать ключ Jira issue, то ветка появится в описании Jira issue.

Часть I Настроить поддержку git в Jira

   Это можно сделать через панель администратора Jira (если у вас нет доступа, обратитесь к вашему администратору). Процесс должен быть похож на https://confluence.atlassian.com/bitbucket/connect-bitbucket-and-jira-813891605.html

Часть II Настроить git-hook

   Основная цель этой статьи, показать возможность автоматического связывания используя git-hook. Как настроить git-hook: в локальной директории репозитория 'C:\git\repo-name\.git\hooks' создать файл pre-commit (по дефолту там можно найти pre-commit.sample) со следующим содержанием:

#!/bin/sh
#
# Pre-commit hook for adding Jira number to commit comment
#
BRANCH_NAME=$(git symbolic-ref --short HEAD)
JIRA=$( echo $BRANCH_NAME | grep -hE "[[:alpha:]][A-Z]+-[0-9]+" | tr '/' '\n' | grep -hE "[A-Z]+-[0-9]+" | sort | uniq | head -n1 )
JIRA_LAST=$( echo $BRANCH_NAME | grep -hE "[[:alpha:]][A-Z]+-[0-9]+" | tr '/' '\n' | grep -hE "[A-Z]+-[0-9]+" | sort | uniq | tail -n1 )
if [[ "$JIRA" == "" ]]; then
echo "Branch name should contain JIRA issue ref, for ex: KEY-123456 "
exit 1
fi
if [[ "$JIRA" != "$JIRA_LAST" ]]; then
echo "Branch name should contain one and only JIRA issue ref, but found many: "
echo "$( echo $BRANCH_NAME | grep -E "[A-Z]+-[0-9]+" | uniq)"
exit 1
fi
exit 0;
После этого, если мы создадим ветку без Jira-ключа, при попытке выполнения коммита, мы получим ошибку:


и коммит не будет выполнен.

Кроме этого, необходимо добавить файл prepare-commit-msg (по дефолту там можно найти prepare-commit-msg.sample) со следующим содержанием:

#!/bin/sh
BRANCH_NAME=$(git symbolic-ref --short HEAD)
JIRA=$( echo $BRANCH_NAME | grep -hE "[[:alpha:]][A-Z]+-[0-9]+" | tr '/' '\n' | grep -hE "[A-Z]+-[0-9]+" | head -n1 )
JIRA_S=$( echo $JIRA | sed -r "s/^[A-Z]+-[0-9]+$/& /" )
sed -r -i "s/$JIRA//" $1
sed -i "1s;^;$JIRA_S;" $1

И тогда, если ветка будет названа в соответствии с указанными правилами, то коммит будет выполнен успешно:

и в текст комментария, автоматически будет подставлен jira key КЛЮЧ-123 в начало комментария.


+ подхода: прозрачность процесса разработки по задачам, возможность быстрого поиска кода из Jira таски, история коммитов сохраняет ссылки на задачи;
- подхода: ветка обязательно должна называться KEY-123/some-name.. (т.е. ветка всегда должна быть создана в рамках какой-то задачи)