mirror of
https://github.com/SantaSpeen/santaspeen.ru-blog.git
synced 2026-05-19 16:10:16 +00:00
add post gitlab auto add reviewers
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 51 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 35 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
@@ -0,0 +1,172 @@
|
|||||||
|
---
|
||||||
|
slug: gitlab-auto-reviewers
|
||||||
|
title: Gitlab auto add reviewers
|
||||||
|
description: Gitlab auto assign reviewer for merge request
|
||||||
|
image: ./gitlab-reviewers.png
|
||||||
|
tags: [gitlab, devops, bash, python]
|
||||||
|
date: 2023-05-30
|
||||||
|
---
|
||||||
|
|
||||||
|
Gitlab auto assign reviewer — Автоматическое подставление assignee и reviewers при создании mergre request
|
||||||
|
|
||||||
|
[](/blog/gitlab-auto-reviewers)
|
||||||
|
|
||||||
|
<!--truncate-->
|
||||||
|
## Gitlab auto add reviewers
|
||||||
|
|
||||||
|
**Цель**: при создании Merge Request сделать удобное добавление ревьюверов
|
||||||
|
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## 1. Reviewer templates
|
||||||
|
|
||||||
|
Первый способ который поможет в добавлении ревьюверов - это использование templates. Встроенная фича Gitlab, бесплатная для всех версий.
|
||||||
|
|
||||||
|
Документация - [Description templates](https://docs.gitlab.com/ee/user/project/description_templates.html)
|
||||||
|
|
||||||
|
### Подготовка
|
||||||
|
Нужно создать директорию ```.gitlab/merge_request_templates```
|
||||||
|
|
||||||
|
Создать внутри любой файл расширения ```.md```
|
||||||
|
|
||||||
|
Например ```top_reviewers.md```
|
||||||
|
|
||||||
|
С таким содержанием, где нужно добавить username ревьюверов:
|
||||||
|
```
|
||||||
|
/assign_reviewer @user1 @user2
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
### Использование
|
||||||
|
|
||||||
|
После добавления такого template, при создании новых MR появится дополнительное поле, где можно выбрать созданные шаблоны
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Удобный способ, особенно если несколько разных групп ревбюверов, можно создавать несколько частых шаблонов и использовать их.
|
||||||
|
|
||||||
|
## 2. Bash gitlab API
|
||||||
|
|
||||||
|
Данный способ - добавление скрипта в ```.gitlab-ci.yml``` CI/CD, который позволит через API автоматический добавлять ревьюверов
|
||||||
|
|
||||||
|
### Подготовка
|
||||||
|
|
||||||
|
Для отслеживания создания merge request можно использовать разные события(триггеры):
|
||||||
|
|
||||||
|
- Gitlab CI workflow event
|
||||||
|
- Schedules
|
||||||
|
- Прочие события
|
||||||
|
|
||||||
|
Я буду использовать `workflow — merge request event`, для этого добавил в **workflow** триггер на создание MR:
|
||||||
|
```YAML
|
||||||
|
workflow:
|
||||||
|
rules:
|
||||||
|
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
||||||
|
```
|
||||||
|
|
||||||
|
Переменные **Settings -> CI/CD -> Variables**
|
||||||
|
- `$TOKEN` - Gitlab API Token
|
||||||
|
|
||||||
|
В gitlab runner где запускается pipeline нужен jq
|
||||||
|
Заранее установленый или доставить перед запуском скрипта:
|
||||||
|
```YAML
|
||||||
|
before_script:
|
||||||
|
- apt-get install jq -y
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Скрипт
|
||||||
|
|
||||||
|
Пошаговая логика скрипта:
|
||||||
|
|
||||||
|
- Получить последний merge request ID
|
||||||
|
- Получить ID автора merge request
|
||||||
|
- Назначить Assigne = ID Автора
|
||||||
|
- Назначить Reviewers = из переменной Reviewers(list)
|
||||||
|
|
||||||
|
```YAML
|
||||||
|
variables:
|
||||||
|
PROJECT_URL: 'https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/merge_requests'
|
||||||
|
REVIEWERS: '10043654' # Reviewers Gitlab ID List
|
||||||
|
|
||||||
|
.gitlab_add_assignee_reviewers:
|
||||||
|
stage: set up merge request
|
||||||
|
script:
|
||||||
|
- read LAST_MR_ID < <(curl --header "PRIVATE-TOKEN:$TOKEN" "$PROJECT_URL" | jq '.[0] | .iid')
|
||||||
|
- read MR_AUTHOR < <(curl --header "PRIVATE-TOKEN:$TOKEN" "$PROJECT_URL/$LAST_MR_ID" | jq '.author | .id')
|
||||||
|
# add assignee
|
||||||
|
- curl -s --request PUT --header "PRIVATE-TOKEN:$TOKEN" "$PROJECT_URL/$LAST_MR_ID" --form "assignee_ids=$MR_AUTHOR" | jq '.assignees'
|
||||||
|
# add reviewers
|
||||||
|
- curl -s --request PUT --header "PRIVATE-TOKEN:$TOKEN" "$PROJECT_URL/$LAST_MR_ID" --form "reviewer_ids=$REVIEWERS"
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## 3. Python gitlab API
|
||||||
|
|
||||||
|
Данный вариант более гибкий и удобный в плане доработок под разные условия.
|
||||||
|
Есть так же возможность вызывать как python script в ``gitlab-ci``
|
||||||
|
|
||||||
|
Полный код на github [https://github.com/akmalovaa/gitlab-auto-add-reviewers/tree/master/Python]
|
||||||
|
|
||||||
|
Python/settings.py
|
||||||
|
```Python
|
||||||
|
GITLAB_API_ADDR = '<https://gitlab.com>' # Your Gitlab URL
|
||||||
|
GITLAB_TOKEN='YOUR GITLAB API TOKEN' # API Token use import .env
|
||||||
|
GITLAB_ROOT_GROUP = '' # Root Group optional
|
||||||
|
GITLAB_REVIEWERS: list = [10043654] # Gitlab Reviewrs ID
|
||||||
|
```
|
||||||
|
|
||||||
|
Python/main.py
|
||||||
|
```Python
|
||||||
|
import gitlab
|
||||||
|
import settings
|
||||||
|
import typing
|
||||||
|
|
||||||
|
gl = gitlab.Gitlab(settings.GITLAB_API_ADDR, private_token=settings.GITLAB_TOKEN)
|
||||||
|
|
||||||
|
|
||||||
|
def get_last_merge_requests() -> None:
|
||||||
|
""" Get last merg request """
|
||||||
|
if settings.GITLAB_ROOT_GROUP == '':
|
||||||
|
all_mr: typing.Any = gl.mergerequests.list(state="opened")
|
||||||
|
else:
|
||||||
|
all_mr: typing.Any = gl.groups.get(settings.GITLAB_ROOT_GROUP).mergerequests.list(state="opened")
|
||||||
|
try:
|
||||||
|
last_mr: gitlab.v4.objects.merge_requests.MergeRequest = all_mr[0]
|
||||||
|
except IndexError:
|
||||||
|
print("Merge requests - Not found")
|
||||||
|
return
|
||||||
|
_auto_add_responsible(last_mr)
|
||||||
|
|
||||||
|
|
||||||
|
def _auto_add_responsible(mr: gitlab.v4.objects.merge_requests.GroupMergeRequest) -> None:
|
||||||
|
project: gitlab.v4.objects.projects.Project = gl.projects.get(
|
||||||
|
mr.project_id, lazy=True
|
||||||
|
)
|
||||||
|
editable_mr: gitlab.v4.objects.merge_requests.ProjectMergeRequest = (
|
||||||
|
project.mergerequests.get(mr.iid, lazy=True)
|
||||||
|
)
|
||||||
|
editable_mr.assignee_id = mr.author["id"]
|
||||||
|
editable_mr.reviewer_ids = settings.GITLAB_REVIEWERS
|
||||||
|
print(editable_mr)
|
||||||
|
editable_mr.save()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
get_last_merge_requests()
|
||||||
|
```
|
||||||
|
|
||||||
|
example for ```.gitlab-ci.yml```
|
||||||
|
```YAML
|
||||||
|
.python_add_reviewers:
|
||||||
|
script:
|
||||||
|
- pip install virtualenv
|
||||||
|
- virtualenv venv
|
||||||
|
- source venv/bin/activate
|
||||||
|
- pip install -r Python/requirements.txt
|
||||||
|
- python Python/main.py
|
||||||
|
```
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 41 KiB |
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
slug: test-post
|
slug: test-post
|
||||||
title: First test post
|
title: First test post
|
||||||
tags: [kubernetes, devops]
|
tags: [kubernetes]
|
||||||
date: 2017-09-13T10:00
|
date: 2017-09-13T10:00
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -4,4 +4,5 @@ sidebar_position: 3
|
|||||||
|
|
||||||
# Gitlab
|
# Gitlab
|
||||||
|
|
||||||
Тут частые команды
|
|
||||||
|
[Automatically add code reviewers](http://akmalov.com/blog/gitlab-auto-reviewers)
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 4
|
||||||
|
---
|
||||||
|
|
||||||
|
# WireGuard
|
||||||
|
|
||||||
|
|
||||||
|
## WireGuard no route local address
|
||||||
|
|
||||||
|
При подключении VPN WireGuard весь трафик пойдет через этот туннель
|
||||||
|
|
||||||
|
Цель: Не маршрутизировать локальный трафик
|
||||||
|
|
||||||
|
Например сети:
|
||||||
|
- 192.168.0.0/16
|
||||||
|
- 10.0.0.0/8
|
||||||
|
|
||||||
|
Нужно исключить, чтоб не проходили через VPN
|
||||||
|
|
||||||
|
В настройках есть поле ``AllowedIPs``, где можно указать какие адреса пойдут через VPN.
|
||||||
|
|
||||||
|
Поэтому приходиться делать наоборот и все адреса за исключением нужных, добавить в allowed IP:
|
||||||
|
```
|
||||||
|
[Interface]
|
||||||
|
PrivateKey = PrivateKey
|
||||||
|
Address = Address
|
||||||
|
DNS = DNS
|
||||||
|
|
||||||
|
[Peer]
|
||||||
|
PublicKey = PublicKey
|
||||||
|
PresharedKey = PresharedKey
|
||||||
|
AllowedIPs = 0.0.0.0/5, 8.0.0.0/7, 11.0.0.0/8, 12.0.0.0/6, 16.0.0.0/4, 32.0.0.0/3, 64.0.0.0/2, 128.0.0.0/3, 160.0.0.0/5, 168.0.0.0/6, 172.0.0.0/12, 172.32.0.0/11, 172.64.0.0/10, 172.128.0.0/9, 173.0.0.0/8, 174.0.0.0/7, 176.0.0.0/4, 192.0.0.0/9, 192.128.0.0/11, 192.160.0.0/13, 192.169.0.0/16, 192.170.0.0/15, 192.172.0.0/14, 192.176.0.0/12, 192.192.0.0/10, 193.0.0.0/8, 194.0.0.0/7, 196.0.0.0/6, 200.0.0.0/5, 208.0.0.0/4, 8.8.8.8/32
|
||||||
|
Endpoint = Endpoint
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user