Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
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-stuudio on tööriist C, C++, C# ja Java keeles kirjutatud programmide lähtekoodi vigade ja võimalike haavatavuste tuvastamiseks. Töötab 64-bitistes süsteemides Windowsis, Linuxis ja macOS-is.

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 compile_commands.json. See on vajalik, et analüsaator eraldaks teavet määratud failide koostamise kohta. Kui teie ehitussüsteem ei toeta faili compile_commands.json genereerimist, võite proovida sellist faili utiliidi abil genereerida Pidage.

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 inkrementaalne analüüs.

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:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil

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 stderr (standardvea väljundvoog).

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:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
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:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
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., Semu annab võimaluse automaatselt koostada ja testida GitHubi salvestatud projekte. Erinevalt Travis CI-st on see konfigureeritud veebiliideses (saadaval on bashi tugi), mistõttu ei ole vaja projekti konfiguratsioonifaile salvestada.

Kõigepealt peame ehitusreale lisama uue toimingu:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
Määrake kompilaator, mida projekti koostamiseks kasutati. Pange tähele sellesse tegevusse installitud dokkimiskonteinerit. Näiteks on GCC jaoks spetsiaalne konteiner:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
Nüüd installime PVS-Studio ja vajalikud utiliidid:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
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:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
Fakt on see, et praegu ei analüüsi me mitte liitmise tulemust, vaid selle haru HEAD, kust tõmbamistaotlus tehakse:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
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:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
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:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
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:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
Kerime seda lehte allapoole ja lubame tõmbepäringute koostamiseks vahemälu salvestamise:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
Nüüd läheme vahekaardile Keskkond, kus määrame koostatava pildi ja vajalikud keskkonnamuutujad:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
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:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
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:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
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:

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil
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 toetus. Anname nõu ja aitame.

Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil

Kui soovite seda artiklit inglise keelt kõneleva publikuga jagada, kasutage tõlkelinki: Maxim Zvjagintsev. Kinnitus- ja tõmbamistaotluste analüüs Travis CI-s, Buddy-s ja AppVeyoris PVS-Studio abil.

Allikas: www.habr.com

Lisa kommentaar