Αναθεώρηση κώδικα στο Gitlab CE: εάν δεν υπάρχουν εγκρίσεις αιτημάτων συγχώνευσης, αλλά το θέλω πολύ

Αναθεώρηση κώδικα στο Gitlab CE: εάν δεν υπάρχουν εγκρίσεις αιτημάτων συγχώνευσης, αλλά το θέλω πολύ

Μία από τις πιο απαραίτητες λειτουργίες που δεν υπάρχει στη δωρεάν έκδοση του GitLab είναι η δυνατότητα να καταψηφίσετε τον μηδενισμό του αποθετηρίου για τον έλεγχο του αιτήματος συγχώνευσης (MR) χρησιμοποιώντας την υποχρεωτική αναθεώρηση κώδικα.

Θα κάνουμε μόνοι μας την ελάχιστη λειτουργικότητα - θα απενεργοποιήσουμε τη συγχώνευση έως ότου αρκετοί προγραμματιστές δώσουν ένα "μπράβο" στον MR.

Γιατί είναι αυτό καθόλου;

Ο οργανισμός μας έχει την οικονομική δυνατότητα να αγοράσει μια άδεια GitLab. Όμως, δεδομένου ότι η ανάπτυξη πραγματοποιείται σε κλειστό βρόχο χωρίς πρόσβαση στο Διαδίκτυο και υπάρχει αυστηρός προγραμματισμός προϋπολογισμού, η αγορά αυτοδιαχειριζόμενων αδειών με την απαραίτητη λειτουργικότητα μπορεί να διαρκέσει πολλούς μήνες και πρέπει να εργαστείτε τώρα.

Ως αποτέλεσμα, πρέπει να:

  • ή να απαγορεύσει εντελώς τη Συγχώνευση σε προστατευμένους κλάδους για ορισμένους προγραμματιστές, αλλά στη συνέχεια οι προγραμματιστές που έχουν το δικαίωμα Συγχώνευσης λαμβάνουν διενέξεις όταν συγχωνεύουν τα MR άλλων ατόμων ως μπόνους.
  • ή σας επιτρέπουν να κάνετε ανεξέλεγκτες συγχωνεύσεις με το κύριο υποκατάστημά σας χωρίς έλεγχο κώδικα, ακόμα κι αν πρόκειται για Junior που μόλις εγκαταστάθηκε χθες.

Το πρώτο πράγμα που έκανα ήταν να πάω στο google, πιστεύοντας ότι κάποιος είχε ήδη κάνει κάτι παρόμοιο (χωρίς να βελτιώσω τον κώδικα), αλλά αποδείχτηκε ότι δεν υπήρχε ακόμη τέτοια υλοποίηση στην έκδοση της κοινότητας.

Γενικό πρόγραμμα εργασίας

Για παράδειγμα, ας ρυθμίσουμε τις εγκρίσεις αιτημάτων συγχώνευσης σε ένα δοκιμαστικό αποθετήριο myapp:

  1. Ας δημιουργήσουμε ένα διακριτικό για πρόσβαση στο GitLab API (μέσω αυτού θα λάβουμε πληροφορίες σχετικά με τον αριθμό των ψήφων υπέρ και κατά)
  2. Προσθέστε ένα διακριτικό στις μεταβλητές GitLab
  3. Απενεργοποιήστε τη συγχώνευση εάν υπάρχουν σφάλματα στη διαδικασία (εάν δεν υπάρχουν αρκετές ψήφοι υπέρ)
  4. Ρυθμίστε την επικύρωση ψήφου ως μέρος του αγωγού CI/CD
  5. Θα απαγορεύσουμε τη δέσμευση για προστατευμένα υποκαταστήματα, κάνουμε όλες τις αλλαγές μόνο μέσω MR
  6. Ας δούμε τι έγινε στο τέλος

1. Δημιουργήστε ένα διακριτικό για πρόσβαση στο API

