Ανάλυση αιτημάτων συγχώνευσης στο GitLab χρησιμοποιώντας PVS-Studio για C#

Ανάλυση αιτημάτων συγχώνευσης στο GitLab χρησιμοποιώντας PVS-Studio για C#
Αγαπάτε το GitLab και μισείτε τα σφάλματα; Θέλετε να βελτιώσετε την ποιότητα του πηγαίου κώδικα σας; Τότε ήρθατε στο σωστό μέρος. Σήμερα θα σας πούμε πώς να διαμορφώσετε τον αναλυτή PVS-Studio C# για να ελέγχετε αιτήματα συγχώνευσης. Έχετε μια διάθεση μονόκερου και καλή ανάγνωση σε όλους.

PVS-Στούντιο είναι ένα εργαλείο για τον εντοπισμό σφαλμάτων και πιθανών τρωτών σημείων στον πηγαίο κώδικα προγραμμάτων γραμμένων σε 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

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

Η αρχή του ελέγχου ενός αιτήματος συγχώνευσης

Η κύρια ουσία του ελέγχου είναι να διασφαλιστεί ότι τα προβλήματα που εντοπίζονται από τον αναλυτή κατά τη συγχώνευση δεν εμπίπτουν στο κύριος κλαδί. Επίσης, δεν θέλουμε να αναλύουμε ολόκληρο το έργο κάθε φορά. Επιπλέον, όταν συγχωνεύουμε κλάδους, έχουμε μια λίστα αλλαγμένων αρχείων. Επομένως, προτείνω να προσθέσετε έναν έλεγχο αιτήματος συγχώνευσης.

Αυτή είναι η εμφάνιση ενός αιτήματος συγχώνευσης πριν από την εφαρμογή ενός στατικού αναλυτή:

Ανάλυση αιτημάτων συγχώνευσης στο GitLab χρησιμοποιώντας PVS-Studio για C#
Δηλαδή όλα τα λάθη που υπήρχαν στον κλάδο αλλαγές, θα μετακινηθεί στον κύριο κλάδο. Επειδή δεν θα το θέλαμε αυτό, προσθέτουμε ανάλυση και τώρα το διάγραμμα μοιάζει με αυτό:

Ανάλυση αιτημάτων συγχώνευσης στο GitLab χρησιμοποιώντας PVS-Studio για C#
Αναλύοντας αλλαγές2 και, εάν δεν υπάρχουν σφάλματα, αποδεχόμαστε το αίτημα συγχώνευσης, διαφορετικά το απορρίπτουμε.

Παρεμπιπτόντως, αν σας ενδιαφέρει να αναλύσετε commits και να κάνετε pull αιτήματα για C/C++, τότε μπορείτε να διαβάσετε σχετικά εδώ.

GitLab

GitLab είναι ένα ανοιχτού κώδικα εργαλείο κύκλου ζωής DevOps βασισμένο στον ιστό που παρέχει ένα σύστημα διαχείρισης αποθετηρίου κώδικα για το Git με το δικό του wiki, σύστημα παρακολούθησης ζητημάτων, διοχέτευση CI/CD και άλλες δυνατότητες.

Πριν ξεκινήσετε την ανάλυση των αιτημάτων συγχώνευσης, πρέπει να εγγραφείτε και να ανεβάσετε το έργο σας. Αν δεν ξέρετε πώς να το κάνετε αυτό, τότε σας προτείνω ένα άρθρο ο συνάδελφός μου.

Σημείωση. Η μέθοδος ρύθμισης του περιβάλλοντος που περιγράφεται παρακάτω είναι μία από τις πιθανές. Ο στόχος είναι να εμφανιστούν τα βήματα για τη ρύθμιση του περιβάλλοντος που είναι απαραίτητο για την ανάλυση και την εκκίνηση του αναλυτή. Ίσως στην περίπτωσή σας θα ήταν καλύτερο να διαχωρίσετε τα στάδια προετοιμασίας περιβάλλοντος (προσθήκη αποθετηρίων, εγκατάσταση αναλυτή) και ανάλυσης: για παράδειγμα, προετοιμασία εικόνων Docker με το απαραίτητο περιβάλλον και χρήση τους ή κάποια άλλη μέθοδο.

Για να κατανοήσετε καλύτερα τι θα συμβεί τώρα, προτείνω να δείτε το παρακάτω διάγραμμα:

