Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Στον αναλυτή PVS-Studio για γλώσσες C και C++ σε Linux και macOS, ξεκινώντας από την έκδοση 7.04, εμφανίστηκε μια ευκαιρία δοκιμής για έλεγχο της λίστας των καθορισμένων αρχείων. Χρησιμοποιώντας τη νέα λειτουργία, μπορείτε να διαμορφώσετε τον αναλυτή ώστε να ελέγχει τις δεσμεύσεις και τα αιτήματα έλξης. Αυτό το άρθρο θα σας δείξει πώς να ρυθμίσετε έναν έλεγχο λίστας αρχείων έργου GitHub σε δημοφιλή συστήματα CI (Continuous Integration) όπως τα Travis CI, Buddy και AppVeyor.

Λειτουργία ελέγχου λίστας αρχείων

PVS-Στούντιο είναι ένα εργαλείο για τον εντοπισμό σφαλμάτων και πιθανών τρωτών σημείων στον πηγαίο κώδικα προγραμμάτων γραμμένων σε C, C++, C# και Java. Λειτουργεί σε συστήματα 64-bit σε Windows, Linux και macOS.

Η έκδοση του PVS-Studio 7.04 για Linux και macOS διαθέτει λειτουργία ελέγχου της λίστας των αρχείων προέλευσης. Αυτό λειτουργεί για έργα των οποίων το σύστημα κατασκευής σας επιτρέπει να δημιουργήσετε ένα αρχείο compile_commands.json. Απαιτείται για τον αναλυτή να εξάγει πληροφορίες σχετικά με τη συλλογή των καθορισμένων αρχείων. Εάν το σύστημα κατασκευής σας δεν υποστηρίζει τη δημιουργία αρχείου compile_commands.json, μπορείτε να δοκιμάσετε να δημιουργήσετε ένα τέτοιο αρχείο χρησιμοποιώντας το βοηθητικό πρόγραμμα Αρκούδα.

Επίσης, η λειτουργία ελέγχου της λίστας των αρχείων μπορεί να χρησιμοποιηθεί μαζί με το ίχνος γραμμών των εκτελέσεων μεταγλωττιστή (pvs-studio-analyzer trace). Για να το κάνετε αυτό, θα χρειαστεί πρώτα να εκτελέσετε μια πλήρη κατασκευή του έργου και να το παρακολουθήσετε, έτσι ώστε ο αναλυτής να συλλέγει πλήρεις πληροφορίες σχετικά με τις παραμέτρους μεταγλώττισης όλων των αρχείων που ελέγχονται.

