Kontrola kódu v Gitlabu CE: pokud neexistují žádné schválení žádosti o sloučení, ale opravdu chci

Kontrola kódu v Gitlabu CE: pokud neexistují žádné schválení žádosti o sloučení, ale opravdu chci

Jednou z nejpotřebnějších funkcí, která není v bezplatné verzi GitLab, je možnost hlasovat proti vynulování úložiště pro kontrolu žádosti o sloučení (MR) pomocí povinné kontroly kódu.

Minimální funkcionalitu uděláme sami – zakážeme sloučení, dokud několik vývojářů nedá „palec nahoru“ MR.

Proč to vůbec je?

Naše organizace si může dovolit zakoupit licenci GitLab. Ale protože vývoj probíhá v uzavřené smyčce bez přístupu k internetu a existuje přísné plánování rozpočtu, nákup samostatně spravovaných licencí s potřebnou funkčností může trvat mnoho měsíců a musíte pracovat hned.

V důsledku toho musíte:

  • nebo některým vývojářům zcela zakázat Merge do chráněných větví, ale pak vývojáři, kteří mají právo na Merge, dostávají jako bonus konflikty při slučování cizích MR;
  • nebo vám umožní provádět nekontrolované slučování s vaší hlavní pobočkou bez kontroly kódu, i když je to Junior, který se právě usadil včera.

První, co jsem udělal, bylo googlovat v domnění, že někdo už něco podobného udělal (bez dolaďování kódu), ale ukázalo se, že v komunitní verzi zatím žádná taková implementace není.

Obecné schéma práce

Jako příklad nastavíme schválení žádosti o sloučení na testovacím úložišti moje aplikace:

  1. Vytvořme si token pro přístup do GitLab API (prostřednictvím něj budeme dostávat informace o počtu hlasů pro a proti)
  2. Přidejte token do proměnných GitLab
  3. Zakažte sloučení, pokud se v kanálu vyskytují chyby (pokud není dostatek hlasů „pro“)
  4. Nastavte ověřování hlasů jako součást kanálu CI/CD
  5. Zakážeme zavazování chráněných poboček, veškeré změny provádíme pouze prostřednictvím MR
  6. Podívejme se, co se nakonec stalo

1. Vytvořte token pro přístup k rozhraní API

Přejděte do Nastavení uživatele → Přístupové tokeny a zapište si token:

Kontrola kódu v Gitlabu CE: pokud neexistují žádné schválení žádosti o sloučení, ale opravdu chci

Účet pro příjem tokenu
Přístup k API vám umožňuje dělat s vašimi repozitáři téměř cokoli, takže vám doporučuji vytvořit samostatný účet Gitlab, dát mu minimální práva ke svým úložištím (jako Reporter) a získat pro tento účet token.

2. Přidejte token do proměnných Gitlabu

Například v předchozím kroku jsme obdrželi token QmN2Y0NOUFlfeXhvd21ZS01aQzgK

Otevřete Nastavení → CI/CD → Proměnné → Přidat proměnnou → GITLAB_TOKEN_FOR_CI

Kontrola kódu v Gitlabu CE: pokud neexistují žádné schválení žádosti o sloučení, ale opravdu chci

V důsledku toho získáme:

Kontrola kódu v Gitlabu CE: pokud neexistují žádné schválení žádosti o sloučení, ale opravdu chci

To lze provést jak na jednom úložišti, tak na skupině úložišť.

3. Pokud po přezkoumání kódu neobdržíme souhlas kolegů, zakážeme sloučení

V našem případě bude zákaz Merge spočívat v tom, že montážní potrubí vrátí chybu, pokud nebude dostatek hlasů.

Přejděte do Nastavení → Obecné → Požadavky na sloučení → Kontroly sloučení a povolte možnost Montážní linky musí úspěšně běžet.

Kontrola kódu v Gitlabu CE: pokud neexistují žádné schválení žádosti o sloučení, ale opravdu chci

4. Nastavte potrubí

Pokud jste pro svou aplikaci ještě nevytvořili kanál CI/CD
Vytvořte soubor v kořenovém adresáři úložiště .gitlab-ci.yml s jednoduchým obsahem:

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"

Samostatné úložiště pro konfiguraci CI/CD
Doporučil bych vytvořit samostatné úložiště, kde je potřeba vytvořit soubor myapp.gitlab-ci.yml pro nastavení kanálu. Tímto způsobem můžete lépe řídit přístup přispěvatelů, kteří mohou změnit kanál sestavení a získat přístupový token.

Umístění nového souboru potrubí bude nutné zadat tak, že přejdete do úložiště myapp - Nastavení - CI / CD - Montážní řádky - Vlastní konfigurační cesta CI - zadejte nový soubor, například myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci

Tip: K provádění změn v souborech GitLab CI použijte linter
I když pracujete sami, práce přes MR bude dobrým pomocníkem, který provede všechny vaše změny v souborech kanálu přes linter. Pokud uděláte chybu v syntaxi souboru YAML, neumožní vám to přerušit fungující kanál, ale jednoduše zablokuje Merge.

Příklad kontejnerů s linters, které můžete vložit do svého potrubí:

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

A příklad fáze ověřování:

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;

Zbývá přidat do kanálu několik parametrů, aby fungoval:

stages:
- test

variables:
NEED_VOTES: 1

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

Proměnná NEED_VOTES určuje, kolik "palců nahoru" musí mít MR, aby bylo sloučení dostupné. Hodnota jedna znamená, že vy sami můžete svůj MR schválit tím, že ho „lajknete“.

include zahrnuje testovací fázi, která kontroluje počet "lajků".

Nejjednodušší potrubí používající jako příklad 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

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

Další informace o tom, co se stane při kontrole:

  • je nastaveno omezení, že kontrola bude pouze při vytváření MR ve větvích master nebo release /*
  • pomocí GitLab API získejte počet „líbí se“ a „nelíbí se“
  • vypočítat rozdíl mezi kladnými a zápornými odpověďmi
  • pokud je rozdíl menší než hodnota, kterou jsme nastavili v NEED_VOTES, pak zablokujeme možnost sloučení

5. Deaktivujte commity do chráněných větví

Definujeme pobočky, pro které bychom měli provádět code review, a uvedeme, že s nimi lze pracovat pouze prostřednictvím MR.

Chcete-li to provést, přejděte do Nastavení → Úložiště → Chráněné větve:

Kontrola kódu v Gitlabu CE: pokud neexistují žádné schválení žádosti o sloučení, ale opravdu chci

6. Kontrola

Nastavit NEED_VOTES: 0

Děláme MR a dáme "nelíbí".

Kontrola kódu v Gitlabu CE: pokud neexistují žádné schválení žádosti o sloučení, ale opravdu chci

V protokolech sestavení:

Kontrola kódu v Gitlabu CE: pokud neexistují žádné schválení žádosti o sloučení, ale opravdu chci

Nyní dejte „like“ a spusťte znovu kontrolu:

Kontrola kódu v Gitlabu CE: pokud neexistují žádné schválení žádosti o sloučení, ale opravdu chci

Zdroj: www.habr.com

Přidat komentář