Ανάλυση αιτημάτων συγχώνευσης στο GitLab χρησιμοποιώντας PVS-Studio για C#
Ο αναλυτής απαιτεί .NET Core SDK 3 για να λειτουργήσει, επομένως πριν εγκαταστήσετε τον αναλυτή πρέπει να προσθέσετε τα αποθετήρια της Microsoft από τα οποία θα εγκατασταθούν οι εξαρτήσεις που απαιτούνται για τον αναλυτή. Προσθήκη αποθετηρίων της Microsoft για διάφορες διανομές Linux περιγράφεται στο αντίστοιχο έγγραφο.

Για να εγκαταστήσετε το PVS-Studio μέσω του διαχειριστή πακέτων, θα χρειαστεί επίσης να προσθέσετε τα αποθετήρια PVS-Studio. Η προσθήκη αποθετηρίων για διαφορετικές διανομές περιγράφεται με περισσότερες λεπτομέρειες στο σχετικό τμήμα της τεκμηρίωσης.

Ο αναλυτής απαιτεί κλειδί άδειας χρήσης για να λειτουργήσει. Μπορείτε να πάρετε μια δοκιμαστική άδεια στο σελίδα λήψης αναλυτή.

Σημείωση. Λάβετε υπόψη ότι ο τρόπος λειτουργίας που περιγράφεται (ανάλυση αιτημάτων συγχώνευσης) απαιτεί άδεια Enterprise. Επομένως, εάν θέλετε να δοκιμάσετε αυτόν τον τρόπο λειτουργίας, μην ξεχάσετε να υποδείξετε στο πεδίο «Μήνυμα» ότι χρειάζεστε μια άδεια Enterprise.

Εάν προκύψει αίτημα συγχώνευσης, τότε χρειάζεται μόνο να αναλύσουμε τη λίστα των αλλαγμένων αρχείων, διαφορετικά αναλύουμε όλα τα αρχεία. Μετά την ανάλυση, πρέπει να μετατρέψουμε τα αρχεία καταγραφής στη μορφή που χρειαζόμαστε.

Τώρα, έχοντας μπροστά στα μάτια σας τον αλγόριθμο της εργασίας, μπορείτε να προχωρήσετε στη συγγραφή ενός σεναρίου. Για να γίνει αυτό, πρέπει να αλλάξετε το αρχείο .gitlab-ci.yml ή, αν δεν υπάρχει, δημιουργήστε το. Για να το δημιουργήσετε, πρέπει να κάνετε κλικ στο όνομα του έργου σας -> Ρύθμιση CI/CD.

Ανάλυση αιτημάτων συγχώνευσης στο GitLab χρησιμοποιώντας PVS-Studio για C#
Τώρα είμαστε έτοιμοι να γράψουμε το σενάριο. Ας γράψουμε πρώτα τον κωδικό που θα εγκαταστήσει τον αναλυτή και ας εισάγουμε την άδεια χρήσης:

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.

Ανάλυση αιτημάτων συγχώνευσης στο GitLab χρησιμοποιώντας PVS-Studio για C#
Στο παράθυρο που ανοίγει, βρείτε το στοιχείο Μεταβλητές, κάντε κλικ στο κουμπί στα δεξιά Ανάπτυξη και προσθέστε μεταβλητές. Το αποτέλεσμα πρέπει να μοιάζει με αυτό:

Ανάλυση αιτημάτων συγχώνευσης στο GitLab χρησιμοποιώντας PVS-Studio για C#
Τώρα μπορείτε να προχωρήσετε στην ανάλυση. Αρχικά, ας προσθέσουμε ένα σενάριο για πλήρη ανάλυση. Στη σημαία -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) Κωδικοί επιστροφής" του εγγράφου "Έλεγχος έργων Visual Studio / MSBuild / .NET Core από τη γραμμή εντολών χρησιμοποιώντας το PVS-Studio".

Σε αυτή την περίπτωση, μας ενδιαφέρουν όλοι οι κωδικοί επιστροφής όπου εμφανίζεται το 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

