Viena no nepiecieÅ”amÄkajÄm funkcijÄm, kuras GitLab bezmaksas versijÄ nav, ir iespÄja balsot pret repozitorija anulÄÅ”anu un kontrolÄt sapludinÄÅ”anas pieprasÄ«jumu (MR), izmantojot obligÄto koda pÄrskatÄ«Å”anu.
MinimÄlo funkcionalitÄti veiksim paÅ”i ā Merge aizliegsim, kamÄr vairÄki izstrÄdÄtÄji MR neparÄdÄ«s Ä«kŔķi.
KÄpÄc tas vispÄr ir vajadzÄ«gs?
MÅ«su organizÄcija var viegli atļauties iegÄdÄties GitLab licenci. Bet, tÄ kÄ izstrÄde notiek slÄgtÄ kontÅ«rÄ bez piekļuves internetam un ir stingra budžeta plÄnoÅ”ana, paÅ”pÄrvaldÄ«to licenÄu iegÄde ar nepiecieÅ”amo funkcionalitÄti var ievilkties vairÄkus mÄneÅ”us, taÄu darbs ir jÄdara tagad.
RezultÄtÄ jums ir:
- vai pilnÄ«bÄ aizliegt Merge aizsargÄtÄs filiÄlÄs dažiem izstrÄdÄtÄjiem, bet tad izstrÄdÄtÄji, kuriem ir tiesÄ«bas apvienot, saÅem konfliktus, apvienojot citu cilvÄku MR kÄ bonusu;
- vai dodiet iespÄju veikt nekontrolÄtu sapludinÄÅ”anu ar savu galveno filiÄli bez koda pÄrskatÄ«Å”anas, pat ja tas ir Junior, kurÅ” tika pieÅemts darbÄ tikai vakar.
Pirmais, ko izdarÄ«ju, bija Google, uzskatot, ka kÄds noteikti jau kaut ko lÄ«dzÄ«gu ir izdarÄ«jis (bez koda modifikÄcijas), taÄu izrÄdÄ«jÄs, ka kopienas versijÄ tÄdas ievieÅ”anas vÄl nav.
VispÄrÄjÄ darba shÄma
PiemÄram, konfigurÄsim sapludinÄÅ”anas pieprasÄ«jumu apstiprinÄjumus testa repozitorijÄ
- Izveidosim tokenu piekļuvei GitLab API (caur to saÅemsim informÄciju par balsu skaitu "par" un "pret")
- Pievienosim marķieri GitLab mainīgajiem
- AtspÄjosim sapludinÄÅ”anu, ja konveijerÄ rodas kļūdas (ja nav pietiekami daudz pozitÄ«vu balsojumu)
- IestatÄ«sim balsojumu verifikÄciju kÄ daļu no CI/CD konveijera
- MÄs aizliedzam uzÅemties saistÄ«bas aizsargÄtÄs filiÄlÄs; visas izmaiÅas tiek veiktas tikai ar MR starpniecÄ«bu
- PÄrbaudÄ«sim, kas beigÄs notika
1. Izveidojiet pilnvaru, lai piekļūtu API
Dodieties uz LietotÄja iestatÄ«jumi ā Piekļuves pilnvaras un pierakstiet marÄ·ieri:
Konts marÄ·iera saÅemÅ”anai
API piekļuve ļauj ar savÄm krÄtuvÄm darÄ«t gandrÄ«z jebko, tÄpÄc iesaku izveidot atseviŔķu Gitlab kontu, pieŔķirot tam minimÄlas tiesÄ«bas uz jÅ«su krÄtuvÄm (piemÄram, Reporter) un iegÅ«t Å”im kontam marÄ·ieri.
2. Pievienojiet marķieri Gitlab mainīgajiem
PiemÄram, iepriekÅ”ÄjÄ darbÄ«bÄ mÄs saÅÄmÄm marÄ·ieri QmN2Y0NOUFlfeXhvd21ZS01aQzgK
Atveriet IestatÄ«jumi ā CI/CD ā MainÄ«gie ā Pievienot mainÄ«go ā GITLAB_TOKEN_FOR_CI
RezultÄtÄ mÄs iegÅ«stam:
To var izdarÄ«t vai nu vienÄ repozitorijÄ, vai repozitoriju grupÄ.
3. Uzliekam aizliegumu Merge, ja pÄc koda izskatÄ«Å”anas netiek saÅemts kolÄÄ£u apstiprinÄjums.
MÅ«su gadÄ«jumÄ sapludinÄÅ”anas aizliegums bÅ«s tÄds, ka montÄžas cauruļvads atgriezÄ«s kļūdu, ja nebÅ«s pietiekami daudz balsu.
Dodieties uz IestatÄ«jumi ā VispÄrÄ«gi ā SapludinÄÅ”anas pieprasÄ«jumi ā SapludinÄÅ”anas pÄrbaudes un iespÄjojiet opciju MontÄžas lÄ«nijÄm jÄpabeidz veiksmÄ«gi.
4. Cauruļvada uzstÄdÄ«Å”ana
Ja vÄl neesat izveidojis CI/CD konveijeru savai lietojumprogrammai
Izveidojiet failu repozitorija saknÄ .gitlab-ci.yml ar visvienkÄrÅ”Äko saturu:
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"
AtseviŔķs repozitorijs CI/CD konfigurÄcijai
Es ieteiktu izveidot atseviŔķu repozitoriju, kurÄ ir jÄizveido fails myapp.gitlab-ci.yml, lai konfigurÄtu konveijera. TÄdÄ veidÄ jÅ«s varat labÄk kontrolÄt to dalÄ«bnieku piekļuvi, kuri var mainÄ«t bÅ«vÄÅ”anas konveijeru un saÅemt piekļuves pilnvaru.
JaunÄ konveijera faila atraÅ”anÄs vieta bÅ«s jÄnorÄda, dodoties uz myapp repozitoriju - IestatÄ«jumi - CI/CD - MontÄžas lÄ«nijas - PielÄgotas CI konfigurÄcijas ceļŔ - norÄdiet jauno failu, piem. myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci
Padoms. Izmantojiet linteri, lai veiktu izmaiÅas GitLab CI failos
Pat ja strÄdÄjat vienatnÄ, darbs, izmantojot MR, bÅ«s labs palÄ«gs, veicot visas izmaiÅas konveijera failos, izmantojot lÄ«niju. Ja pieļausit kļūdu YAML faila sintaksÄ, tas nepÄrtrauks jÅ«su ražoÅ”anas cauruļvadu, bet vienkÄrÅ”i bloÄ·Äs sapludinÄÅ”anu.
PiemÄrs konteineriem ar ieliktÅiem, kurus varat iebÅ«vÄt savÄ cauruļvadÄ:
Un verifikÄcijas posma piemÄrs:
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;
Atliek savam cauruļvadam pievienot dažus parametrus, lai tas darbotos:
stages:
- test
variables:
NEED_VOTES: 1
include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"
MainÄ«gais NEED_VOTES nosaka, cik āÄ«kŔķiemā jÄbÅ«t MR, lai sapludinÄÅ”ana bÅ«tu pieejama. VÄrtÄ«ba, kas vienÄda ar vienu, nozÄ«mÄ, ka jÅ«s pats varat apstiprinÄt savu MR, atzÄ«mÄjot to ar āpatÄ«kā.
iekļaut ietver testa posmu, kurÄ tiek pÄrbaudÄ«ts āpatÄ«kā atzÄ«mju skaits.
VienkÄrÅ”Äkais cauruļvads, izmantojot myapp.gitlab-ci.yml piemÄru
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
Saturs 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/.*$/'
PlaÅ”Äka informÄcija par to, kas notiek verifikÄcijas laikÄ:
- ir ierobežojums, ka pÄrbaude tiks veikta tikai veidojot MR galvenajÄ vai release/* zaros
- izmantojot GitLab API, mÄs iegÅ«stam āpatÄ«kā un ānepatÄ«kā skaitu.
- aprÄÄ·inÄt atŔķirÄ«bu starp pozitÄ«vajÄm un negatÄ«vajÄm atbildÄm
- ja starpÄ«ba ir mazÄka par vÄrtÄ«bu, ko iestatÄ«jÄm NEED_VOTES, mÄs bloÄ·Äjam sapludinÄÅ”anas iespÄju
5. Aizliegt saistÄ«bas aizsargÄtajÄs filiÄlÄs
MÄs definÄjam filiÄles, kurÄm mums jÄveic kodu pÄrskatÄ«Å”ana, un norÄdÄm, ka ar tÄm var strÄdÄt tikai caur MR.
Lai to izdarÄ«tu, dodieties uz IestatÄ«jumi ā Repozitorijs ā AizsargÄtÄs filiÄles:
6. PÄrbaudiet
Iestatījums NEED_VOTES: 0
UztaisÄm MR un uzliekam ānepatÄ«kā.
BÅ«vniecÄ«bas žurnÄlos:
Tagad ielieciet "patÄ«k" un sÄciet pÄrbaudÄ«t vÄlreiz:
Avots: www.habr.com