Koodikontroll Gitlab CE-s: kui Merge request'i kinnitust ei ole, aga vÀga tahaks

Koodikontroll Gitlab CE-s: kui Merge request'i kinnitust ei ole, aga vÀga tahaks

Üks tasuta GitLabi versioonis puuduvatest kĂ”ige vajalikumatest funktsioonidest on vĂ”imalus hÀÀletada repositoriumi nullimise vastu, kontrollides Merge requesti (MR) kohustusliku koodivaatamise abil.

Loome minimaalset funktsionaalsust ise – keelame Merge, kuni mitu arendajat ei ole pannud MR-ile â€žĂŒlemise sĂ”rme”.

Miks see ĂŒldse vajalik on?

Meie organisatsioon suudab endale lubada GitLabi litsentsi ostmist. Kuid kuna arendustööd tehakse suletud keskkonnas ilma internetiĂŒhenduseta ning eelarve planeerimine on rangelt reguleeritud, vĂ”ib litsentside ostmine vajalikku funktsionaalsust haldaval viisil kesta mitu kuud, kuid tööle tuleb hakata juba praegu.

Tuleb leppida, et:

  • kas keelatakse Merge kaitstud harudesse osadele arendajatele tĂ€iesti, kuid siis saavad need arendajad, kellel on Merge'i Ă”igus, boonuseks konfliktid teiste MR-ide liitmisel;
  • vĂ”i antakse vĂ”imalus teha kontrollimatuid liitumisi teie peamisse harusse ilma koodivaatamiseta, isegi kui see on alles eile tööle tĂ”usnud noor arendaja.

Esimese asjana hakkasin Google'it kasutama, arvestades, et kindlasti on keegi midagi sarnast juba teinud (ilma koodi tÀiendamata), kuid selgus, et sellist lahendust kogukonna versioonis polnud veel olnud.

Üldine tööprotsess

VÔtame nÀiteks Merge requesti kinnitused testrepositoriosse seadistamise. myapp:

  1. Loome API-juurdepÀÀsuks tokeni GitLabis (selle kaudu saame teavet „poolt” ja „vastu” hÀÀli).
  2. Lisame tokeni GitLabi muutujatesse.
  3. Keelame Merge, kui tootmisprotsessis on vigu (kui hÀÀli „poolt” on liiga vĂ€he).
  4. Seame hÀÀletamise kontrolli CI/CD tootmisprotsessi osaks.
  5. Keelame kaitstud harudesse commit'i tegemise, kÔik muudatused tehakse ainult MRide kaudu.
  6. Kontrollime, mis meil lÔpuks vÀlja tuli.

1. Loome API-juurdepÀÀsu tokeni.

Siseneme Kasutaja seadistustesse → JuurdepÀÀsutokenid ja kirjutame tokeni ĂŒles:

Koodikontroll Gitlab CE-s: kui Merge request'i kinnitust ei ole, aga vÀga tahaks

Konto tokeni saamiseks.
API-juurdepÀÀs vÔimaldab peaaegu kÔike teie repositoritega teha, seetÔttu soovitan luua eraldi GitLabi konto, anda sellele minimaalset Ôigust teie repositoritele (nÀiteks Reporter) ja saada token selle konto jaoks.

2. Lisame tokeni GitLabi muutjatesse.

NĂ€iteks eelmisel sammul saime tokeni. QmN2Y0NOUFlfeXhvd21ZS01aQzgK

Avame Seaded → CI/CD → Muutujad → Lisa muutuja → GITLAB_TOKEN_FOR_CI

Koodikontroll Gitlab CE-s: kui Merge request'i kinnitust ei ole, aga vÀga tahaks

LÔpuks saame:

Koodikontroll Gitlab CE-s: kui Merge request'i kinnitust ei ole, aga vÀga tahaks

Seda saab teha nii ĂŒhes hoidlas kui ka hulgi hoidlates.

3. Paneme merge'i keeldu, kui kolleegide heakskiitu ei saadud pÀrast koodivaatlust.

Meie puhul tÀhendab merge'i keeld seda, et kogumise konveier tagastab vea, kui hÀÀli on liiga vÀhe.

Siseneme Seaded → Üldine → Ühinemise taotlused → Ühinemise kontrollid ja lĂŒlitame sisse valiku 'Kogumislid peaksid olema edukalt lĂ”pule viidud'.

