Αγαπάτε το GitLab και μισείτε τα σφάλματα; Θέλετε να βελτιώσετε την ποιότητα του πηγαίου κώδικα σας; Τότε ήρθατε στο σωστό μέρος. Σήμερα θα σας πούμε πώς να διαμορφώσετε τον αναλυτή PVS-Studio C# για να ελέγχετε αιτήματα συγχώνευσης. Έχετε μια διάθεση μονόκερου και καλή ανάγνωση σε όλους.
Παρεμπιπτόντως, κυκλοφορήσαμε το PVS-Studio 7.08, στο οποίο κάναμε πολλά πράγματα
- Αναλυτής C# για Linux και macOS.
- πρόσθετο για το Rider.
- λειτουργία ελέγχου νέας λίστας αρχείων.
Λειτουργία ελέγχου λίστας αρχείων
Προηγουμένως, για να ελέγξετε ορισμένα αρχεία, ήταν απαραίτητο να περάσετε ένα .xml με μια λίστα αρχείων στον αναλυτή. Επειδή όμως αυτό δεν είναι πολύ βολικό, προσθέσαμε τη δυνατότητα μεταφοράς .txt, που κάνει τη ζωή πολύ απλή.
Για να ελέγξετε συγκεκριμένα αρχεία, πρέπει να καθορίσετε τη σημαία --sourceFiles (-f) και μεταφέρετε .txt με μια λίστα αρχείων. Μοιάζει με αυτό:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
Εάν ενδιαφέρεστε να ρυθμίσετε αιτήματα ελέγχου δέσμευσης ή έλξης, μπορείτε επίσης να το κάνετε χρησιμοποιώντας αυτήν τη λειτουργία. Η διαφορά θα είναι στη λήψη μιας λίστας αρχείων προς ανάλυση και θα εξαρτηθεί από τα συστήματα που χρησιμοποιείτε.
Η αρχή του ελέγχου ενός αιτήματος συγχώνευσης
Η κύρια ουσία του ελέγχου είναι να διασφαλιστεί ότι τα προβλήματα που εντοπίζονται από τον αναλυτή κατά τη συγχώνευση δεν εμπίπτουν στο κύριος κλαδί. Επίσης, δεν θέλουμε να αναλύουμε ολόκληρο το έργο κάθε φορά. Επιπλέον, όταν συγχωνεύουμε κλάδους, έχουμε μια λίστα αλλαγμένων αρχείων. Επομένως, προτείνω να προσθέσετε έναν έλεγχο αιτήματος συγχώνευσης.
Αυτή είναι η εμφάνιση ενός αιτήματος συγχώνευσης πριν από την εφαρμογή ενός στατικού αναλυτή:
Δηλαδή όλα τα λάθη που υπήρχαν στον κλάδο αλλαγές, θα μετακινηθεί στον κύριο κλάδο. Επειδή δεν θα το θέλαμε αυτό, προσθέτουμε ανάλυση και τώρα το διάγραμμα μοιάζει με αυτό:
Αναλύοντας αλλαγές2 και, εάν δεν υπάρχουν σφάλματα, αποδεχόμαστε το αίτημα συγχώνευσης, διαφορετικά το απορρίπτουμε.
Παρεμπιπτόντως, αν σας ενδιαφέρει να αναλύσετε commits και να κάνετε pull αιτήματα για C/C++, τότε μπορείτε να διαβάσετε σχετικά
GitLab
Πριν ξεκινήσετε την ανάλυση των αιτημάτων συγχώνευσης, πρέπει να εγγραφείτε και να ανεβάσετε το έργο σας. Αν δεν ξέρετε πώς να το κάνετε αυτό, τότε σας προτείνω
Σημείωση. Η μέθοδος ρύθμισης του περιβάλλοντος που περιγράφεται παρακάτω είναι μία από τις πιθανές. Ο στόχος είναι να εμφανιστούν τα βήματα για τη ρύθμιση του περιβάλλοντος που είναι απαραίτητο για την ανάλυση και την εκκίνηση του αναλυτή. Ίσως στην περίπτωσή σας θα ήταν καλύτερο να διαχωρίσετε τα στάδια προετοιμασίας περιβάλλοντος (προσθήκη αποθετηρίων, εγκατάσταση αναλυτή) και ανάλυσης: για παράδειγμα, προετοιμασία εικόνων Docker με το απαραίτητο περιβάλλον και χρήση τους ή κάποια άλλη μέθοδο.
Για να κατανοήσετε καλύτερα τι θα συμβεί τώρα, προτείνω να δείτε το παρακάτω διάγραμμα:
Ο αναλυτής απαιτεί .NET Core SDK 3 για να λειτουργήσει, επομένως πριν εγκαταστήσετε τον αναλυτή πρέπει να προσθέσετε τα αποθετήρια της Microsoft από τα οποία θα εγκατασταθούν οι εξαρτήσεις που απαιτούνται για τον αναλυτή. Προσθήκη αποθετηρίων της Microsoft για διάφορες διανομές Linux
Για να εγκαταστήσετε το PVS-Studio μέσω του διαχειριστή πακέτων, θα χρειαστεί επίσης να προσθέσετε τα αποθετήρια PVS-Studio. Η προσθήκη αποθετηρίων για διαφορετικές διανομές περιγράφεται με περισσότερες λεπτομέρειες στο
Ο αναλυτής απαιτεί κλειδί άδειας χρήσης για να λειτουργήσει. Μπορείτε να πάρετε μια δοκιμαστική άδεια στο
Σημείωση. Λάβετε υπόψη ότι ο τρόπος λειτουργίας που περιγράφεται (ανάλυση αιτημάτων συγχώνευσης) απαιτεί άδεια Enterprise. Επομένως, εάν θέλετε να δοκιμάσετε αυτόν τον τρόπο λειτουργίας, μην ξεχάσετε να υποδείξετε στο πεδίο «Μήνυμα» ότι χρειάζεστε μια άδεια Enterprise.
Εάν προκύψει αίτημα συγχώνευσης, τότε χρειάζεται μόνο να αναλύσουμε τη λίστα των αλλαγμένων αρχείων, διαφορετικά αναλύουμε όλα τα αρχεία. Μετά την ανάλυση, πρέπει να μετατρέψουμε τα αρχεία καταγραφής στη μορφή που χρειαζόμαστε.
Τώρα, έχοντας μπροστά στα μάτια σας τον αλγόριθμο της εργασίας, μπορείτε να προχωρήσετε στη συγγραφή ενός σεναρίου. Για να γίνει αυτό, πρέπει να αλλάξετε το αρχείο .gitlab-ci.yml ή, αν δεν υπάρχει, δημιουργήστε το. Για να το δημιουργήσετε, πρέπει να κάνετε κλικ στο όνομα του έργου σας -> Ρύθμιση CI/CD.
Τώρα είμαστε έτοιμοι να γράψουμε το σενάριο. Ας γράψουμε πρώτα τον κωδικό που θα εγκαταστήσει τον αναλυτή και ας εισάγουμε την άδεια χρήσης:
before_script:
- apt-get update && apt-get -y install wget gnupg
- apt-get -y install git
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
- wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
- wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
- apt-get update
- apt-get -y install pvs-studio-dotnet
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
- dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln
Εφόσον η εγκατάσταση και η ενεργοποίηση πρέπει να πραγματοποιηθούν πριν από όλα τα άλλα σενάρια, χρησιμοποιούμε μια ειδική ετικέτα πριν_σενάριο. Επιτρέψτε μου να εξηγήσω λίγο αυτό το κομμάτι.
Προετοιμασία για την εγκατάσταση του αναλυτή:
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
Προσθήκη αποθετηρίων και αναλυτή PVS-Studio:
- wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
- wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
- apt-get update
- apt-get -y install pvs-studio-dotnet
Ενεργοποίηση άδειας χρήσης:
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
$PVS_NAME - Όνομα χρήστη.
$PVS_KEY - κλειδί προϊόντος.
Ανάκτηση εξαρτήσεων έργου όπου $CI_PROJECT_DIR – πλήρης διαδρομή προς τον κατάλογο του έργου:
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln
Για σωστή ανάλυση, το έργο πρέπει να κατασκευαστεί με επιτυχία και οι εξαρτήσεις του πρέπει να αποκατασταθούν (για παράδειγμα, πρέπει να ληφθούν τα απαραίτητα πακέτα NuGet).
Μπορείτε να ορίσετε μεταβλητές περιβάλλοντος που περιέχουν πληροφορίες άδειας κάνοντας κλικ Ρύθμιση, και μετά - ενεργό CI/CD.
Στο παράθυρο που ανοίγει, βρείτε το στοιχείο Μεταβλητές, κάντε κλικ στο κουμπί στα δεξιά Ανάπτυξη και προσθέστε μεταβλητές. Το αποτέλεσμα πρέπει να μοιάζει με αυτό:
Τώρα μπορείτε να προχωρήσετε στην ανάλυση. Αρχικά, ας προσθέσουμε ένα σενάριο για πλήρη ανάλυση. Στη σημαία -t περνάμε το μονοπάτι για τη λύση στη σημαία -o γράψτε τη διαδρομή προς το αρχείο στο οποίο θα εγγραφούν τα αποτελέσματα της ανάλυσης. Μας ενδιαφέρει και ο κωδικός επιστροφής. Σε αυτή την περίπτωση, μας ενδιαφέρει η λειτουργία να σταματήσει όταν ο κωδικός επιστροφής περιέχει πληροφορίες ότι εκδόθηκαν προειδοποιήσεις κατά την ανάλυση. Έτσι μοιάζει αυτό το απόσπασμα:
job:
script:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o
PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
Οι κωδικοί επιστροφής λειτουργούν με την αρχή της μάσκας bit. Για παράδειγμα, εάν εκδόθηκαν προειδοποιήσεις ως αποτέλεσμα της ανάλυσης, τότε ο κωδικός επιστροφής θα είναι ίσος με 8. Εάν η άδεια χρήσης λήξει εντός ενός μήνα, τότε ο κωδικός επιστροφής θα είναι ίσος με 4. Εάν εντοπίστηκαν σφάλματα κατά την ανάλυση, και η άδεια λήγει μέσα σε ένα μήνα, ο κωδικός επιστρέφει, θα γραφτούν και οι δύο τιμές: προσθέστε τους αριθμούς μαζί και λάβετε τον τελικό κωδικό επιστροφής - 8+4=12. Έτσι, ελέγχοντας τα αντίστοιχα bit, μπορούν να ληφθούν πληροφορίες για διάφορες καταστάσεις κατά την ανάλυση. Οι κωδικοί επιστροφής περιγράφονται λεπτομερέστερα στην ενότητα "Pvs-studio-dotnet (Linux / macOS) Κωδικοί επιστροφής" του εγγράφου "
Σε αυτή την περίπτωση, μας ενδιαφέρουν όλοι οι κωδικοί επιστροφής όπου εμφανίζεται το 8.
- exit_code=$((($exit_code & 8)/8))
Θα λάβουμε 1 όταν ο κωδικός επιστροφής περιέχει το bit του αριθμού που μας ενδιαφέρει, διαφορετικά θα λάβουμε 0.
Ήρθε η ώρα να προσθέσετε την ανάλυση αιτημάτων συγχώνευσης. Πριν το κάνουμε αυτό, ας ετοιμάσουμε ένα μέρος για το σενάριο. Χρειαζόμαστε να εκτελείται μόνο όταν εμφανίζεται ένα αίτημα συγχώνευσης. Μοιάζει με αυτό:
merge:
script:
only:
- merge_requests
Ας περάσουμε στο ίδιο το σενάριο. Βρέθηκα αντιμέτωπος με το γεγονός ότι η εικονική μηχανή δεν γνωρίζει τίποτα καταγωγή/κύριος. Ας τη βοηθήσουμε λοιπόν λίγο:
- git fetch origin
Τώρα παίρνουμε τη διαφορά μεταξύ των κλαδιών και αποθηκεύουμε το αποτέλεσμα txt αρχείο:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
Πού $CI_COMMIT_SHA – κατακερματισμός της τελευταίας δέσμευσης.
Στη συνέχεια, αρχίζουμε να αναλύουμε τη λίστα των αρχείων χρησιμοποιώντας τη σημαία -f. Μεταφέρουμε το αρχείο .txt που λάβαμε προηγουμένως σε αυτό. Λοιπόν, κατ' αναλογία με την πλήρη ανάλυση, εξετάζουμε τους κωδικούς επιστροφής:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
Το πλήρες σενάριο για τον έλεγχο ενός αιτήματος συγχώνευσης θα μοιάζει με αυτό:
merge:
script:
- git fetch origin
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
only:
- merge_requests
Το μόνο που μένει είναι να προσθέσετε μετατροπή αρχείων καταγραφής μετά την επεξεργασία όλων των σεναρίων. Χρησιμοποιούμε την ετικέτα after_script και χρησιμότητα Plog-μετατροπέας:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
Χρησιμότητα
Παρεμπιπτόντως, εάν θέλετε να εργαστείτε εύκολα με αναφορές .json τοπικά από το IDE, τότε σας προτείνω
Για ευκολία, εδώ είναι .gitlab-ci.yml σε πλήρη:
image: debian
before_script:
- apt-get update && apt-get -y install wget gnupg
- apt-get -y install git
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
- wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
- wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
- apt-get update
- apt-get -y install pvs-studio-dotnet
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
- dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln
merge:
script:
- git fetch origin
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
only:
- merge_requests
job:
script:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o
PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
Αφού προσθέσετε τα πάντα στο αρχείο, κάντε κλικ στο Επαναλάβετε τις αλλαγές. Για να δείτε ότι όλα είναι σωστά, πηγαίνετε στο CI / CD -> Αγωγοί -> Τρέξιμο. Θα ανοίξει ένα παράθυρο εικονικής μηχανής, στο τέλος του οποίου θα πρέπει να υπάρχουν τα εξής:
είδε Ο Job πέτυχε - επιτυχία, όλα καλά. Τώρα μπορείτε να δοκιμάσετε τι έχετε κάνει.
Παραδείγματα εργασίας
Για παράδειγμα εργασίας, ας δημιουργήσουμε ένα απλό έργο (στο κύριος) που θα περιέχει πολλά αρχεία. Μετά από αυτό, σε άλλο κλάδο θα αλλάξουμε μόνο ένα αρχείο και θα προσπαθήσουμε να κάνουμε ένα αίτημα συγχώνευσης.
Ας εξετάσουμε δύο περιπτώσεις: πότε το τροποποιημένο αρχείο περιέχει σφάλμα και πότε όχι. Πρώτον, ένα παράδειγμα με ένα σφάλμα.
Ας υποθέσουμε ότι υπάρχει ένα αρχείο στον κύριο κλάδο Program.cs, το οποίο δεν περιέχει σφάλματα, αλλά σε άλλο κλάδο ο προγραμματιστής πρόσθεσε λανθασμένο κώδικα και θέλει να κάνει ένα αίτημα συγχώνευσης. Το τι είδους λάθος έκανε δεν είναι τόσο σημαντικό, το κυριότερο είναι ότι υπάρχει. Για παράδειγμα, ο χειριστής ξέχασε βολή (Ναί,
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}
Ας δούμε το αποτέλεσμα της ανάλυσης ενός παραδείγματος με σφάλμα. Επίσης, για να βεβαιωθώ ότι έγινε ανάλυση μόνο ενός αρχείου, πρόσθεσα τη σημαία -r στη γραμμή εκκίνησης pvs-studio-dotnet:
Βλέπουμε ότι ο αναλυτής βρήκε σφάλμα και δεν επέτρεψε τη συγχώνευση κλάδων.
Ας ελέγξουμε το παράδειγμα χωρίς σφάλμα. Διόρθωση του κωδικού:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}
Αποτελέσματα ανάλυσης αιτημάτων συγχώνευσης:
Όπως μπορούμε να δούμε, δεν βρέθηκαν σφάλματα και η εκτέλεση της εργασίας ήταν επιτυχής, κάτι που θέλαμε να ελέγξουμε.
Συμπέρασμα
Η εξάλειψη του κακού κώδικα πριν από τη συγχώνευση κλαδιών είναι πολύ βολική και ευχάριστη. Επομένως, εάν χρησιμοποιείτε CI/CD, δοκιμάστε να ενσωματώσετε έναν στατικό αναλυτή για έλεγχο. Επιπλέον, αυτό γίνεται πολύ απλά.
Σας ευχαριστώ για την προσοχή σας.
Εάν θέλετε να μοιραστείτε αυτό το άρθρο με ένα αγγλόφωνο κοινό, χρησιμοποιήστε τον σύνδεσμο μετάφρασης: Nikolay Mironov.
Πηγή: www.habr.com