Linuxi ja macOS-i C- ja C++-keelte PVS-Studio analüsaatoris, alates versioonist 7.04, ilmus testimisvõimalus määratud failide loendi kontrollimiseks. Uut režiimi kasutades saate konfigureerida analüsaatorit kontrollima kohustusi ja tõmbetaotlusi. See artikkel näitab teile, kuidas seadistada GitHubi projektifailide loendi kontrolli populaarsetes CI (pidev integreerimine) süsteemides, nagu Travis CI, Buddy ja AppVeyor.
Failide loendi kontrollimise režiim
PVS-Studio 7.04 versioonil Linuxile ja macOS-ile on lähtefailide loendi kontrollimise režiim. See töötab projektide puhul, mille ehitussüsteem võimaldab teil faili luua
Samuti saab failide loendi kontrollimise režiimi kasutada koos kompilaatorite käitamise jälgimisjäljega (pvs-studio-analyzer trace). Selleks peate esmalt läbi viima projekti täieliku ehituse ja seda jälgima, et analüsaator koguks täielikku teavet kõigi kontrollitavate failide kompileerimisparameetrite kohta.
Sellel valikul on aga märkimisväärne puudus - igal käivitamisel peate kas kogu projekti täieliku ehitusjälgi tegema, mis iseenesest on vastuolus kiire täitmiskontrolli ideega. Või kui jätate jälitustulemuse vahemällu, võivad analüsaatori järgnevad käivitamised osutuda mittetäielikuks, kui lähtefaili sõltuvusstruktuur muutub pärast jälgimist (näiteks ühele lähtefailile lisatakse uus #include).
Seetõttu ei soovita me kasutada faililoendi kontrollimise režiimi koos jälgimislogiga, et kontrollida kohustusi või tõmbamistaotlusi. Juhul, kui saate sissekande kontrollimisel teha järkjärgulist ehitamist, kaaluge režiimi kasutamist
Analüüsimiseks mõeldud lähtefailide loend salvestatakse tekstifaili ja edastatakse parameetri abil analüsaatorisse -S:
pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt
See fail määrab failide suhtelised või absoluutsed teed ja iga uus fail peab olema uuel real. Analüüsimiseks on lubatud määrata mitte ainult failide nimed, vaid ka mitmesugused tekstid. Parser näeb, et see pole fail, ja ignoreerib seda rida. See võib olla kasulik kommenteerimisel, kui failid määratakse käsitsi. Tihti luuakse aga CI sõelumise käigus failide loend, nt failid sissekandmisest või tõmbamistaotlusest.
Nüüd saate seda režiimi kasutades uut koodi kiiresti testida, enne kui see jõuab peamisse arendusharusse. Selleks, et kontrollsüsteem analüsaatori hoiatustele reageeriks, tuleb utiliit plog-muundur lipp lisatud --näita-hoiatused:
plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...
Selle lipuga tagastab muundur nullist erineva koodi, kui analüsaatori aruandes on hoiatusi. Tagastuskoodi abil saate blokeerida eelkinnituskonksu, sidumis- või tõmbamistaotluse ning kuvada ekraanil genereeritud analüsaatori aruannet, jagada seda või saata postiga.
Märge. Failide loendi esmakordsel analüüsimisel analüüsitakse kogu projekti, kuna analüsaator peab looma projekti lähtefailide sõltuvuste faili päisefailidest. See on C- ja C++-failide sõelumise funktsioon. Tulevikus saab sõltuvusfaili vahemällu salvestada ja analüsaator uuendab seda automaatselt. Täitmiste kontrollimise eelis faililoendi kontrollrežiimi kasutamisel võrreldes järkjärgulise sõelumisrežiimi kasutamisega seisneb selles, et vahemällu tuleb salvestada ainult see fail, mitte objektifailid.
Tõmbepäringu analüüsi üldpõhimõtted
Kogu projekti analüüs võtab palju aega, seega on mõttekas kontrollida vaid mõnda osa sellest. Probleem on selles, et peate eraldama uued failid ülejäänud projektifailidest.
Vaatleme näidet kahe haruga sidumispuust:
Teeskleme, et pühendume A1 sisaldab üsna suurel hulgal juba kontrollitud koodi. Natuke varem tegime kohustusest haru A1 ja muutis mõnda faili.
Muidugi märkasite seda pärast A1 oli veel kaks kohustust, kuid need olid ka teiste filiaalide ühinemised, sest me ei tee kohustusi meister. Ja nüüd on kätte jõudnud aeg, mil kiirparandus valmis. Seetõttu ilmus ühendamise taotlus B3 и A3.
Muidugi oleks võimalik kontrollida kogu nende ühendamise tulemust, kuid see oleks liiga pikk ja põhjendamatu, kuna muudeti vaid mõnda faili. Seetõttu on tõhusam analüüsida ainult muutunud.
Selleks saame harude erinevuse, olles selle haru PÄSIS, millest tahame masteriks sulanduda:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
$MERGE_BASE käsitleme üksikasjalikult hiljem. Fakt on see, et mitte iga CI-teenus ei anna liitmise aluse kohta vajalikku teavet, nii et iga kord peate nende andmete hankimiseks välja pakkuma uusi viise. Seda kirjeldatakse allpool iga kirjeldatud veebiteenuse puhul.
Niisiis, saime filiaalide erinevuse või õigemini muudetud failinimede loendi. Nüüd peame faili andma .pvs-pr.list (suunasime ülaltoodud väljundi sellele ümber) analüsaatorisse:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
Pärast analüüsi peame teisendama logifaili (PVS-Studio.log) loetavasse vormingusse:
plog-converter -t errorfile PVS-Studio.log --cerr -w
See käsk loetleb vead
Ainult siin ei pea me mitte ainult vigu kuvama, vaid teavitama ka meie monteerimis- ja testimisteenust probleemide olemasolust. Selle jaoks lisati konverterile lipp -W (--näita-hoiatused). Kui analüsaatoril on vähemalt üks hoiatus, siis utiliidi tagastuskood plog-muundur muutub väärtuseks 2, mis omakorda teavitab CI-teenust, et tõmbepäringu failides on võimalikud vead.
Travis C.I.
Konfiguratsioon tehakse faili kujul .travis.yml. Mugavuse huvides soovitan teil panna kõik eraldi bash-skripti funktsioonidega, mida failist kutsutakse .travis.yml (bash skriptinimi.sh funktsiooni_nimi).
Lisame skriptile vajaliku koodi sisse lööma, nii et saame rohkem funktsioone. Jaotises paigaldama kirjutame järgmise:
install:
- bash .travis.sh travis_install
Kui teil oli juhiseid, saate need sidekriipsud eemaldades skripti teisaldada.
Avame faili .travis.sh ja lisage funktsioonile analüsaatori seadistus 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
}
Nüüd lisame selle jaotise käsikiri käivita analüüs:
script:
- bash .travis.sh travis_script
Ja bash-skriptis:
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
}
Seda koodi tuleb käivitada pärast projekti loomist, näiteks kui teil oli CMake'i ehitamine:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
}
See selgub järgmiselt:
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
}
Tõenäoliselt olete määratud keskkonnamuutujaid juba märganud. $TRAVIS_PULL_REQUEST и $TRAVIS_BRANCH. Travis CI deklareerib need üksi:
- $TRAVIS_PULL_REQUEST salvestab tõmbamispäringu numbri või valekui see on tavaline haru;
- $TRAVIS_REPO_SLUG salvestab projekti hoidla nime.
Selle funktsiooni algoritm:
Travis CI reageerib tagastuskoodidele, nii et hoiatuste olemasolu annab teenusele märku veast.
Vaatame seda koodirida lähemalt:
git diff --name-only origin/HEAD > .pvs-pr.list
Tõsiasi on see, et Travis CI liidab tõmbetaotluse analüüsimise ajal harud automaatselt:
Seetõttu analüüsime A4Ja mitte B3->A3. Selle funktsiooni tõttu peame erinevuse arvutama A3, mis on ainult haru ülaosast päritolu.
Üks oluline detail jääb alles - päisefailide sõltuvuste vahemällu salvestamine koostatud tõlkeüksustest (*.c, *.cc, *.cpp jne). Analüsaator arvutab need sõltuvused esimesel käivitamisel failide loendi kontrollimise režiimis välja ja salvestab need seejärel .PVS-Studio kataloogi. Travis CI võimaldab teil kaustu vahemällu salvestada, seega salvestame kataloogiandmed .PVS-Studio/:
cache:
directories:
- .PVS-Studio/
See kood tuleb failile lisada .travis.yml. See kataloog salvestab erinevaid pärast analüüsi kogutud andmeid, mis kiirendavad oluliselt järgnevaid faililoendi analüüsi või lisaanalüüsi käike. Kui seda ei tehta, analüüsib analüsaator tegelikult iga kord kõiki faile.
Semu
Nagu Travis C.I.,
Kõigepealt peame ehitusreale lisama uue toimingu:
Määrake kompilaator, mida projekti koostamiseks kasutati. Pange tähele sellesse tegevusse installitud dokkimiskonteinerit. Näiteks on GCC jaoks spetsiaalne konteiner:
Nüüd installime PVS-Studio ja vajalikud utiliidid:
Lisage redaktorisse järgmised read:
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
Nüüd läheme vahekaardile Käivita (esimene ikoon) ja lisame vastavale redaktoriväljale järgmise koodi:
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
Kui olete Travs-CI jaotist lugenud, on see kood teile juba tuttav, kuid nüüd on uus samm:
Fakt on see, et praegu ei analüüsi me mitte liitmise tulemust, vaid selle haru HEAD, kust tõmbamistaotlus tehakse:
Nii et me oleme tingimuslikus kohustuses B3 ja me peame saama erinevuse 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
Et määrata A3 Kasutame GitHubi API-t:
https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}
Kasutasime järgmisi Buddy pakutavaid muutujaid:
- $BUDDY_EXECUTION_PULL_REQEUST_NO - tõmba päringu number;
- $BUDDY_REPO_SLUG - kasutajanime ja hoidla kombinatsioon (näiteks max / test).
Nüüd salvestame muudatused alloleva nupu abil ja lubame tõmbepäringu analüüsi:
Erinevalt Travis CI-st ei pea me täpsustama .pvs-stuudio vahemällu salvestamiseks, kuna Buddy salvestab automaatselt vahemällu kõik failid järgmisteks käivitamisteks. Seetõttu on viimaseks jäänud PVS-Studio sisselogimine ja parool Buddysse salvestada. Pärast muudatuste salvestamist jõuame tagasi torujuhtme juurde. Peame minema muutujate seadistusse ja lisama PVS-Studio sisselogimise ja võtme:
Pärast seda käivitab uue tõmbamistaotluse või kohustuse ilmumine kontrolli. Kui kohustus sisaldab vigu, juhib Buddy sellele tõmbetaotluse lehel tähelepanu.
AppVeyor
AppVeyori seadistamine sarnaneb Buddyga, kuna kõik toimub veebiliideses ja projektihoidlasse pole vaja *.yml faili lisada.
Läheme projekti ülevaates vahekaardile Seaded:
Kerime seda lehte allapoole ja lubame tõmbepäringute koostamiseks vahemälu salvestamise:
Nüüd läheme vahekaardile Keskkond, kus määrame koostatava pildi ja vajalikud keskkonnamuutujad:
Kui olete lugenud eelmisi jaotisi, olete nende kahe muutujaga väga tuttav PVS_KEY и PVS_USERNAME. Kui ei, siis tuletan meelde, et need on vajalikud PVS-Studio analüsaatori litsentsi kontrollimiseks. Tulevikus kohtume nendega taas Bashi skriptides.
Samal lehel allpool määrake vahemällu salvestamise kaust:
Kui me seda ei tee, siis analüüsime paari faili asemel kogu projekti, kuid väljundi saame määratud failide põhjal. Seetõttu on oluline sisestada õige kataloogi nimi.
Nüüd on aeg skripti testida. Avage vahekaart Testid ja valige Skript:
Kleepige sellele vormile järgmine kood:
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
Vaatame koodi järgmist osa:
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
Üsna konkreetne pwd käsu väärtuse omistamine muutujale, mis peaks selle vaikeväärtuse salvestama, tundub esmapilgul kummaline, siiski seletan kõik hetkega lahti.
AppVeyoris analüsaatorit seadistades puutusin kokku analüsaatori äärmiselt kummalise käitumisega. Ühest küljest kõik toimis korrektselt, aga analüüsi ei hakanud tegema. Ma märkasin palju aega, et oleme kataloogis /home/appveyor/projects/testcalc/ ja analüsaator on kindel, et oleme kataloogis /opt/appveyor/build-agent/. Siis sain aru, et muutuja $PWD on natuke vale. Sel põhjusel värskendasin enne analüüsi alustamist selle väärtust käsitsi.
Ja siis kõik, nagu varem:
Nüüd kaaluge järgmist lõiku:
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"`
Selles saame erinevuse harude vahel, millel tõmbetaotlus deklareeritakse. Selleks vajame järgmisi keskkonnamuutujaid:
- $APPVEYOR_PULL_REQUEST_NUMBER – tõmbetaotluse number;
- $APPVEYOR_REPO_NAME – kasutajanimi ja projektihoidla.
Järeldus
Loomulikult ei ole me kõiki võimalikke pideva integratsiooni teenuseid arvesse võtnud, kuid neil kõigil on väga sarnane tööspetsiifika. Välja arvatud vahemällu salvestamine, teeb iga teenus oma "ratta", nii et kõik on alati erinev.
Kusagil, nagu Travis-CI-s, töötab paar koodirida ja vahemälu laitmatult; kuskil, nagu AppVeyoris, peate lihtsalt määrama seadetes kausta; kuid kuskil peate looma ainulaadsed võtmed ja proovima veenda süsteemi, et see annaks teile võimaluse vahemällu salvestatud fragment üle kirjutada. Seega, kui soovite seadistada tõmbepäringu analüüsi pideva integratsiooniteenuse jaoks, mida ülalpool ei käsitletud, veenduge esmalt, et vahemällu salvestamisega ei tekiks probleeme.
Tänan tähelepanu eest. Kui midagi ei õnnestu, siis kirjuta meile julgelt aadressil
Kui soovite seda artiklit inglise keelt kõneleva publikuga jagada, kasutage tõlkelinki: Maxim Zvjagintsev.
Allikas: www.habr.com