Git hooks инструмент, помогающий держать в порядке ваш репозиторий. Можно настроить автоматические правила оформления ваших коммитов.
Все вы наверное знаете про pre-commit проверку вашего кода перед коммитом. Но ведь не все можно проверить перед коммитом. Некоторые ограничения хочется использоваться глобально на всем Gitlab.
Кто запутался в pre-commit и pre-receive хуках, в этом посте описываются различия между ними https://blog.gitguardian.com/git-hooks-automated-secrets-detection/ в абзаце "What are git hooks?".
Если у вас Gitlab Enterprise Edition, вы можете настроить хуки, которые описаны в посте через WEB интерфейс.
Но что делать, если у вас Gitlab Community Edition?
В этой статье будут описаны 5 pre-receive хуков, которые выполняются на сервере Gitlab Community Edition:
- block_confidentials.sh Блокирование отправки приватных ключей и AWS токенов
- block_file_extensions.sh Блокирование отправки архивов (Regex настраивается)
- check-large-files.sh Блокирование отправки больших файлов (Размер настраивается)
- reject-not-allowlist-email.sh Блокирование коммитов с email не из allow списка (Список email доменов настраивается)
- require-issue.sh Блокирование коммитов без issue в названии (Список issue настраивается)
В основном хуки взяты из репозитория platform-samples в директории pre-receive-hooks (относится к GitHub Enterprise).
Весь исходный код серверных хуков вы можете посмотреть на Github https://github.com/patsevanton/git-server-pre-receive-hooks
Установка на Gitlab
- Необходимо создать директорию
/opt/gitlab/embedded/service/gitlab-shell/hooks/pre-receive.d/
- Скопировать в эту директорию хуки
- Не забыть выставить права запуска для хуков (chmod +x файл-хука)
Блокирование отправки приватных ключей и AWS токенов
В файле block_confidentials.sh настраиваем список regex_list, который описывает конфиденциальную информацию.
# Define list of REGEX to be searched and blockedregex_list=( # block any private key file '(\-){5}BEGIN\s?(RSA|OPENSSH|DSA|EC|PGP)?\s?PRIVATE KEY\s?(BLOCK)?(\-){5}.*' # block AWS API Keys 'AKIA[0-9A-Z]{16}' # block AWS Secret Access Key (TODO: adjust to not find validd Git SHA1s; false positives) # '([^A-Za-z0-9/+=])?([A-Za-z0-9/+=]{40})([^A-Za-z0-9/+=])?' # block confidential content 'CONFIDENTIAL')
Добавляем в репозиторий приватный ключ, делаем коммит и при
git push
получаем ошибку.
Блокирование отправки архивов
В файле block_file_extensions.sh настраиваем case
*.zip|*.gz|*.tgz
, в котором указываются расширения
файлов, которые будут блокироваться.
Добавляем в репозиторий zip архив, делаем коммит и при git
push
получаем ошибку.
Блокирование отправки больших файлов
В файле check-large-files.sh настраиваем параметр
maxsize
, который указывает размер файла в мегабайтах,
выше которого отправка будет блокироваться.
Добавляем в репозиторий файл больше 1 мегабайта, делаем коммит и
при git push
получаем ошибку.
Блокирование коммитов с email не из allow списка
В файле reject-not-allowlist-email.sh настраиваем список email-доменов, для которых разрешены коммиты.
declare -a DOMAIN_ARRAY=("group1.com" "group2.com")
Меняем почту в git на ту, которой нет в разрешенном списке.
git config user.email user1@group3.com
Добавляем в репозиторий любой файл, делаем коммит и при
git push
получаем ошибку.
Блокирование коммитов без issue в названии
Этот серверный хук был взят из блога Majilesh.
В файле require-issue.sh настраиваем список commit_format, для которых разрешены коммиты.
commit_format="(JIRA|PROJECTKEY|MULE|ECOM|SAP|XLR-[1-9]+Merge)"
Добавляем в репозиторий любой файл, делаем коммит, в названии
которого нет слов из commit_format и при git push
получаем ошибку.
Надеюсь что мой пост сподвигнет сообщество развивать направление серверных хуков.
Telegram чат по Gitlab https://t.me/ru_gitlab