У нас есть процесс DevOps, где люди проверяют или обновляют с удаленного ведущего филиала, создают новую локальную рабочую ветвь от мастера и начинают работу в локальной ветке.Как настроить Gitlab-крючок для проверки нажатия git на удаленный
1) Мне нужно ввести ограничения, которые позволят людям напрямую нажимать прямо на удаленную ведущую ветку. Вместо этого люди должны вносить изменения в свои локальные ветви в одну ветку на удаленном компьютере, после чего администратор или обозреватель кода объединит ее в удаленный мастер.
2) Мне нужен крючок, который гарантирует, что в форме есть действительный билет или номер выпуска Gitlab, например, # PROJECTNAME123, прежде чем разрешить их толчок для перехода к их удаленным филиалам (до проверки кода и слияния в удаленный мастер). Кроме того, они не могут проталкиваться, если билет не существует или еще не открыт.
Я уже создал крюк pre-receive Bash, используя информацию с обоих следующих веб-сайтов, но они вызываются, но все же позволяют git push добраться до сервера, даже если я не передаю номер/номер выпуска Gitlab.
https://github.com/Praqma/git-hooks/commit/2aa087fada0b0da51724f37a902362ddd78e168f
http://blog.hgomez.net/2015/03/02/Gitlab-custom-hooks-Bash-Way.html
Ниже приведен сценарий предварительно получить и функцию Баш скрипт, который он вызывает.
предварительно не получить (нет расширения)
#!/usr/bin/env bash
#
source /var/opt/gitlab/git-data/repositories/Product-common/ProductCommonParent.git/custom_hooks/pre-receive-functions.sh
# enforced custom commit message format
while read old_revision new_revision refname ; do
process_revision
done
exit 0
pre-receive-functions.sh
#!/usr/bin/env bash
#
regexp="#[0-9]\+"
grep_msg()
{
grepped=$(echo $message | grep -i $regexp)
}
process_revision()
{
#revisions=$(git rev-list $old_revision..$new_revision)
echo "In pre-receive hook. Just before retrieving the revisions"
if [ "$old_revision" -eq 0 ]; then
# list everything reachable from new_revision but not any heads
revisions=$(git rev-list $(git for-each-ref --format='%(refname)' refs/heads/* | sed 's/^/\^/') $new_revision)
else
revisions=$(git rev-list $old_revision..$new_revision)
fi
echo "In pre-receive hook. Just before IFS"
IFS='\n' read -ra array <<< "$revisions"
for rid in "${!array[@]}"; do
revision=${array[rid]}
message=$(git cat-file commit $revision | sed '1,/^$/d')
grepped=$(echo $message | grep -i "#[0-9]\+")
grep_msg()
if [ -z "$grepped" ] ; then
grepped_none=$(echo $message | grep -i "#none")
if [ -n "$grepped_none" ] ; then
echo "Warning, you are committing without a ticket reference" >&1
else
echo "You have not included a ticket reference" >&2
exit 1
fi
fi
done
}
Ниже выходной, когда я пытаюсь нажать (Я толкаю из Git Bash оболочки на Windows, 8.1 в Fedora Core 24, имеющий установленный Gitlab):
[email protected] MINGW64 ~/Documents/DevOps Re-Engineering/ProductCommonParent (ProductCommonParent002)
$ git push
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 369 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: In pre-receive hook. Just before retrieving the revisions
remote: In pre-receive hook. Just before IFS
remote:
remote: To create a merge request for ProductCommonParent002, visit:
remote: http://localhost/Product-common/ProductCommonParent/merge_requests/new?merge_request%5Bsource_branch%5D=ProductCommonParent002
remote:
To http://192.168.56.101/Product-common/ProductCommonParent.git
* [new branch] ProductCommonParent002 -> ProductCommonParent002
Примечание: Gitlab и его зависимости, в том числе г он установлен на той же Fedora Core 24 Linux System.
Буду признателен за быструю помощь в преодолении этого. Заранее благодарю вас за помощь.