Revisione di codice in Gitlab CE: se ùn ci hè micca appruvazioni di dumanda di Merge, ma vogliu veramente

Revisione di codice in Gitlab CE: se ùn ci hè micca appruvazioni di dumanda di Merge, ma vogliu veramente

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 myapp:

  1. Creemu un token per accede à l'API GitLab (per mezu di ellu riceveremu infurmazioni nantu à u numeru di voti per è contru)
  2. Aghjunghjite un token à e variabili GitLab
  3. Disattivate Merge se ci sò errori in u pipeline (se ùn ci sò micca abbastanza "per" voti)
  4. Configurate a validazione di u votu cum'è parte di u pipeline CI/CD
  5. Pruibiscemu di fà impegni à rami prutetti, facemu tutti i cambiamenti solu per mezu di MR
  6. Cuntrollamu ciò chì hè accadutu à a fine

1. Crea un token per accede à l'API

Andate à Settings User → Access Tokens è scrive u token:

Revisione di codice in Gitlab CE: se ùn ci hè micca appruvazioni di dumanda di Merge, ma vogliu veramente

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

Revisione di codice in Gitlab CE: se ùn ci hè micca appruvazioni di dumanda di Merge, ma vogliu veramente

In u risultatu, avemu:

Revisione di codice in Gitlab CE: se ùn ci hè micca appruvazioni di dumanda di Merge, ma vogliu veramente

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.

Revisione di codice in Gitlab CE: se ùn ci hè micca appruvazioni di dumanda di Merge, ma vogliu veramente

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:

hub.docker.com/r/gableroux/gitlab-ci-lint
hub.docker.com/r/sebiwi/gitlab-ci-validate

È 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:

Revisione di codice in Gitlab CE: se ùn ci hè micca appruvazioni di dumanda di Merge, ma vogliu veramente

6. Cuntrollà

Set NEED_VOTES: 0

Facemu MR è mette un "dislike".

Revisione di codice in Gitlab CE: se ùn ci hè micca appruvazioni di dumanda di Merge, ma vogliu veramente

In i logs di creazione:

Revisione di codice in Gitlab CE: se ùn ci hè micca appruvazioni di dumanda di Merge, ma vogliu veramente

Avà mette "mi piace" è eseguite un novu cuntrollu:

Revisione di codice in Gitlab CE: se ùn ci hè micca appruvazioni di dumanda di Merge, ma vogliu veramente

Source: www.habr.com

Add a comment