Koodin tarkistus Gitlab CE:ssä: jos yhdistämispyyntöjen hyväksyntöjä ei ole, mutta haluan todella

Koodin tarkistus Gitlab CE:ssä: jos yhdistämispyyntöjen hyväksyntöjä ei ole, mutta haluan todella

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

  1. Luodaan token GitLab API:lle pääsyä varten (sitä kautta saamme tietoa puolesta ja vastaan ​​annettujen äänten määrästä)
  2. Lisää tunnus GitLab-muuttujiin
  3. Poista yhdistäminen käytöstä, jos käsittelyssä on virheitä (jos "puolta"-ääniä ei ole tarpeeksi)
  4. Määritä äänestystarkistus osana CI/CD-putkea
  5. Kiellämme sitoutumisen suojattuihin sivukonttoreihin, teemme kaikki muutokset vain MR:n kautta
  6. 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:

Koodin tarkistus Gitlab CE:ssä: jos yhdistämispyyntöjen hyväksyntöjä ei ole, mutta haluan todella

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

Koodin tarkistus Gitlab CE:ssä: jos yhdistämispyyntöjen hyväksyntöjä ei ole, mutta haluan todella

Tuloksena saamme:

Koodin tarkistus Gitlab CE:ssä: jos yhdistämispyyntöjen hyväksyntöjä ei ole, mutta haluan todella

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.

Koodin tarkistus Gitlab CE:ssä: jos yhdistämispyyntöjen hyväksyntöjä ei ole, mutta haluan todella

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:

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

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:

Koodin tarkistus Gitlab CE:ssä: jos yhdistämispyyntöjen hyväksyntöjä ei ole, mutta haluan todella

6. Tarkistaminen

Aseta NEED_VOTES: 0

Teemme MR:n ja laitamme "en pidä".

Koodin tarkistus Gitlab CE:ssä: jos yhdistämispyyntöjen hyväksyntöjä ei ole, mutta haluan todella

Rakennuslokeissa:

Koodin tarkistus Gitlab CE:ssä: jos yhdistämispyyntöjen hyväksyntöjä ei ole, mutta haluan todella

Laita nyt "tykkää" ja tarkista uudelleen:

Koodin tarkistus Gitlab CE:ssä: jos yhdistämispyyntöjen hyväksyntöjä ei ole, mutta haluan todella

Lähde: will.com

Lisää kommentti