Μεταβείτε στις Ρυθμίσεις χρήστη → Πρόσβαση σε διακριτικά και σημειώστε το διακριτικό:

Αναθεώρηση κώδικα στο Gitlab CE: εάν δεν υπάρχουν εγκρίσεις αιτημάτων συγχώνευσης, αλλά το θέλω πολύ

Λογαριασμός για να λάβετε το διακριτικό
Η πρόσβαση API σάς επιτρέπει να κάνετε σχεδόν τα πάντα με τα αποθετήρια σας, γι' αυτό σας προτείνω να δημιουργήσετε έναν ξεχωριστό λογαριασμό Gitlab, να του δώσετε ελάχιστα δικαιώματα στα αποθετήρια σας (όπως το Reporter) και να λάβετε ένα διακριτικό για αυτόν τον λογαριασμό.

2. Προσθέστε το διακριτικό στις μεταβλητές Gitlab

Για παράδειγμα, στο προηγούμενο βήμα, λάβαμε ένα διακριτικό QmN2Y0NOUFlfeXhvd21ZS01aQzgK

Ανοίξτε τις Ρυθμίσεις → CI/CD → Μεταβλητές → Προσθήκη μεταβλητής → GITLAB_TOKEN_FOR_CI

Αναθεώρηση κώδικα στο Gitlab CE: εάν δεν υπάρχουν εγκρίσεις αιτημάτων συγχώνευσης, αλλά το θέλω πολύ

Ως αποτέλεσμα, παίρνουμε:

Αναθεώρηση κώδικα στο Gitlab CE: εάν δεν υπάρχουν εγκρίσεις αιτημάτων συγχώνευσης, αλλά το θέλω πολύ

Αυτό μπορεί να γίνει τόσο σε ένα αποθετήριο όσο και σε μια ομάδα αποθετηρίων.

3. Βάζουμε απαγόρευση στο Merge εάν δεν ληφθεί η έγκριση των συναδέλφων μετά τον έλεγχο του κώδικα

Στην περίπτωσή μας, η απαγόρευση του Merge θα είναι ότι ο αγωγός συναρμολόγησης θα εμφανίσει σφάλμα εάν δεν υπάρχουν αρκετές ψήφοι.

Μεταβείτε στις Ρυθμίσεις → Γενικά → Αιτήματα συγχώνευσης → Έλεγχοι συγχώνευσης και ενεργοποιήστε την επιλογή Οι γραμμές συναρμολόγησης πρέπει να εκτελούνται με επιτυχία.

Αναθεώρηση κώδικα στο Gitlab CE: εάν δεν υπάρχουν εγκρίσεις αιτημάτων συγχώνευσης, αλλά το θέλω πολύ

4. Ρυθμίστε τον αγωγό

Εάν δεν έχετε δημιουργήσει ακόμα μια διοχέτευση CI/CD για την αίτησή σας
Δημιουργήστε ένα αρχείο στη ρίζα του αποθετηρίου .gitlab-ci.yml με απλό περιεχόμενο:

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"

Ξεχωριστό αποθετήριο για διαμόρφωση CI/CD
Θα συνιστούσα να δημιουργήσετε ένα ξεχωριστό αποθετήριο όπου πρέπει να δημιουργήσετε ένα αρχείο myapp.gitlab-ci.yml για να ρυθμίσετε τη διοχέτευση. Με αυτόν τον τρόπο μπορείτε να ελέγχετε καλύτερα την πρόσβαση των συντελεστών που μπορούν να αλλάξουν τη διοχέτευση κατασκευής και να λάβουν διακριτικό πρόσβασης.

Η τοποθεσία του νέου αρχείου pipeline θα πρέπει να καθοριστεί μεταβαίνοντας στο αποθετήριο myapp - Ρυθμίσεις - CI / CD - Γραμμές συναρμολόγησης - Προσαρμοσμένη διαδρομή διαμόρφωσης CI - καθορίστε ένα νέο αρχείο, για παράδειγμα myapp.gitlab-ci.yml@gitlab-ce-mr-approvals/Ci

