
Αγαπάτε το GitLab και μισείτε τα σφάλματα; Θέλετε να βελτιώσετε την ποιότητα του πηγαίου κώδικα σας; Τότε ήρθατε στο σωστό μέρος. Σήμερα θα σας πούμε πώς να διαμορφώσετε τον αναλυτή PVS-Studio C# για να ελέγχετε αιτήματα συγχώνευσης. Έχετε μια διάθεση μονόκερου και καλή ανάγνωση σε όλους.
— είναι ένα εργαλείο για τον εντοπισμό σφαλμάτων και πιθανών τρωτών σημείων στον πηγαίο κώδικα προγραμμάτων γραμμένων σε C, C++, C# και Java. Εκτελείται σε συστήματα 64-bit. Windows, Linux и macOSΜπορεί να αναλύσει κώδικα που στοχεύει σε πλατφόρμες 32-bit, 64-bit και ενσωματωμένες πλατφόρμες ARM.
Παρεμπιπτόντως, κυκλοφορήσαμε το 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
είναι ένα ανοιχτού κώδικα εργαλείο κύκλου ζωής DevOps βασισμένο στον ιστό που παρέχει ένα σύστημα διαχείρισης αποθετηρίου κώδικα για το Git με το δικό του wiki, σύστημα παρακολούθησης ζητημάτων, διοχέτευση CI/CD και άλλες δυνατότητες.
Πριν ξεκινήσετε την ανάλυση των αιτημάτων συγχώνευσης, πρέπει να εγγραφείτε και να ανεβάσετε το έργο σας. Αν δεν ξέρετε πώς να το κάνετε αυτό, τότε σας προτείνω ο συνάδελφός μου.
Σημείωση. Η μέθοδος ρύθμισης του περιβάλλοντος που περιγράφεται παρακάτω είναι μία από τις πιθανές. Ο στόχος είναι να εμφανιστούν τα βήματα για τη ρύθμιση του περιβάλλοντος που είναι απαραίτητο για την ανάλυση και την εκκίνηση του αναλυτή. Ίσως στην περίπτωσή σας θα ήταν καλύτερο να διαχωρίσετε τα στάδια προετοιμασίας περιβάλλοντος (προσθήκη αποθετηρίων, εγκατάσταση αναλυτή) και ανάλυσης: για παράδειγμα, προετοιμασία εικόνων 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Χρησιμότητα είναι ένα έργο ανοιχτού κώδικα που χρησιμοποιείται για τη μετατροπή αναφορών σφαλμάτων ανάλυσης σε διάφορες μορφές, όπως HTML. Μια πιο λεπτομερής περιγραφή του βοηθητικού προγράμματος δίνεται στην υποενότητα "Βοηθητικό πρόγραμμα μετατροπέα Plog" .
Παρεμπιπτόντως, εάν θέλετε να εργαστείτε εύκολα με αναφορές .json τοπικά από το IDE, τότε σας προτείνω για το IDE Rider. Η χρήση του περιγράφεται λεπτομερέστερα στο .
Για ευκολία, εδώ είναι .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