Koodikontroll Gitlab CE-s: kui Merge request'i kinnitust ei ole, aga vÀga tahaks

4. Seame pipeline'i

Kui te pole veel oma rakenduse CI/CD konveierit loonud
Loome hoidla juures faili .gitlab-ci.yml lihtsa sisuga:

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 "Tere maailm"

Eraldi hoidla CI/CD konfiguratsiooni jaoks
Soovitan luua eraldi hoidla, kus on vajalik luua fail myapp.gitlab-ci.yml konveieri seadistamiseks. Nii saate paremini kontrollida osalejate juurdepÀÀsu, kes saavad konveieri koostamist muuta ja pÀÀsukoodi saada.

Uue konveieri faili asukoht tuleb mÀÀrata, minnes hoidla myapp — Seaded — CI/CD — Kogumislid — Kohandatud CI konfiguratsiooni tee — mĂ€rkida uus fail, nĂ€iteks myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci

NÀpunÀide: kasutage linterit, et muuta GitLab CI-faile
Isegi kui töötate ĂŒksi, on kasulik töötada MR kaudu, lastes kĂ”ik oma konveieri muudatused lĂ€bi linteri. Kui teete YAML-faili sĂŒntaksivigu, ei riku see teie töökonveierit, vaid lihtsalt blokeerib merge'i.

NĂ€ide linteritest, mida saate oma konveierisse inteerida:

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

Ja nÀide kontrolli etapist:

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;

Rohkem tuleb teie konveierisse lisada mÔned parameetrid, et kÔik toimiks:

etapid:
- test

variables:
NEED_VOTES: 1

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

Muutuja NEED_VOTES mÀÀrab, kui palju "ĂŒlestĂ”usmisi" peab MR-l olema, et merge oleks vĂ”imalik. Üks vÀÀrtus tĂ€hendab, et saate ise oma MR-i heaks kiita, "meeldides" sellele.

include ĂŒhendab testi etapi, mis kontrollib "meeldimiste" arvu.

Lihtne töövoog myapp.gitlab-ci.yml nÀitel
etapid:
- ehitada
- 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
skeem:
- echo CI_MERGE_REQUEST_TARGET_BRANCH_NAME $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
- java HelloWorld.java

Sisu check-approve.gitlab-ci.yml
ci-mr:
etapp: test
skeem:
- 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} Üles hÀÀled = 1, alla hÀÀled = -1, MR OK kui hÀÀled >=${NEED_VOTES_REAL}"
- if [ "${MR_VOTES}" -ge "$(expr ${NEED_VOTES_REAL})" ];
siis
echo "MR OK";
muul juhul
echo "MR VIGA: Vaja rohkem hÀÀli";
exit 1;
fi
pilt: laptevss\/gitlab-api-util
reeglid:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ \/^release\/.*$\/'

Lisainfot selle kohta, mis toimub kontrollimise ajal:

  • on seatud piirang, et kontroll toimub ainult siis, kui MR luuakse harudesse master vĂ”i release/*
  • kasutades GitLab API-d, saame teada «meeldimiste» ja «mitte-meeldimiste» arvu
  • arvutame positiivsete ja negatiivsete tagasiside vahe
  • kui vahe on vĂ€iksem, kui meie poolt mÀÀratud vÀÀrtus NEED_VOTES, siis blokeerime sulgemise vĂ”imaluse

5. Keelame commit'id kaitstud harudesse

MÀÀrame harud, mille puhul peame teostama koodikontrolli ja mÀrkime, et nendega saab töötada ainult MR-i kaudu.

Selleks liigume Seaded → Repositorium → Kaitstud harud:

Koodikontroll Gitlab CE-s: kui Merge request'i kinnitust ei ole, aga vÀga tahaks

6. Kontrollime

Seame NEED_VOTES: 0

Teeme MR ja paneme «mitte-meeldib».

Koodikontroll Gitlab CE-s: kui Merge request'i kinnitust ei ole, aga vÀga tahaks

Kogumise logides:

Koodikontroll Gitlab CE-s: kui Merge request'i kinnitust ei ole, aga vÀga tahaks

NĂŒĂŒd paneme «meeldib» ja kĂ€ivitame uuesti kontrolli:

Koodikontroll Gitlab CE-s: kui Merge request'i kinnitust ei ole, aga vÀga tahaks

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster