Una di e funzioni più necessarie chì ùn hè micca in a versione libera di GitLab hè a capacità di votu contru à zeroing u repository per cuntrullà a dumanda di Merge (MR) utilizendu a revisione di codice obligatoriu.
Faremu a funziunalità minima noi stessi - disattiveremu Merge finu à chì parechji sviluppatori dà un "pollice in su" à MR.
Perchè hè questu in tuttu?
A nostra urganizazione pò permette di cumprà una licenza GitLab. Ma, postu chì u sviluppu hè realizatu in un ciclu chjusu senza accessu à Internet, è ci hè una pianificazione stretta di u budgetu, a compra di licenze autogestionate cù e funziunalità necessariu pò piglià parechji mesi, è avete bisognu di travaglià avà.
In u risultatu, avete da:
- o pruibisce cumplettamente Merge in rami prutetti per alcuni sviluppatori, ma allora i sviluppatori chì anu u dirittu di Merge ricevenu cunflitti quandu si fusione MR di l'altri cum'è bonus;
- o permettenu di fà fusioni incontrollate cù u vostru ramu maestru senza rivisione di codice, ancu s'ellu hè un Junior chì si stalla solu eri.
A prima cosa ch'e aghju fattu era andà in Google, crede chì qualchissia avia digià fattu qualcosa simili (senza raffinà u codice), ma resultò chì ùn ci era micca una tale implementazione in a versione di a cumunità.
Schema generale di u travagliu
Per esempiu, cunfiguremu l'appruvazioni di richieste di Merge in un repository di prova
- Creemu un token per accede à l'API GitLab (per mezu di ellu riceveremu infurmazioni nantu à u numeru di voti per è contru)
- Aghjunghjite un token à e variabili GitLab
- Disattivate Merge se ci sò errori in u pipeline (se ùn ci sò micca abbastanza "per" voti)
- Configurate a validazione di u votu cum'è parte di u pipeline CI/CD
- Pruibiscemu di fà impegni à rami prutetti, facemu tutti i cambiamenti solu per mezu di MR
- Cuntrollamu ciò chì hè accadutu à a fine
1. Crea un token per accede à l'API
Andate à Settings User → Access Tokens è scrive u token:
Contu per riceve u token
L'accessu API vi permette di fà quasi tuttu cù i vostri repositori, cusì vi cunsigliu di creà un contu Gitlab separatu, dà diritti minimi à i vostri repositori (per esempiu, Reporter) è uttene un token per questu contu.
2. Aghjunghjite u token à i variàbili di Gitlab
Per esempiu, in u passu precedente, avemu ricevutu un token QmN2Y0NOUFlfeXhvd21ZS01aQzgK
Open Settings → CI/CD → Variables → Add Variable → GITLAB_TOKEN_FOR_CI
In u risultatu, avemu:
Questu pò esse fattu sia in un repository sia in un gruppu di repository.
3. Avemu messu una pruibizione di Merge se l'appruvazioni di i culleghi ùn hè micca ricevutu dopu à a revisione di u codice
In u nostru casu, a pruibizione di Merge serà chì u pipeline di l'assemblea torna un errore s'ellu ùn ci hè micca abbastanza voti.
Andate à Settings → General → Merge Requests → Merge Checks è attivate l'opzione Assembly Lines must run successfully.
4. Stallà u pipeline
Se ùn avete micca fattu un pipeline CI/CD per a vostra applicazione
Crea un schedariu in a radica di u repository .gitlab-ci.yml cun cuntenutu simplice:
stages:
- build
- test
variables:
NEED_VOTES: 1
include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"
run-myapp:
stage: build
script: echo "Hello world"
Repositoriu separatu per a cunfigurazione CI/CD
Avissi cunsigliatu di fà un repository separatu induve avete bisognu di creà un schedariu myapp.gitlab-ci.yml per stabilisce a pipeline. Questu modu pudete cuntrullà megliu l'accessu di i cuntributori chì ponu cambià u pipeline di custruzzione è uttene un token d'accessu.
U locu di u novu schedariu di pipeline deve esse specificatu andendu à u repository myapp - Configurazione - CI / CD - Linee di assemblea - Percorsu di cunfigurazione CI persunalizata - specificà un novu schedariu, per esempiu myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci
Tip: Aduprate un linter per fà cambiamenti à i schedarii GitLab CI
Ancu s'è vo travaglià solu, u travagliu attraversu MR serà un bonu aiutu, eseguendu tutti i vostri cambiamenti à i schedarii di pipeline attraversu u linter. Se fate un sbagliu in a sintassi di u schedariu YAML, questu ùn vi permetterà micca di rompe u pipeline di travagliu, ma solu bluccà Merge.
Un esempiu di cuntenituri cù linters chì pudete incrustà in u vostru pipeline:
È un esempiu di a tappa di validazione:
stages:
- lint
lint:
stage: lint
image: sebiwi/gitlab-ci-validate:1.3.0
variables:
GITLAB_HOST: https://gitlab.com
script:
- CI_FILES=(./*.yml)
- for f in "${CI_FILES[@]}"; do
gitlab-ci-validate $f;
done;
Resta à aghjunghje uni pochi di parametri à u vostru pipeline per fà u funziunamentu:
stages:
- test
variables:
NEED_VOTES: 1
include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"
A variabile NEED_VOTES determina quanti "pollici in su" deve avè MR per chì Merge sia dispunibule. Un valore di unu significa chì tù stessu pudete appruvà u vostru MR "piacendu".
include include u stadiu di prova, chì verifica u numeru di "Mi piace".
U pipeline più simplice cù myapp.gitlab-ci.yml cum'è un esempiu
stages:
- build
- test
variables:
NEED_VOTES: 0
include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"
run-myapp:
stage: build
image: openjdk
script:
- echo CI_MERGE_REQUEST_TARGET_BRANCH_NAME $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
- java HelloWorld.java
Cuntenutu di check-approve.gitlab-ci.yml
ci-mr:
stage: test
script:
- echo ${CI_API_V4_URL}
- echo "CI_PROJECT_ID ${CI_PROJECT_ID}"
- echo "CI_COMMIT_SHA ${CI_COMMIT_SHA}"
- "export MR_ID=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .id else {} end" | grep --invert-match {})"
- "export MR_TITLE=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .title else {} end" | grep --invert-match {})"
- "export MR_WIP=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .work_in_progress else {} end" | grep --invert-match {})"
- "export MR_UPVOTES=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .upvotes else {} end" | grep --invert-match {})"
- "export MR_DOWNVOTES=$(curl --silent --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN_FOR_CI" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests | jq ".[] | if .sha == \"${CI_COMMIT_SHA}\" then .downvotes else {} end" | grep --invert-match {})"
- MR_VOTES=$(expr ${MR_UPVOTES} - ${MR_DOWNVOTES})
- NEED_VOTES_REAL=${NEED_VOTES:-1}
- echo "MR_ID ${MR_ID} MR_TITLE ${MR_TITLE} MR_WIP ${MR_WIP} MR_UPVOTES ${MR_UPVOTES} MR_DOWNVOTES ${MR_DOWNVOTES}"
- echo "MR_VOTES ${MR_VOTES} Up vote = 1, down vote = -1, MR OK if votes >=${NEED_VOTES_REAL}"
- if [ "${MR_VOTES}" -ge "$(expr ${NEED_VOTES_REAL})" ];
then
echo "MR OK";
else
echo "MR ERROR Need more votes";
exit 1;
fi
image: laptevss/gitlab-api-util
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^release/.*$/'
Sapete più nantu à ciò chì succede quandu si verifica:
- a restrizzione hè stabilita chì u cuntrollu serà solu quandu crea un MR in u maestru o liberate /* rami
- usendu l'API GitLab, uttene u numeru di "mi piace" è "dislikes"
- calculà a diffarenza trà risposti pusitivi è negativi
- se a diffarenza hè menu di u valore chì avemu stabilitu in NEED_VOTES, allora bluccà a capacità di fusione
5. Disable commits à rami prutetti
Determinemu i rami per i quali duvemu fà una revisione di codice è indicà chì ponu esse travagliatu solu cù MR.
Per fà questu, andate à Settings → Repository → Branches Protetti:
6. Cuntrollà
Set NEED_VOTES: 0
Facemu MR è mette un "dislike".
In i logs di creazione:
Avà mette "mi piace" è eseguite un novu cuntrollu:
Source: www.habr.com