Koade beoardieling yn Gitlab CE: as der gjin Merge fersyk goedkarring, mar ik echt wol

Koade beoardieling yn Gitlab CE: as der gjin Merge fersyk goedkarring, mar ik echt wol

Ien fan 'e meast nedige funksjes, dy't net yn' e fergese ferzje fan GitLab is, is de mooglikheid om te stimmen tsjin repository-nullifikaasje en kontrôle Merge request (MR), mei help fan de ferplichte koadebeoardieling.

Litte wy sels de minimale funksjonaliteit dwaan - wy sille Merge ferbiede oant ferskate ûntwikkelders MR in thumbs up jouwe.

Wêrom is dit hielendal?

Us organisaasje kin maklik betelje om in GitLab-lisinsje te keapjen. Mar, om't ûntwikkeling wurdt útfierd yn in sletten lus sûnder tagong ta ynternet, en d'r is strikte budzjetplanning, kin de oankeap fan selsbehearde lisinsjes mei de nedige funksjonaliteit in protte moannen slepe, mar no moat it wurk dien wurde.

As gefolch moatte jo:

  • of folslein ferbiede Fúzje yn beskerme tûken foar guon ûntwikkelders, mar dan ûntwikkelders dy't it rjocht hawwe om te fusearjen krije konflikten by it fusearjen fan MR's fan oare minsken as bonus;
  • of jou de mooglikheid om uncontrolled fúzjes mei jo master tûke sûnder koade review, sels as it is Junior, dy't waard ynhierd krekt juster.

It earste wat ik die wie Google, yn 'e leauwige dat ien perfoarst al wat ferlykber dien hie (sûnder de koade te feroarjen), mar it die bliken dat d'r noch gjin sa'n ymplemintaasje wie yn 'e mienskipferzje.

Algemiene skema fan wurk

Litte wy as foarbyld de goedkarring fan Merge-fersyk konfigurearje op in testrepository myapp:

  1. Litte wy in token meitsje foar tagong ta de GitLab API (troch it krije wy ynformaasje oer it oantal stimmen "foar" en "tsjin")
  2. Litte wy it token tafoegje oan de GitLab-fariabelen
  3. Litte wy Merge útskeakelje yn gefal fan flaters yn 'e pipeline (as d'r net genôch upvotes binne)
  4. Litte wy stimferifikaasje ynstelle as ûnderdiel fan 'e CI / CD-pipeline
  5. Wy ferbiede it meitsjen fan commits foar beskerme tûken; alle wizigingen wurde allinich makke fia MR
  6. Litte wy kontrolearje wat der úteinlik bard is

1. Meitsje in token om tagong te krijen ta de API

Gean nei Brûkerynstellingen → Tokens tagong en skriuw it token op:

Koade beoardieling yn Gitlab CE: as der gjin Merge fersyk goedkarring, mar ik echt wol

Account om in token te ûntfangen
API-tagong lit jo hast alles dwaan mei jo repositories, dus ik advisearje it meitsjen fan in apart Gitlab-akkount, it jaan fan minimale rjochten foar jo repositories (bgl. Reporter) en in token krije foar dat akkount.

2. Foegje de token ta oan de Gitlab fariabelen

Bygelyks, yn 'e foarige stap krigen wy in token QmN2Y0NOUFlfeXhvd21ZS01aQzgK

Iepenje Ynstellings → CI/CD → Fariabelen → Fariabel taheakje → GITLAB_TOKEN_FOR_CI

Koade beoardieling yn Gitlab CE: as der gjin Merge fersyk goedkarring, mar ik echt wol

As gefolch krije wy:

Koade beoardieling yn Gitlab CE: as der gjin Merge fersyk goedkarring, mar ik echt wol

Dit kin dien wurde op ien repository of op in groep repositories.

3. Wy sette in ferbod op Merge as de goedkarring fan kollega is net ûntfongen nei de koade review.

