Yksi vaadituimmista ominaisuuksista, jota ei ole GitLabin ilmaisessa versiossa, on mahdollisuus äänestää arkiston nollaamista vastaan yhdistämispyynnön (MR) hallitsemiseksi pakollisen koodintarkistuksen avulla.
Teemme itse vähimmäistoiminnot - poistamme Mergen käytöstä, kunnes useat kehittäjät pitävät "peukkua" MR:lle.
Miksi tämä ylipäätään on?
Organisaatiollamme on varaa ostaa GitLab-lisenssi. Mutta koska kehitys tapahtuu suljetussa silmukassa ilman Internet-yhteyttä ja budjettisuunnittelu on tiukkaa, itsehallittujen lisenssien ostaminen tarvittavilla toiminnoilla voi kestää useita kuukausia, ja sinun on työskenneltävä nyt.
Tämän seurauksena sinun on:
- tai kieltää kokonaan sulautumisen suojattuihin haaroihin joillekin kehittäjille, mutta silloin kehittäjät, joilla on oikeus yhdistää, saavat ristiriitoja yhdistäessään muiden ihmisten MR:itä bonuksena;
- tai antaa sinun tehdä hallitsemattomia yhdistämisiä päähaarasi kanssa ilman koodin tarkistusta, vaikka kyseessä olisi juniori, joka asettui juuri eilen.
Ensimmäinen asia, jonka tein, oli googlailla uskoen, että joku oli jo tehnyt jotain vastaavaa (tarkentamatta koodia), mutta kävi ilmi, että yhteisöversiossa ei vielä ollut sellaista toteutusta.
Yleinen työsuunnitelma
Esimerkkinä voidaan määrittää yhdistämispyyntöjen hyväksynnät testitietovarastoon
- Luodaan token GitLab API:lle pääsyä varten (sitä kautta saamme tietoa puolesta ja vastaan annettujen äänten määrästä)
- Lisää tunnus GitLab-muuttujiin
- Poista yhdistäminen käytöstä, jos käsittelyssä on virheitä (jos "puolta"-ääniä ei ole tarpeeksi)
- Määritä äänestystarkistus osana CI/CD-putkea
- Kiellämme sitoutumisen suojattuihin sivukonttoreihin, teemme kaikki muutokset vain MR:n kautta
- Katsotaan mitä lopulta tapahtui
1. Luo tunnus käyttääksesi API:a
Siirry kohtaan Käyttäjäasetukset → Käyttöoikeudet ja kirjoita tunnus muistiin:
Tili tunnuksen vastaanottamiseen
API-pääsyn avulla voit tehdä melkein mitä tahansa arkistoillasi, joten suosittelen, että luot erillisen Gitlab-tilin, annat sille vähimmäisoikeudet arkistoihin (kuten Reporter) ja hankit tunnuksen kyseiselle tilille.
2. Lisää tunnus Gitlabin muuttujiin
Esimerkiksi edellisessä vaiheessa saimme tunnuksen QmN2Y0NOUFlfeXhvd21ZS01aQzgK
Avaa Asetukset → CI/CD → Muuttujat → Lisää muuttuja → GITLAB_TOKEN_FOR_CI
Tuloksena saamme:
Tämä voidaan tehdä sekä yhdelle arkistolle että arkiston ryhmälle.
3. Asetamme Merge-kiellon, jos kollegoilta ei saada hyväksyntää kooditarkistuksen jälkeen
Meidän tapauksessamme Merge-kielto on se, että kokoonpanoputki palauttaa virheen, jos ääniä ei ole tarpeeksi.
Siirry kohtaan Asetukset → Yleiset → Yhdistämispyynnöt → Yhdistämistarkastukset ja ota käyttöön vaihtoehto Kokoonpanolinjojen tulee toimia onnistuneesti.
4. Asenna putkisto
Jos et ole vielä tehnyt CI/CD-putkia sovelluksellesi
Luo tiedosto arkiston juureen .gitlab-ci.yml yksinkertaisella sisällöllä:
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"
Erillinen arkisto CI/CD-kokoonpanoa varten
Suosittelen erillisen arkiston luomista, jossa sinun on luotava myapp.gitlab-ci.yml-tiedosto liukuhihnan määrittämistä varten. Tällä tavalla voit hallita paremmin sellaisten avustajien pääsyä, jotka voivat muuttaa koontiprosessia ja saada käyttöoikeustunnuksen.
Uuden liukuhihnatiedoston sijainti on määritettävä menemällä myapp-tietovarastoon - Asetukset - CI / CD - Kokoonpanolinjat - Mukautettu CI-määrityspolku - määritä uusi tiedosto, esim. myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci
Vinkki: Käytä linteriä tehdäksesi muutoksia GitLab CI -tiedostoihin
Vaikka työskentelet yksin, MR:n kautta työskentely on hyvä apulainen, joka suorittaa kaikki muutokset liukuhihnatiedostoihin linterin kautta. Jos teet virheen YAML-tiedoston syntaksissa, tämä ei anna sinun katkaista toimivaa liukuhihnaa, vaan se yksinkertaisesti estää yhdistämisen.
Esimerkki säiliöistä, joissa on linterit ja jotka voit upottaa putkistoon:
Ja esimerkki validointivaiheesta:
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;
Sinun on lisättävä putkistoon muutama parametri, jotta se toimii:
stages:
- test
variables:
NEED_VOTES: 1
include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"
NEED_VOTES-muuttuja määrittää, kuinka monta "peukkua" MR:llä on oltava, jotta Merge on käytettävissä. Arvo yksi tarkoittaa, että voit itse hyväksyä MR:si "tykkäämällä".
include sisältää testivaiheen, joka tarkistaa "tykkäysten" määrän.
Yksinkertaisin putki, jossa käytetään esimerkkinä 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
Tiedoston check-approve.gitlab-ci.yml sisältö
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/.*$/'
Lisätietoja siitä, mitä tarkistuksen yhteydessä tapahtuu:
- rajoitus on asetettu, että tarkistus tehdään vain luotaessa MR:ää isäntä- tai release /*-haaroihin
- GitLab API:n avulla saat "tykkäyksiä" ja "ei-tykkäyksiä"
- laske positiivisten ja negatiivisten vastausten välinen ero
- jos ero on pienempi kuin arvo, jonka asetimme kohdassa NEED_VOTES, estämme yhdistämismahdollisuuden
5. Poista suojattujen haarojen sitoumukset käytöstä
Määritämme haarat, joille meidän tulee suorittaa kooditarkistus, ja ilmoitamme, että niitä voidaan käsitellä vain MR:n kautta.
Voit tehdä tämän siirtymällä kohtaan Asetukset → Arkisto → Suojatut haarat:
6. Tarkistaminen
Aseta NEED_VOTES: 0
Teemme MR:n ja laitamme "en pidä".
Rakennuslokeissa:
Laita nyt "tykkää" ja tarkista uudelleen:
Lähde: will.com