Ωστόσο, αυτή η επιλογή έχει ένα σημαντικό μειονέκτημα - είτε θα χρειαστεί να εκτελέσετε ένα πλήρες ίχνος κατασκευής ολόκληρου του έργου σε κάθε εκκίνηση, το οποίο από μόνο του έρχεται σε αντίθεση με την ιδέα ενός γρήγορου ελέγχου δέσμευσης. Ή, εάν αποθηκεύσετε προσωρινά το ίδιο το αποτέλεσμα ανίχνευσης, οι επόμενες εκκινήσεις του αναλυτή μπορεί να αποδειχθούν ελλιπείς εάν η δομή εξάρτησης του αρχείου προέλευσης αλλάξει μετά τον εντοπισμό (για παράδειγμα, προστίθεται ένα νέο #include σε ένα από τα αρχεία προέλευσης).

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

Η λίστα των αρχείων προέλευσης για ανάλυση αποθηκεύεται σε ένα αρχείο κειμένου και μεταβιβάζεται στον αναλυτή χρησιμοποιώντας την παράμετρο -S:

pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt

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

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

plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...

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

Σημείωση. Την πρώτη φορά που θα αρχίσετε να αναλύετε τη λίστα των αρχείων, θα αναλυθεί ολόκληρο το έργο, γιατί ο αναλυτής πρέπει να δημιουργήσει ένα αρχείο εξαρτήσεων των αρχείων πηγής του έργου στα αρχεία κεφαλίδας. Αυτή είναι μια δυνατότητα ανάλυσης αρχείων C και C++. Στο μέλλον, το αρχείο εξάρτησης μπορεί να αποθηκευτεί προσωρινά και θα ενημερώνεται αυτόματα από τον αναλυτή. Το πλεονέκτημα του ελέγχου των δεσμεύσεων κατά τη χρήση της λειτουργίας ελέγχου λίστας αρχείων σε σχέση με τη λειτουργία επαυξητικής ανάλυσης είναι ότι μόνο αυτό το αρχείο χρειάζεται να αποθηκευτεί προσωρινά και όχι τα αρχεία αντικειμένων.

Γενικές αρχές ανάλυσης αιτήματος έλξης

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

Εξετάστε ένα παράδειγμα δέντρου commit με δύο κλάδους:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio

Ας προσποιηθούμε ότι η δέσμευση A1 περιέχει έναν αρκετά μεγάλο αριθμό κώδικα που έχει ήδη ελεγχθεί. Λίγο νωρίτερα κάναμε ένα κλαδί από το commit A1 και άλλαξε κάποια αρχεία.

Φυσικά, το προσέξατε μετά A1 υπήρξαν άλλες δύο δεσμεύσεις, αλλά αυτές ήταν επίσης συγχωνεύσεις άλλων κλάδων, επειδή δεν δεσμευόμαστε κύριος. Και τώρα ήρθε η ώρα που άμεση επιδιόρθωση έτοιμος. Επομένως, εμφανίστηκε ένα αίτημα έλξης για τη συγχώνευση B3 и A3.

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

Για να γίνει αυτό, παίρνουμε τη διαφορά μεταξύ των κλάδων, όντας στο HEAD του κλάδου από τον οποίο θέλουμε να συγχωνευθούμε σε κύριο:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

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

Έτσι, πήραμε τη διαφορά μεταξύ των κλάδων, ή μάλλον, της λίστας των ονομάτων αρχείων που έχουν αλλάξει. Τώρα πρέπει να δώσουμε το αρχείο .pvs-pr.list (ανακατευθυνθήκαμε την έξοδο παραπάνω σε αυτό) στον αναλυτή:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

Μετά την ανάλυση, πρέπει να μετατρέψουμε το αρχείο καταγραφής (PVS-Studio.log) σε αναγνώσιμη μορφή:

plog-converter -t errorfile PVS-Studio.log --cerr -w

Αυτή η εντολή θα απαριθμήσει τα σφάλματα stderr (κανονική ροή εξόδου σφάλματος).

Μόνο εδώ χρειάζεται όχι μόνο να εμφανίσουμε σφάλματα, αλλά και να ενημερώσουμε την υπηρεσία μας για συναρμολόγηση και δοκιμές για την παρουσία προβλημάτων. Για αυτό, προστέθηκε μια σημαία στον μετατροπέα -W (--δείχνω-προειδοποιήσεις). Εάν υπάρχει τουλάχιστον μία προειδοποίηση αναλυτή, ο κωδικός επιστροφής του βοηθητικού προγράμματος Plog-μετατροπέας θα αλλάξει σε 2, το οποίο με τη σειρά του θα ειδοποιήσει την υπηρεσία CI ότι υπάρχουν πιθανά σφάλματα στα αρχεία αιτημάτων έλξης.

Travis CI

Η διαμόρφωση γίνεται με τη μορφή αρχείου .travis.yml. Για ευκολία, σας συμβουλεύω να βάλετε τα πάντα σε ξεχωριστό σενάριο bash με λειτουργίες που θα καλούνται από το αρχείο .travis.yml (bash scriptname.sh function_name).

Θα προσθέσουμε τον απαραίτητο κώδικα στο script on βίαιο χτύπημα, ώστε να έχουμε περισσότερη λειτουργικότητα. Στο τμήμα εγκαθιστώ ας γράψουμε τα εξής:

install:
  - bash .travis.sh travis_install

Εάν είχατε οδηγίες, μπορείτε να τις μετακινήσετε στο σενάριο αφαιρώντας τις παύλες.

Ας ανοίξουμε το αρχείο .travis.sh και προσθέστε τη ρύθμιση του αναλυτή στη λειτουργία travis_install():

travis_install() {
  wget -q -O - https://files.viva64.com/etc/pubkey.txt 
    | sudo apt-key add -
  sudo wget -O /etc/apt/sources.list.d/viva64.list 
    https://files.viva64.com/etc/viva64.list
  
  sudo apt-get update -qq
  sudo apt-get install -qq pvs-studio 
}

Τώρα ας προσθέσουμε στην ενότητα γραφή ανάλυση εκτέλεσης:

script:
  - bash .travis.sh travis_script

Και στο σενάριο bash:

travis_script() {
  pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
  
  if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
    git diff --name-only origin/HEAD > .pvs-pr.list
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                -S .pvs-pr.list 
                                --disableLicenseExpirationCheck
  else
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                --disableLicenseExpirationCheck
  fi
  
  plog-converter -t errorfile PVS-Studio.log --cerr -w
}

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

travis_script() {
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  cmake $CMAKE_ARGS CMakeLists.txt
  make -j8
}

Θα βγει ως εξής:

travis_script() {
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  cmake $CMAKE_ARGS CMakeLists.txt
  make -j8
  
  pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
  
  if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
    git diff --name-only origin/HEAD > .pvs-pr.list
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                -S .pvs-pr.list 
                                --disableLicenseExpirationCheck
  else
    pvs-studio-analyzer analyze -j8 
                                -o PVS-Studio.log 
                                --disableLicenseExpirationCheck
  fi
  
  plog-converter -t errorfile PVS-Studio.log --cerr -w
}

Πιθανότατα έχετε ήδη παρατηρήσει τις καθορισμένες μεταβλητές περιβάλλοντος. $TRAVIS_PULL_REQUEST и $TRAVIS_BRANCH. Ο Travis CI τα δηλώνει από μόνος του:

  • $TRAVIS_PULL_REQUEST αποθηκεύει τον αριθμό αιτήματος έλξης ή ψευδήςαν είναι κανονικό υποκατάστημα?
  • $TRAVIS_REPO_SLUG αποθηκεύει το όνομα του αποθετηρίου του έργου.

Ο αλγόριθμος αυτής της συνάρτησης:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Ο Travis CI ανταποκρίνεται στους κωδικούς επιστροφής, επομένως η παρουσία προειδοποιήσεων θα πει στην υπηρεσία να επισημάνει τη δέσμευση ως buggy.

Ας ρίξουμε μια πιο προσεκτική ματιά σε αυτήν τη γραμμή κώδικα:

git diff --name-only origin/HEAD > .pvs-pr.list

Το γεγονός είναι ότι το Travis CI συγχωνεύει αυτόματα κλάδους κατά την ανάλυση ενός αιτήματος έλξης:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Επομένως, αναλύουμε A4αλλά όχι Β3->Α3. Λόγω αυτού του χαρακτηριστικού, πρέπει να υπολογίσουμε τη διαφορά από A3, που είναι μόνο η κορυφή του κλάδου από καταγωγή.

Παραμένει μια σημαντική λεπτομέρεια - η προσωρινή αποθήκευση των εξαρτήσεων των αρχείων κεφαλίδας σε μεταγλωττισμένες μεταφραστικές μονάδες (*.c, *.cc, *.cpp, κ.λπ.). Ο αναλυτής υπολογίζει αυτές τις εξαρτήσεις κατά την πρώτη εκκίνηση στη λειτουργία ελέγχου της λίστας αρχείων και στη συνέχεια τις αποθηκεύει στον κατάλογο .PVS-Studio. Το Travis CI σάς επιτρέπει να αποθηκεύετε προσωρινά φακέλους, έτσι θα αποθηκεύσουμε δεδομένα καταλόγου .PVS-Studio/:

cache:
  directories:
    - .PVS-Studio/

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

Buddy

Όπως ο Travis C.I., Buddy παρέχει τη δυνατότητα αυτόματης δημιουργίας και δοκιμής έργων που είναι αποθηκευμένα στο GitHub. Σε αντίθεση με το Travis CI, έχει ρυθμιστεί στη διεπαφή ιστού (διατίθεται η υποστήριξη bash), επομένως δεν υπάρχει ανάγκη αποθήκευσης αρχείων διαμόρφωσης στο έργο.

Πρώτα απ 'όλα, πρέπει να προσθέσουμε μια νέα ενέργεια στη γραμμή κατασκευής:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Καθορίστε τον μεταγλωττιστή που χρησιμοποιήθηκε για την κατασκευή του έργου. Παρατηρήστε το κοντέινερ docker που είναι εγκατεστημένο σε αυτήν τη δραστηριότητα. Για παράδειγμα, υπάρχει ένα ειδικό δοχείο για GCC:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Τώρα ας εγκαταστήσουμε το PVS-Studio και τα απαραίτητα βοηθητικά προγράμματα:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Προσθέστε τις ακόλουθες γραμμές στον επεξεργαστή:

apt-get update && apt-get -y install wget gnupg jq

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

Τώρα ας πάμε στην καρτέλα Εκτέλεση (το πρώτο εικονίδιο) και προσθέστε τον ακόλουθο κώδικα στο αντίστοιχο πεδίο επεξεργασίας:

pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY

if [ "$BUDDY_EXECUTION_PULL_REQUEST_NO" != '' ]; then
  PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
  MERGE_BASE=`wget -qO - 
    https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID} 
    | jq -r ".base.ref"`

  git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck 
                              -S .pvs-pr.list
else
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck
fi

plog-converter -t errorfile PVS-Studio.log --cerr -w

Εάν έχετε διαβάσει την ενότητα για το Travs-CI, τότε αυτός ο κωδικός σας είναι ήδη γνωστός, ωστόσο, τώρα υπάρχει ένα νέο βήμα:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Το γεγονός είναι ότι τώρα δεν αναλύουμε το αποτέλεσμα της συγχώνευσης, αλλά το HEAD του κλάδου από το οποίο γίνεται το αίτημα έλξης:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Άρα είμαστε σε δέσμευση υπό όρους B3 και πρέπει να πάρουμε τη διαφορά από A3:

PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
  MERGE_BASE=`wget -qO - 
    https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID} 
    | jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

Για να προσδιορίσετε A3 Ας χρησιμοποιήσουμε το GitHub API:

https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}

Χρησιμοποιήσαμε τις ακόλουθες μεταβλητές που παρέχονται από τον Buddy:

  • $BUDDY_EXECUTION_PULL_REQEUST_NO - αριθμός αιτήματος έλξης.
  • $BUDDY_REPO_SLUG - συνδυασμός ονόματος χρήστη και αποθετηρίου (για παράδειγμα max / test).

Τώρα ας αποθηκεύσουμε τις αλλαγές χρησιμοποιώντας το κουμπί παρακάτω και ας ενεργοποιήσουμε την ανάλυση αιτήματος έλξης:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Σε αντίθεση με τον Travis CI, δεν χρειάζεται να προσδιορίσουμε .pvs-studio για προσωρινή αποθήκευση, αφού ο Buddy αποθηκεύει αυτόματα όλα τα αρχεία για επόμενες εκκινήσεις. Επομένως, το τελευταίο πράγμα που απομένει είναι να αποθηκεύσετε τη σύνδεση και τον κωδικό πρόσβασης για το PVS-Studio στο Buddy. Αφού αποθηκεύσουμε τις αλλαγές, θα επιστρέψουμε στο Pipeline. Πρέπει να πάμε στη ρύθμιση μεταβλητών και να προσθέσουμε σύνδεση και κλειδί για το PVS-Studio:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Μετά από αυτό, η εμφάνιση ενός νέου αιτήματος έλξης ή δέσμευσης θα ενεργοποιήσει έναν έλεγχο. Εάν μια δέσμευση περιέχει σφάλματα, τότε ο Buddy θα το επισημάνει στη σελίδα αιτήματος έλξης.

AppVeyor

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

Ας πάμε στην καρτέλα Ρυθμίσεις στην επισκόπηση του έργου:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Ας κάνουμε κύλιση προς τα κάτω σε αυτήν τη σελίδα και ας ενεργοποιήσουμε την αποθήκευση προσωρινής μνήμης για τη δημιουργία αιτημάτων έλξης:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Τώρα ας πάμε στην καρτέλα Περιβάλλον, όπου καθορίζουμε την εικόνα που θα δημιουργηθεί και τις απαραίτητες μεταβλητές περιβάλλοντος:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Εάν έχετε διαβάσει τις προηγούμενες ενότητες, είστε πολύ εξοικειωμένοι με αυτές τις δύο μεταβλητές − PVS_KEY и PVS_USERNAME. Αν όχι, τότε επιτρέψτε μου να σας υπενθυμίσω ότι είναι απαραίτητα για τον έλεγχο της άδειας χρήσης του αναλυτή PVS-Studio. Στο μέλλον, θα τους συναντήσουμε ξανά σε σενάρια Bash.

Στην ίδια σελίδα παρακάτω, καθορίστε το φάκελο για την προσωρινή αποθήκευση:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Εάν δεν το κάνουμε αυτό, τότε θα αναλύσουμε ολόκληρο το έργο αντί για μερικά αρχεία, αλλά θα λάβουμε την έξοδο με βάση τα καθορισμένα αρχεία. Επομένως, είναι σημαντικό να εισαγάγετε το σωστό όνομα καταλόγου.

Τώρα ήρθε η ώρα για δοκιμή του σεναρίου. Ανοίξτε την καρτέλα Δοκιμές και επιλέξτε Σενάριο:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Επικολλήστε τον παρακάτω κώδικα σε αυτή τη φόρμα:

sudo apt-get update && sudo apt-get -y install jq

wget -q -O - https://files.viva64.com/etc/pubkey.txt 
  | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list

sudo apt-get update && sudo apt-get -y install pvs-studio

pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY

PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
  PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
  MERGE_BASE=`wget -qO - 
    https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID} 
    | jq -r ".base.ref"`

  git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck 
                              --dump-files --dump-log pvs-dump.log 
                              -S .pvs-pr.list
else
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck
fi

plog-converter -t errorfile PVS-Studio.log --cerr -w

Ας ρίξουμε μια ματιά στο ακόλουθο μέρος του κώδικα:

PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
  PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
  MERGE_BASE=`wget -qO - 
   https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID} 
   | jq -r ".base.ref"`

  git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck 
                              --dump-files --dump-log pvs-dump.log 
                              -S .pvs-pr.list
else
  pvs-studio-analyzer analyze -j8 
                              -o PVS-Studio.log 
                              --disableLicenseExpirationCheck
fi

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

Κατά την εγκατάσταση του αναλυτή στο AppVeyor, συνάντησα μια εξαιρετικά περίεργη συμπεριφορά του αναλυτή. Από τη μια, όλα λειτούργησαν σωστά, αλλά η ανάλυση δεν ξεκίνησε. Πέρασα πολύ χρόνο παρατηρώντας ότι βρισκόμαστε στον κατάλογο /home/appveyor/projects/testcalc/ και ο αναλυτής είναι σίγουρος ότι βρισκόμαστε στο /opt/appveyor/build-agent/. Τότε συνειδητοποίησα ότι η μεταβλητή $PWD είναι λίγο ψέμα. Για το λόγο αυτό, ενημέρωσα με μη αυτόματο τρόπο την τιμή του πριν ξεκινήσω την ανάλυση.

Και μετά όλα, όπως πριν:

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio
Τώρα σκεφτείτε το ακόλουθο απόσπασμα:

PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO - 
  https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID} 
  | jq -r ".base.ref"`

