Code review am Gitlab CE: wann et keng Fusioun Ufro Genehmegungen, mee ech wëll wierklech

Code review am Gitlab CE: wann et keng Fusioun Ufro Genehmegungen, mee ech wëll wierklech

Eng vun den néidegste Funktiounen, déi net an der gratis Versioun vu GitLab ass, ass d'Fäegkeet géint Repository Nullifikatioun a Kontroll Fusiounsufro (MR) ze stëmmen, mat der obligatorescher Code Iwwerpréiwung.

Loosst eis d'Mindestfunktionalitéit selwer maachen - mir verbidden Merge bis verschidde Entwéckler dem MR en Daumen erop ginn.

Firwat ass dat iwwerhaapt néideg?

Eis Organisatioun ka sech einfach leeschten eng GitLab Lizenz ze kafen. Awer, well d'Entwécklung an enger zougemaacher Loop ouni Internetzougang duerchgefouert gëtt, an et gëtt strikt Budgetsplanung, kann de Kaf vu selbstverwalte Lizenzen mat der néideger Funktionalitéit fir vill Méint zéien, awer d'Aarbecht muss elo gemaach ginn.

Als Resultat musst Dir:

  • oder komplett verbidden Merge a geschützte Filialen fir e puer Entwéckler, awer dann Entwéckler déi d'Recht hunn ze Merge kréien Konflikter wann Dir aner Leit hir MRs als Bonus fusionéiert;
  • oder gitt d'Méiglechkeet fir onkontrolléiert Fusioune mat Ärem Master-Branche ouni Code Iwwerpréiwung ze maachen, och wann et Junior ass, dee just gëschter agestallt gouf.