Yn ús gefal sil it ferbod op Merge wêze dat de montagepipeline in flater werombringt as der net genôch stimmen binne.

Gean nei Ynstellings → Algemien → Fersiken gearfoegje → Kontrôles gearfoegje en aktivearje de opsje Assembly rigels moatte suksesfol foltôgje.

Koade beoardieling yn Gitlab CE: as der gjin Merge fersyk goedkarring, mar ik echt wol

4. It opsetten fan de pipeline

As jo ​​​​noch gjin CI / CD-pipeline hawwe makke foar jo applikaasje
Meitsje in bestân yn 'e root fan it repository .gitlab-ci.yml mei de ienfâldichste ynhâld:

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"

Separate repository foar CI / CD konfiguraasje
Ik soe riede in aparte repository te meitsjen wêryn jo in myapp.gitlab-ci.yml-bestân moatte oanmeitsje om de pipeline te konfigurearjen. Op dizze manier kinne jo de tagong fan dielnimmers better kontrolearje dy't de buildpipeline kinne feroarje en in tagongstoken krije.

De lokaasje fan it nije pipeline-bestân sil moatte wurde opjûn troch te gean nei it myapp-repository - Ynstellings - CI / CD - Assembly rigels - Oanpaste CI-konfiguraasjepaad - spesifisearje it nije bestân, bgl. myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci

Tip: Brûk in linter om wizigingen te meitsjen oan GitLab CI-bestannen
Sels as jo allinich wurkje, sil wurkje fia MR in goede help wêze, al jo wizigingen yn pipelinebestannen troch in linter útfiere. As jo ​​​​in flater meitsje yn 'e syntaksis fan it YAML-bestân, sil it jo produksjepipeline net brekke, mar sil gewoan Merge blokkearje.

In foarbyld fan konteners mei linters dy't jo yn jo pipeline kinne bouwe:

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

En in foarbyld fan it ferifikaasjestadium:

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;

It bliuwt om in pear parameters ta te foegjen oan jo pipeline om it te wurkjen:

stages:
- test

variables:
NEED_VOTES: 1

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

De NEED_VOTES fariabele bepaalt hoefolle "thumbs up" MR moat hawwe om Merge beskikber te wêzen. In wearde gelyk oan ien betsjut dat jo sels jo MR goedkarre kinne troch it te "liken".

omfettet it testpoadium, dat it oantal "likes" kontrolearret.

De ienfâldichste pipeline mei it foarbyld fan 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

Ynhâld 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/.*$/'

Mear ynformaasje oer wat der bart by ferifikaasje:

  • der is in beheining dat de kontrôle wurdt allinnich dien by it meitsjen fan MR yn de master of release / * tûken
  • mei de GitLab API krije wy it oantal "likes" en "dislikes"
  • berekkenje it ferskil tusken positive en negative reaksjes
  • as it ferskil minder is dan de wearde dy't wy yn NEED_VOTES ynsteld hawwe, blokkearje wy de mooglikheid om te fusearjen

5. Ferbiede commits oan beskerme tûken

Wy definiearje de tûken wêrfoar wy koadebeoardielingen moatte fiere en jouwe oan dat se allinich fia MR kinne wurde wurke.

Om dit te dwaan, gean nei Ynstellings → Repository → Beskerme tûken:

Koade beoardieling yn Gitlab CE: as der gjin Merge fersyk goedkarring, mar ik echt wol

6. Kontrolearje

Set NEED_VOTES: 0

Wy meitsje in MR en sette in "dislike".

Koade beoardieling yn Gitlab CE: as der gjin Merge fersyk goedkarring, mar ik echt wol

Yn de boulogs:

Koade beoardieling yn Gitlab CE: as der gjin Merge fersyk goedkarring, mar ik echt wol

Set no "like" en begjin opnij te kontrolearjen:

Koade beoardieling yn Gitlab CE: as der gjin Merge fersyk goedkarring, mar ik echt wol

Boarne: www.habr.com

Add a comment