Σε αυτό, παίρνουμε τη διαφορά μεταξύ των κλάδων στους οποίους δηλώνεται το αίτημα έλξης. Για αυτό χρειαζόμαστε τις ακόλουθες μεταβλητές περιβάλλοντος:

  • $APPVEYOR_PULL_REQUEST_NUMBER - αριθμός αιτήματος έλξης.
  • $APPVEYOR_REPO_NAME - όνομα χρήστη και αποθήκη έργου.

Συμπέρασμα

Φυσικά, δεν έχουμε εξετάσει όλες τις πιθανές υπηρεσίες συνεχούς ένταξης, ωστόσο, όλες έχουν πολύ παρόμοιες ιδιαιτερότητες εργασίας. Με εξαίρεση την προσωρινή αποθήκευση, κάθε υπηρεσία φτιάχνει το δικό της «ποδήλατο», οπότε όλα είναι πάντα διαφορετικά.

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

Σας ευχαριστώ για την προσοχή σας. Αν κάτι δεν πάει καλά, τότε μη διστάσετε να μας γράψετε στο υποστήριξη. Θα συμβουλεύσουμε και θα βοηθήσουμε.

Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio

Εάν θέλετε να μοιραστείτε αυτό το άρθρο με ένα αγγλόφωνο κοινό, χρησιμοποιήστε τον σύνδεσμο μετάφρασης: Maxim Zvyagintsev. Ανάλυση δεσμεύσεων και αιτημάτων έλξης σε Travis CI, Buddy και AppVeyor χρησιμοποιώντας PVS-Studio.

Πηγή: www.habr.com

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