Az egyik legszükségesebb szolgáltatás, amely nem szerepel a GitLab ingyenes verziójában, az a képesség, hogy a lerakat nullázása ellen szavazzunk, hogy az összevonási kérelmet (MR) a kötelező kódellenőrzés segítségével vezérelhessük.
A minimális funkcionalitást magunk végezzük el – letiltjuk a Merge funkciót mindaddig, amíg több fejlesztő fel nem tartja az MR-t.
Miért van ez egyáltalán?
Szervezetünk megengedheti magának, hogy GitLab licencet vásároljon. De mivel a fejlesztés zárt körben, internet-hozzáférés nélkül zajlik, és szigorú költségvetési tervezés van, a szükséges funkcionalitással rendelkező, önállóan kezelt licencek beszerzése több hónapig is eltarthat, és most dolgozni kell.
Ennek eredményeként a következőket kell tennie:
- vagy teljesen megtiltja egyes fejlesztők számára a Merge-t védett ágakba, de ilyenkor azok a fejlesztők, akiknek joguk van egyesíteni, ütközéseket kapnak, amikor mások MR-eit egyesítik bónuszként;
- vagy lehetővé teszi, hogy ellenőrizetlen összevonásokat hajtson végre a fő ággal a kód áttekintése nélkül, még akkor is, ha egy Juniorról van szó, aki éppen tegnap telepedett le.
Az első dolgom volt, hogy rákerestem a google-ra, mert azt hittem, hogy valaki már csinált hasonlót (a kód finomítása nélkül), de kiderült, hogy a közösségi verzióban még nincs ilyen megvalósítás.
Általános munkaséma
Példaként állítsuk be az összevonási kérelmek jóváhagyását egy teszttárban
- Készítsünk egy tokent a GitLab API eléréséhez (rajta keresztül kapunk információt a pro és a kontra szavazatok számáról)
- Adjon hozzá egy tokent a GitLab-változókhoz
- Kapcsolja ki az Egyesítést, ha hibák vannak a folyamatban (ha nincs elég „mellette” szavazat)
- Szavazatérvényesítés beállítása a CI/CD folyamat részeként
- A védett ágakra vonatkozó kötelezettségvállalást megtiltjuk, minden változtatást csak az MR-en keresztül hajtunk végre
- Nézzük meg, mi történt a végén
1. Hozzon létre egy tokent az API eléréséhez
Nyissa meg a Felhasználói beállítások → Hozzáférési tokenek menüpontot, és írja le a tokent:
Fiók a token fogadásához
Az API-hozzáféréssel szinte bármit megtehetsz a tárolóiddal, ezért azt javaslom, hogy hozz létre egy külön Gitlab-fiókot, adj neki minimális jogokat a tárolóidhoz (például a Reporterhez), és szerezz be egy tokent a fiókhoz.
2. Adja hozzá a tokent a Gitlab változókhoz
Például az előző lépésben kaptunk egy tokent QmN2Y0NOUFlfeXhvd21ZS01aQzgK
Nyissa meg a Beállítások → CI/CD → Változók → Változó hozzáadása → lehetőséget GITLAB_TOKEN_FOR_CI
Ennek eredményeként a következőket kapjuk:
Ez egy lerakaton és lerakatcsoporton is megtehető.
3. Betiltjuk a Merge-et, ha a kód áttekintése után nem érkezik meg a kollégák jóváhagyása
Esetünkben a Merge tiltása az lesz, hogy az assembly pipeline hibát ad vissza, ha nincs elég szavazat.
Lépjen a Beállítások → Általános → Egyesítési kérelmek → Egyesítési ellenőrzések menüpontra, és engedélyezze az Összeállítási vonalaknak sikeresen futniuk kell opciót.
4. Állítsa be a csővezetéket
Ha még nem készített CI/CD folyamatot az alkalmazásához
Hozzon létre egy fájlt a tároló gyökerében .gitlab-ci.yml egyszerű tartalommal:
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"
Külön tároló a CI/CD konfigurációhoz
Azt javaslom, hogy készítsen egy külön tárolót, ahol létre kell hoznia egy myapp.gitlab-ci.yml fájlt a folyamat beállításához. Így jobban szabályozhatja azon közreműködők hozzáférését, akik módosíthatják az összeállítási folyamatot, és hozzáférési jogkivonatot kaphatnak.
Az új folyamatfájl helyét meg kell adni a myapp tárolójában - Beállítások - CI / CD - Összeszerelő sorok - Egyéni CI konfigurációs útvonal - adjon meg egy új fájlt, pl. myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci
Tipp: Használjon lintert a GitLab CI-fájlok módosításához
Még akkor is, ha egyedül dolgozik, az MR-en keresztüli munka jó segítőtárs lesz, mivel a csővezeték-fájlok minden módosítását a linteren keresztül futtatja. Ha hibát vét a YAML fájl szintaxisában, ez nem teszi lehetővé a működő folyamat megszakítását, hanem egyszerűen blokkolja az összevonást.
Példa a csővezetékbe beágyazható linterekkel ellátott tárolókra:
És egy példa az érvényesítési szakaszra:
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;
A működéshez hozzá kell adni néhány paramétert a folyamathoz:
stages:
- test
variables:
NEED_VOTES: 1
include:
- remote: "https://gitlab.com/gitlab-ce-mr-approvals/ci/-/raw/master/check-approve.gitlab-ci.yml"
A NEED_VOTES változó határozza meg, hogy az MR-nek hány „tetszik”-nek kell lennie ahhoz, hogy a Merge elérhető legyen. Az egy érték azt jelenti, hogy te magad is jóváhagyhatod az MR-edet, ha „lájkolod”.
include tartalmazza a teszt szakaszt, amely ellenőrzi a "lájkok" számát.
A legegyszerűbb folyamat a myapp.gitlab-ci.yml használatával példaként
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
A check-approve.gitlab-ci.yml tartalma
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/.*$/'
További információ arról, hogy mi történik az ellenőrzés során:
- a korlátozás be van állítva, hogy az ellenőrzés csak akkor lesz, ha MR-t hoz létre a master vagy a release /* ágban
- a GitLab API használatával kapja meg a "tetszik" és a "nem tetszik" számot
- Számítsa ki a pozitív és negatív válaszok közötti különbséget
- ha a különbség kisebb, mint a NEED_VOTES-ban beállított érték, akkor blokkoljuk az összevonás lehetőségét
5. Tiltsa le a védett ágakra vonatkozó véglegesítést
Meghatározzuk azokat az ágakat, amelyekre vonatkozóan kódellenőrzést kell végeznünk, és jelezzük, hogy ezekkel csak MR-en keresztül lehet dolgozni.
Ehhez lépjen a Beállítások → Tárhely → Védett ágak menüpontba:
6. Ellenőrzés
NEED_VOTES beállítása: 0
Csinálunk MR-t és teszünk egy "nem tetszik".
Az építési naplókban:
Most nyomd meg a "tetszik"-t, és ellenőrizd újra:
Forrás: will.com