Στον αναλυτή PVS-Studio για γλώσσες C και C++ σε Linux και macOS, ξεκινώντας από την έκδοση 7.04, εμφανίστηκε μια ευκαιρία δοκιμής για έλεγχο της λίστας των καθορισμένων αρχείων. Χρησιμοποιώντας τη νέα λειτουργία, μπορείτε να διαμορφώσετε τον αναλυτή ώστε να ελέγχει τις δεσμεύσεις και τα αιτήματα έλξης. Αυτό το άρθρο θα σας δείξει πώς να ρυθμίσετε έναν έλεγχο λίστας αρχείων έργου GitHub σε δημοφιλή συστήματα CI (Continuous Integration) όπως τα Travis CI, Buddy και AppVeyor.
Λειτουργία ελέγχου λίστας αρχείων
Η έκδοση του PVS-Studio 7.04 για Linux και macOS διαθέτει λειτουργία ελέγχου της λίστας των αρχείων προέλευσης. Αυτό λειτουργεί για έργα των οποίων το σύστημα κατασκευής σας επιτρέπει να δημιουργήσετε ένα αρχείο
Επίσης, η λειτουργία ελέγχου της λίστας των αρχείων μπορεί να χρησιμοποιηθεί μαζί με το ίχνος γραμμών των εκτελέσεων μεταγλωττιστή (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 με δύο κλάδους:
Ας προσποιηθούμε ότι η δέσμευση 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
Αυτή η εντολή θα απαριθμήσει τα σφάλματα
Μόνο εδώ χρειάζεται όχι μόνο να εμφανίσουμε σφάλματα, αλλά και να ενημερώσουμε την υπηρεσία μας για συναρμολόγηση και δοκιμές για την παρουσία προβλημάτων. Για αυτό, προστέθηκε μια σημαία στον μετατροπέα -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 ανταποκρίνεται στους κωδικούς επιστροφής, επομένως η παρουσία προειδοποιήσεων θα πει στην υπηρεσία να επισημάνει τη δέσμευση ως buggy.
Ας ρίξουμε μια πιο προσεκτική ματιά σε αυτήν τη γραμμή κώδικα:
git diff --name-only origin/HEAD > .pvs-pr.list
Το γεγονός είναι ότι το Travis CI συγχωνεύει αυτόματα κλάδους κατά την ανάλυση ενός αιτήματος έλξης:
Επομένως, αναλύουμε A4αλλά όχι Β3->Α3. Λόγω αυτού του χαρακτηριστικού, πρέπει να υπολογίσουμε τη διαφορά από A3, που είναι μόνο η κορυφή του κλάδου από καταγωγή.
Παραμένει μια σημαντική λεπτομέρεια - η προσωρινή αποθήκευση των εξαρτήσεων των αρχείων κεφαλίδας σε μεταγλωττισμένες μεταφραστικές μονάδες (*.c, *.cc, *.cpp, κ.λπ.). Ο αναλυτής υπολογίζει αυτές τις εξαρτήσεις κατά την πρώτη εκκίνηση στη λειτουργία ελέγχου της λίστας αρχείων και στη συνέχεια τις αποθηκεύει στον κατάλογο .PVS-Studio. Το Travis CI σάς επιτρέπει να αποθηκεύετε προσωρινά φακέλους, έτσι θα αποθηκεύσουμε δεδομένα καταλόγου .PVS-Studio/:
cache:
directories:
- .PVS-Studio/
Αυτός ο κωδικός πρέπει να προστεθεί στο αρχείο .travis.yml. Αυτός ο κατάλογος αποθηκεύει διάφορα δεδομένα που συλλέγονται μετά την ανάλυση, τα οποία θα επιταχύνουν σημαντικά τις επόμενες εκτελέσεις ανάλυσης λίστας αρχείων ή βαθμιαία ανάλυση. Εάν αυτό δεν γίνει, τότε ο αναλυτής θα αναλύει πραγματικά όλα τα αρχεία κάθε φορά.
Buddy
Όπως ο Travis C.I.,
Πρώτα απ 'όλα, πρέπει να προσθέσουμε μια νέα ενέργεια στη γραμμή κατασκευής:
Καθορίστε τον μεταγλωττιστή που χρησιμοποιήθηκε για την κατασκευή του έργου. Παρατηρήστε το κοντέινερ docker που είναι εγκατεστημένο σε αυτήν τη δραστηριότητα. Για παράδειγμα, υπάρχει ένα ειδικό δοχείο για GCC:
Τώρα ας εγκαταστήσουμε το 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, τότε αυτός ο κωδικός σας είναι ήδη γνωστός, ωστόσο, τώρα υπάρχει ένα νέο βήμα:
Το γεγονός είναι ότι τώρα δεν αναλύουμε το αποτέλεσμα της συγχώνευσης, αλλά το HEAD του κλάδου από το οποίο γίνεται το αίτημα έλξης:
Άρα είμαστε σε δέσμευση υπό όρους 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, δεν χρειάζεται να προσδιορίσουμε .pvs-studio για προσωρινή αποθήκευση, αφού ο Buddy αποθηκεύει αυτόματα όλα τα αρχεία για επόμενες εκκινήσεις. Επομένως, το τελευταίο πράγμα που απομένει είναι να αποθηκεύσετε τη σύνδεση και τον κωδικό πρόσβασης για το PVS-Studio στο Buddy. Αφού αποθηκεύσουμε τις αλλαγές, θα επιστρέψουμε στο Pipeline. Πρέπει να πάμε στη ρύθμιση μεταβλητών και να προσθέσουμε σύνδεση και κλειδί για το PVS-Studio:
Μετά από αυτό, η εμφάνιση ενός νέου αιτήματος έλξης ή δέσμευσης θα ενεργοποιήσει έναν έλεγχο. Εάν μια δέσμευση περιέχει σφάλματα, τότε ο Buddy θα το επισημάνει στη σελίδα αιτήματος έλξης.
AppVeyor
Η ρύθμιση του AppVeyor είναι παρόμοια με το Buddy, καθώς όλα συμβαίνουν στη διεπαφή ιστού και δεν χρειάζεται να προσθέσετε ένα αρχείο *.yml στο αποθετήριο του έργου.
Ας πάμε στην καρτέλα Ρυθμίσεις στην επισκόπηση του έργου:
Ας κάνουμε κύλιση προς τα κάτω σε αυτήν τη σελίδα και ας ενεργοποιήσουμε την αποθήκευση προσωρινής μνήμης για τη δημιουργία αιτημάτων έλξης:
Τώρα ας πάμε στην καρτέλα Περιβάλλον, όπου καθορίζουμε την εικόνα που θα δημιουργηθεί και τις απαραίτητες μεταβλητές περιβάλλοντος:
Εάν έχετε διαβάσει τις προηγούμενες ενότητες, είστε πολύ εξοικειωμένοι με αυτές τις δύο μεταβλητές − PVS_KEY и PVS_USERNAME. Αν όχι, τότε επιτρέψτε μου να σας υπενθυμίσω ότι είναι απαραίτητα για τον έλεγχο της άδειας χρήσης του αναλυτή PVS-Studio. Στο μέλλον, θα τους συναντήσουμε ξανά σε σενάρια Bash.
Στην ίδια σελίδα παρακάτω, καθορίστε το φάκελο για την προσωρινή αποθήκευση:
Εάν δεν το κάνουμε αυτό, τότε θα αναλύσουμε ολόκληρο το έργο αντί για μερικά αρχεία, αλλά θα λάβουμε την έξοδο με βάση τα καθορισμένα αρχεία. Επομένως, είναι σημαντικό να εισαγάγετε το σωστό όνομα καταλόγου.
Τώρα ήρθε η ώρα για δοκιμή του σεναρίου. Ανοίξτε την καρτέλα Δοκιμές και επιλέξτε Σενάριο:
Επικολλήστε τον παρακάτω κώδικα σε αυτή τη φόρμα:
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 είναι λίγο ψέμα. Για το λόγο αυτό, ενημέρωσα με μη αυτόματο τρόπο την τιμή του πριν ξεκινήσω την ανάλυση.
Και μετά όλα, όπως πριν:
Τώρα σκεφτείτε το ακόλουθο απόσπασμα:
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, πρέπει απλώς να καθορίσετε το φάκελο στις ρυθμίσεις. αλλά κάπου πρέπει να δημιουργήσετε μοναδικά κλειδιά και να προσπαθήσετε να πείσετε το σύστημα να σας δώσει την ευκαιρία να αντικαταστήσετε το αποθηκευμένο τμήμα. Επομένως, εάν θέλετε να ρυθμίσετε την ανάλυση αιτημάτων έλξης σε μια υπηρεσία συνεχούς ενοποίησης που δεν συζητήθηκε παραπάνω, τότε πρώτα βεβαιωθείτε ότι δεν θα έχετε προβλήματα με την προσωρινή αποθήκευση.
Σας ευχαριστώ για την προσοχή σας. Αν κάτι δεν πάει καλά, τότε μη διστάσετε να μας γράψετε στο
Εάν θέλετε να μοιραστείτε αυτό το άρθρο με ένα αγγλόφωνο κοινό, χρησιμοποιήστε τον σύνδεσμο μετάφρασης: Maxim Zvyagintsev.
Πηγή: www.habr.com