Kodegennemgang i Gitlab CE: hvis der ikke er nogen godkendelse af fletteanmodninger, men det vil jeg virkelig gerne

Kodegennemgang i Gitlab CE: hvis der ikke er nogen godkendelse af fletteanmodninger, men det vil jeg virkelig gerne

En af de mest nødvendige funktioner, der ikke er i den gratis version af GitLab, er muligheden for at stemme imod nulstilling af lageret for at kontrollere Merge request (MR) ved hjælp af den obligatoriske kodegennemgang.

Vi vil selv udføre minimumsfunktionaliteten - vi deaktiverer Merge, indtil flere udviklere giver en "thumbs up" til MR.

Hvorfor er dette overhovedet?

Vores organisation har råd til at købe en GitLab-licens. Men da udviklingen foregår i et lukket kredsløb uden adgang til internettet, og der er en stram budgetplanlægning, kan køb af selvadministrerede licenser med den nødvendige funktionalitet tage mange måneder, og du skal arbejde nu.

Som et resultat skal du:

  • eller fuldstændigt forbyde Merge til beskyttede filialer for nogle udviklere, men så modtager udviklere, der har ret til Merge, konflikter, når de fusionerer andres MR'er som en bonus;
  • eller tillade dig at lave ukontrollerede fusioner med din mastergren uden kodegennemgang, selvom det er en Junior, der lige slog sig ned i går.

Det første, jeg gjorde, var at gå på google og tro, at nogen allerede havde gjort noget lignende (uden at forfine koden), men det viste sig, at der ikke var en sådan implementering i fællesskabsversionen endnu.

Generel arbejdsplan

Lad os som et eksempel opsætte fletanmodningsgodkendelser på et testlager min app:

  1. Lad os oprette et token for at få adgang til GitLab API (gennem det vil vi modtage information om antallet af stemmer for og imod)
  2. Tilføj et token til GitLab-variabler
  3. Deaktiver fletning, hvis der er fejl i pipelinen (hvis der ikke er nok "til" stemmer)
  4. Opsæt stemmevalidering som en del af CI/CD-pipeline
  5. Vi vil forbyde at forpligte sig til beskyttede filialer, vi foretager kun alle ændringer gennem MR
  6. Lad os tjekke, hvad der skete til sidst

1. Opret et token for at få adgang til API'en

Gå til Brugerindstillinger → Adgangstokens og skriv tokenet ned:

Kodegennemgang i Gitlab CE: hvis der ikke er nogen godkendelse af fletteanmodninger, men det vil jeg virkelig gerne

Konto for at modtage tokenet
API-adgang giver dig mulighed for at gøre næsten hvad som helst med dine repositories, så jeg foreslår, at du opretter en separat Gitlab-konto, giver den minimale rettigheder til dine repositories (som Reporter) og får et token til den konto.

2. Tilføj token til Gitlab-variabler

For eksempel modtog vi et token i det foregående trin QmN2Y0NOUFlfeXhvd21ZS01aQzgK

Åbn Indstillinger → CI/CD → Variabler → Tilføj variabel → GITLAB_TOKEN_FOR_CI

Kodegennemgang i Gitlab CE: hvis der ikke er nogen godkendelse af fletteanmodninger, men det vil jeg virkelig gerne

Som et resultat får vi:

Kodegennemgang i Gitlab CE: hvis der ikke er nogen godkendelse af fletteanmodninger, men det vil jeg virkelig gerne

Dette kan gøres både på ét depot og på en gruppe af depoter.

3. Vi sætter et forbud mod Merge, hvis godkendelse af kollegaer ikke modtages efter kodegennemgangen

I vores tilfælde vil forbuddet mod Merge være, at samlerøret vil returnere en fejl, hvis der ikke er stemmer nok.

Gå til Indstillinger → Generelt → Fletanmodninger → Flettjek, og aktiver indstillingen Samlebånd skal køre med succes.

Kodegennemgang i Gitlab CE: hvis der ikke er nogen godkendelse af fletteanmodninger, men det vil jeg virkelig gerne

4. Sæt rørledningen op

Hvis du endnu ikke har lavet en CI/CD-pipeline til din ansøgning
Opret en fil i roden af ​​depotet .gitlab-ci.yml med enkelt indhold:

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 lager til CI/CD-konfiguration
Jeg vil anbefale at lave et separat lager, hvor du skal oprette en myapp.gitlab-ci.yml fil for at opsætte pipelinen. På denne måde kan du bedre kontrollere adgangen for bidragydere, som kan ændre build-pipeline og få et adgangstoken.

Placeringen af ​​den nye pipeline-fil skal angives ved at gå til myapp-lageret - Indstillinger - CI / CD - Samlelinjer - Brugerdefineret CI-konfigurationssti - angiv en ny fil, f.eks. myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci

Tip: Brug en linter til at foretage ændringer i GitLab CI-filer
Selvom du arbejder alene, vil det at arbejde gennem MR være en god hjælper, da du kører alle dine ændringer af pipeline-filerne gennem linteren. Hvis du laver en fejl i syntaksen for YAML-filen, vil dette ikke tillade dig at bryde arbejdspipelinen, men vil blot blokere Merge.

Et eksempel på beholdere med linters, som du kan integrere i din pipeline:

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

Og et eksempel på valideringsstadiet:

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;

Det er tilbage at tilføje et par parametre til din pipeline for at få det til at fungere:

stages:
- test

variables:
NEED_VOTES: 1

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

Variablen NEED_VOTES bestemmer, hvor mange "thumbs up" MR skal have, for at Merge er tilgængelig. En værdi på én betyder, at du selv kan godkende din MR ved at "like" den.

inkludere inkluderer teststadiet, som kontrollerer antallet af "likes".

Den enkleste pipeline med myapp.gitlab-ci.yml som eksempel
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

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

Få mere at vide om, hvad der sker, når du tjekker:

  • begrænsningen er sat til, at kontrollen kun vil være ved oprettelse af en MR i master- eller release /*-grenene
  • ved hjælp af GitLab API, få antallet af "likes" og "dislikes"
  • beregne forskellen mellem positive og negative svar
  • hvis forskellen er mindre end den værdi, vi indstillede i NEED_VOTES, blokerer vi muligheden for at flette

5. Deaktiver commits til beskyttede filialer

Vi bestemmer de brancher, som vi skal gennemføre kodegennemgang for, og angiver, at de kun kan arbejdes med gennem MR.

For at gøre dette skal du gå til Indstillinger → Lager → Beskyttede grene:

Kodegennemgang i Gitlab CE: hvis der ikke er nogen godkendelse af fletteanmodninger, men det vil jeg virkelig gerne

6. Kontrol

Indstil NEED_VOTES: 0

Vi laver MR og sætter et "dislike".

Kodegennemgang i Gitlab CE: hvis der ikke er nogen godkendelse af fletteanmodninger, men det vil jeg virkelig gerne

I byggelogfilerne:

Kodegennemgang i Gitlab CE: hvis der ikke er nogen godkendelse af fletteanmodninger, men det vil jeg virkelig gerne

Sæt nu "synes godt om" og kør en gencheck:

Kodegennemgang i Gitlab CE: hvis der ikke er nogen godkendelse af fletteanmodninger, men det vil jeg virkelig gerne

Kilde: www.habr.com

Tilføj en kommentar