Déi éischt Saach, déi ech gemaach hunn, war Google, ze gleewen datt iergendeen definitiv eppes ähnleches gemaach huet (ouni de Code z'änneren), awer et huet sech erausgestallt datt et nach keng esou Implementatioun an der Gemeinschaftsversioun war.

Allgemeng Schema vun Aarbecht

Als Beispill, loosst eis Merge Ufro Genehmegungen op engem Testrepository konfiguréieren myapp:

  1. Loosst eis en Token erstellen fir Zougang zu der GitLab API (duerch et kréien mir Informatioun iwwer d'Zuel vun de Stëmmen "fir" an "géint")
  2. Loosst eis den Token an d'GitLab Variablen addéieren
  3. Loosst eis Merge deaktivéieren am Fall vu Feeler an der Pipeline (wann et net genuch Upvotes sinn)
  4. Loosst eis d'Stëmmverifikatioun als Deel vun der CI/CD Pipeline opsetzen
  5. Mir verbidden Engagementer fir geschützte Filialen ze maachen; all Ännerungen ginn nëmmen duerch MR gemaach
  6. Loosst eis kucken wat um Enn geschitt ass

1. Erstellt en Token fir Zougang zu der API

Gitt op User Settings → Access Tokens a schreift den Token op:

Code review am Gitlab CE: wann et keng Fusioun Ufro Genehmegungen, mee ech wëll wierklech

Kont fir en Token ze kréien
API Zougang erlaabt Iech bal alles mat Äre Repositories ze maachen, also ech recommandéieren en getrennten Gitlab Kont ze kreéieren, et minimal Rechter op Är Repositories ze ginn (zB Reporter) an en Token fir dee Kont ze kréien.

2. Füügt den Token un d'Gitlab Variablen

Zum Beispill, am virege Schrëtt hu mir en Token kritt QmN2Y0NOUFlfeXhvd21ZS01aQzgK

Open Settings → CI/CD → Variables → Add variable → GITLAB_TOKEN_FOR_CI

Code review am Gitlab CE: wann et keng Fusioun Ufro Genehmegungen, mee ech wëll wierklech

Als Resultat kréien mir:

Code review am Gitlab CE: wann et keng Fusioun Ufro Genehmegungen, mee ech wëll wierklech

Dëst kann entweder op engem Repository oder op enger Grupp vu Repositories gemaach ginn.

3. Mir setzen e Verbuet op Merge wann d'Zustimmung vun de Kollegen net no der Code review kritt gëtt.

An eisem Fall wäert d'Verbuet vu Fusioun sinn datt d'Versammlungspipeline e Feeler zréckkënnt wann et net genuch Stëmme gëtt.

Gitt op Astellungen → Allgemeng → Fusiounsufroen → Fusiounskontrollen an aktivéiert d'Optioun Assemblée Linnen mussen erfollegräich ofgeschloss ginn.

Code review am Gitlab CE: wann et keng Fusioun Ufro Genehmegungen, mee ech wëll wierklech

4. Opstellung vun der Pipeline

Wann Dir nach keng CI / CD Pipeline fir Är Applikatioun erstallt hutt
Erstellt eng Datei an der Root vum Repository .gitlab-ci.yml mam einfachsten Inhalt:

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"

Separat Repository fir CI / CD Konfiguratioun
Ech géif recommandéieren en separaten Repository ze maachen, an deem Dir eng myapp.gitlab-ci.yml Datei erstellt fir d'Pipeline ze konfiguréieren. Op dës Manéier kënnt Dir den Zougang vun de Participanten besser kontrolléieren, déi d'Build Pipeline änneren an en Zougangstoken kréien.

De Standort vun der neier Pipeline-Datei muss spezifizéiert ginn andeems Dir op de myapp-Repository gitt - Astellungen - CI / CD - Assemblée Linnen - Benotzerdefinéiert CI Konfiguratiounswee - spezifizéiert déi nei Datei, z.B. myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci

Tipp: Benotzt e Linter fir Ännerungen op GitLab CI Dateien ze maachen
Och wann Dir eleng schafft, wäert d'Aarbecht duerch MR eng gutt Hëllef sinn, all Är Ännerunge fir Pipelinedateien duerch eng Linter ze lafen. Wann Dir e Feeler an der Syntax vun der YAML-Datei mécht, wäert et Är Produktiounspipeline net briechen, awer einfach Merge blockéieren.

E Beispill vu Container mat Linters, déi Dir an Är Pipeline kënnt bauen:

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

An e Beispill vun der Verifizéierungsstadium:

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;

Et bleift fir e puer Parameteren op Är Pipeline ze addéieren fir et ze schaffen:

stages:
- test

variables:
NEED_VOTES: 1

include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"

D'NEED_VOTES Variabel bestëmmt wéivill "Daumen erop" MR muss hunn fir datt Merge verfügbar ass. E Wäert gläich wéi een heescht datt Dir selwer Äre MR approuvéiere kënnt andeems Dir se "liket".

enthalen enthält d'Teststadium, déi d'Zuel vun "Likes" iwwerpréift.

Déi einfachst Pipeline mam Beispill vu myapp.gitlab-ci.yml
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

Inhalter 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/.*$/'

Méi Informatioun iwwer wat während der Verifizéierung geschitt:

  • et gëtt eng Restriktioun datt de Scheck nëmme gemaach gëtt wann Dir MR am Master oder Verëffentlechung / * Branchen erstellt
  • Mat der GitLab API kréie mir d'Zuel vun "Likes" an "Dislikes"
  • Berechent den Ënnerscheed tëscht positiven an negativen Äntwerten
  • wann den Ënnerscheed manner ass wéi de Wäert dee mir an NEED_VOTES gesat hunn, blockéiere mir d'Fähigkeit ze fusionéieren

5. Verbidden engagéiert geschützt Branchen

Mir definéieren d'Branchen fir déi mir Code Bewäertunge musse maachen an uginn datt se nëmme mat MR geschafft kënne ginn.

Fir dëst ze maachen, gitt op Astellungen → Repository → Geschützt Branches:

Code review am Gitlab CE: wann et keng Fusioun Ufro Genehmegungen, mee ech wëll wierklech

6. Check

Set NEED_VOTES: 0

Mir maachen en MR a setzen en "Dislike".

Code review am Gitlab CE: wann et keng Fusioun Ufro Genehmegungen, mee ech wëll wierklech

An de Build Logbicher:

Code review am Gitlab CE: wann et keng Fusioun Ufro Genehmegungen, mee ech wëll wierklech

Elo setzt "Like" a fänkt nach eng Kéier un:

Code review am Gitlab CE: wann et keng Fusioun Ufro Genehmegungen, mee ech wëll wierklech

Source: will.com

Setzt e Commentaire