Χρησιμότητα Plog-μετατροπέας είναι ένα έργο ανοιχτού κώδικα που χρησιμοποιείται για τη μετατροπή αναφορών σφαλμάτων ανάλυσης σε διάφορες μορφές, όπως HTML. Μια πιο λεπτομερής περιγραφή του βοηθητικού προγράμματος δίνεται στην υποενότητα "Βοηθητικό πρόγραμμα μετατροπέα Plog" σχετικό τμήμα της τεκμηρίωσης.

Παρεμπιπτόντως, εάν θέλετε να εργαστείτε εύκολα με αναφορές .json τοπικά από το IDE, τότε σας προτείνω plugin για το 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 -> Αγωγοί -> Τρέξιμο. Θα ανοίξει ένα παράθυρο εικονικής μηχανής, στο τέλος του οποίου θα πρέπει να υπάρχουν τα εξής:

Ανάλυση αιτημάτων συγχώνευσης στο GitLab χρησιμοποιώντας PVS-Studio για C#
είδε Ο Job πέτυχε - επιτυχία, όλα καλά. Τώρα μπορείτε να δοκιμάσετε τι έχετε κάνει.

Παραδείγματα εργασίας

Για παράδειγμα εργασίας, ας δημιουργήσουμε ένα απλό έργο (στο κύριος) που θα περιέχει πολλά αρχεία. Μετά από αυτό, σε άλλο κλάδο θα αλλάξουμε μόνο ένα αρχείο και θα προσπαθήσουμε να κάνουμε ένα αίτημα συγχώνευσης.

Ας εξετάσουμε δύο περιπτώσεις: πότε το τροποποιημένο αρχείο περιέχει σφάλμα και πότε όχι. Πρώτον, ένα παράδειγμα με ένα σφάλμα.

Ας υποθέσουμε ότι υπάρχει ένα αρχείο στον κύριο κλάδο Program.cs, το οποίο δεν περιέχει σφάλματα, αλλά σε άλλο κλάδο ο προγραμματιστής πρόσθεσε λανθασμένο κώδικα και θέλει να κάνει ένα αίτημα συγχώνευσης. Το τι είδους λάθος έκανε δεν είναι τόσο σημαντικό, το κυριότερο είναι ότι υπάρχει. Για παράδειγμα, ο χειριστής ξέχασε βολή (Ναί, τόσο λάθος):

void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // do something
  ....
}

Ας δούμε το αποτέλεσμα της ανάλυσης ενός παραδείγματος με σφάλμα. Επίσης, για να βεβαιωθώ ότι έγινε ανάλυση μόνο ενός αρχείου, πρόσθεσα τη σημαία -r στη γραμμή εκκίνησης pvs-studio-dotnet:

Ανάλυση αιτημάτων συγχώνευσης στο GitLab χρησιμοποιώντας PVS-Studio για C#
Βλέπουμε ότι ο αναλυτής βρήκε σφάλμα και δεν επέτρεψε τη συγχώνευση κλάδων.

Ας ελέγξουμε το παράδειγμα χωρίς σφάλμα. Διόρθωση του κωδικού:

void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // do something
  ....
}

Αποτελέσματα ανάλυσης αιτημάτων συγχώνευσης:

Ανάλυση αιτημάτων συγχώνευσης στο GitLab χρησιμοποιώντας PVS-Studio για C#
Όπως μπορούμε να δούμε, δεν βρέθηκαν σφάλματα και η εκτέλεση της εργασίας ήταν επιτυχής, κάτι που θέλαμε να ελέγξουμε.

Συμπέρασμα

Η εξάλειψη του κακού κώδικα πριν από τη συγχώνευση κλαδιών είναι πολύ βολική και ευχάριστη. Επομένως, εάν χρησιμοποιείτε CI/CD, δοκιμάστε να ενσωματώσετε έναν στατικό αναλυτή για έλεγχο. Επιπλέον, αυτό γίνεται πολύ απλά.

Σας ευχαριστώ για την προσοχή σας.

Ανάλυση αιτημάτων συγχώνευσης στο GitLab χρησιμοποιώντας PVS-Studio για C#
Εάν θέλετε να μοιραστείτε αυτό το άρθρο με ένα αγγλόφωνο κοινό, χρησιμοποιήστε τον σύνδεσμο μετάφρασης: Nikolay Mironov. Ανάλυση αιτημάτων συγχώνευσης στο GitLab χρησιμοποιώντας PVS-Studio για C#.

Πηγή: www.habr.com

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