
Ă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. :
- Loome API-juurdepÀÀsuks tokeni GitLabis (selle kaudu saame teavet âpooltâ ja âvastuâ hÀÀli).
- Lisame tokeni GitLabi muutujatesse.
- Keelame Merge, kui tootmisprotsessis on vigu (kui hÀÀli âpooltâ on liiga vĂ€he).
- Seame hÀÀletamise kontrolli CI/CD tootmisprotsessi osaks.
- Keelame kaitstud harudesse commit'i tegemise, kÔik muudatused tehakse ainult MRide kaudu.
- Kontrollime, mis meil lÔpuks vÀlja tuli.
1. Loome API-juurdepÀÀsu tokeni.
Siseneme Kasutaja seadistustesse â JuurdepÀÀsutokenid ja kirjutame tokeni ĂŒles:

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

LÔpuks saame:

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'.

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:
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:

6. Kontrollime
Seame NEED_VOTES: 0
Teeme MR ja paneme «mitte-meeldib».

Kogumise logides:

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

Allikas: habr.com