Συμβουλή: Χρησιμοποιήστε ένα linter για να κάνετε αλλαγές στα αρχεία GitLab CI
Ακόμα κι αν εργάζεστε μόνοι σας, η εργασία μέσω του MR θα είναι καλός βοηθός, εκτελώντας όλες τις αλλαγές σας στα αρχεία σωλήνωσης μέσω της επένδυσης. Εάν κάνετε λάθος στη σύνταξη του αρχείου YAML, αυτό δεν θα σας επιτρέψει να σπάσετε τη γραμμή εργασίας, αλλά απλώς θα αποκλείσει τη συγχώνευση.

Ένα παράδειγμα εμπορευματοκιβωτίων με λιντεράκια που μπορείτε να ενσωματώσετε στο pipeline σας:

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

Και ένα παράδειγμα του σταδίου επικύρωσης:

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;

Απομένει να προσθέσετε μερικές παραμέτρους στον αγωγό σας για να λειτουργήσει:

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 καθορίζει πόσα "μπράβο" πρέπει να έχει ο MR για να είναι διαθέσιμη η Συγχώνευση. Η τιμή του ενός σημαίνει ότι εσείς οι ίδιοι μπορείτε να εγκρίνετε τον MR σας κάνοντας "μου αρέσει".

περιλαμβάνει περιλαμβάνει το στάδιο δοκιμής, το οποίο ελέγχει τον αριθμό των "μου αρέσει".

Ο απλούστερος αγωγός που χρησιμοποιεί το 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

Περιεχόμενα του 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/.*$/'

Μάθετε περισσότερα για το τι συμβαίνει κατά τον έλεγχο:

  • έχει οριστεί ο περιορισμός ότι ο έλεγχος θα γίνεται μόνο κατά τη δημιουργία ενός MR στον κύριο ή κλάδο απελευθέρωσης /*
  • χρησιμοποιώντας το GitLab API, λάβετε τον αριθμό των "μου αρέσει" και "δεν μου αρέσει"
  • υπολογίστε τη διαφορά μεταξύ θετικών και αρνητικών απαντήσεων
  • εάν η διαφορά είναι μικρότερη από την τιμή που ορίσαμε στο NEED_VOTES, τότε αποκλείουμε τη δυνατότητα συγχώνευσης

5. Απενεργοποιήστε τις δεσμεύσεις για προστατευμένους κλάδους

Καθορίζουμε τα υποκαταστήματα για τα οποία πρέπει να πραγματοποιήσουμε έλεγχο κώδικα και υποδεικνύουμε ότι μπορούν να εργαστούν μόνο μέσω MR.

Για να το κάνετε αυτό, μεταβείτε στις Ρυθμίσεις → Αποθετήριο → Προστατευμένα Υποκαταστήματα:

Αναθεώρηση κώδικα στο Gitlab CE: εάν δεν υπάρχουν εγκρίσεις αιτημάτων συγχώνευσης, αλλά το θέλω πολύ

6. Έλεγχος

Ορίστε NEED_VOTES: 0

Κάνουμε MR και βάζουμε "dislike".

Αναθεώρηση κώδικα στο Gitlab CE: εάν δεν υπάρχουν εγκρίσεις αιτημάτων συγχώνευσης, αλλά το θέλω πολύ

Στα αρχεία καταγραφής κατασκευής:

Αναθεώρηση κώδικα στο Gitlab CE: εάν δεν υπάρχουν εγκρίσεις αιτημάτων συγχώνευσης, αλλά το θέλω πολύ

Τώρα βάλτε "μου αρέσει" και κάντε επανέλεγχο:

Αναθεώρηση κώδικα στο Gitlab CE: εάν δεν υπάρχουν εγκρίσεις αιτημάτων συγχώνευσης, αλλά το θέλω πολύ

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο