Í PVS-Studio greiningartækinu fyrir C og C++ tungumál á Linux og macOS, frá útgáfu 7.04, hefur birst prófunartækifæri til að athuga listann yfir tilgreindar skrár. Með því að nota nýja stillinguna geturðu stillt greiningartækið til að athuga skuldbindingar og draga beiðnir. Þessi grein mun sýna þér hvernig á að setja upp GitHub verkefnaskráalistaskoðun í vinsælum CI (Continuous Integration) kerfum eins og Travis CI, Buddy og AppVeyor.
Athugunarhamur skráarlista
Útgáfan af PVS-Studio 7.04 fyrir Linux og macOS er með stillingu til að athuga listann yfir upprunaskrár. Þetta virkar fyrir verkefni þar sem byggingarkerfi gerir þér kleift að búa til skrá
Einnig er hægt að nota aðferðina til að athuga skráalistann ásamt strace trace af þýðanda keyrslum (pvs-studio-analyzer trace). Til að gera þetta þarftu fyrst að framkvæma fulla byggingu á verkefninu og fylgjast með því þannig að greiningartækið safnar heildarupplýsingum um samantektarfæribreytur allra skráanna sem verið er að athuga.
Hins vegar hefur þessi valkostur verulegan galla - þú þarft annaðhvort að framkvæma fulla byggingaspor af öllu verkefninu við hverja sjósetningu, sem í sjálfu sér stangast á við hugmyndina um skjóta skuldbindingu. Eða ef þú geymir sjálfa rakningarniðurstöðuna í skyndiminni, getur síðari ræsing greiningartækisins reynst ófullnægjandi ef uppbygging frumskrárinnar breytist eftir rakningu (til dæmis er nýjum #include bætt við eina af frumskránum).
Þess vegna mælum við ekki með því að nota skráalistaathugunarhaminn með rekjaskrá til að athuga skuldbindingar eða draga beiðnir. Ef þú getur gert stigvaxandi byggingu þegar þú athugar skuldbindingu skaltu íhuga að nota haminn
Listinn yfir frumskrár til greiningar er vistaður í textaskrá og sendur til greiningartækisins með því að nota færibreytuna -S:
pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt
Þessi skrá tilgreinir hlutfallslegar eða algjörar slóðir að skrám og hver ný skrá verður að vera á nýrri línu. Það er leyfilegt að tilgreina ekki aðeins nöfn skráa til greiningar, heldur einnig ýmsan texta. Þjálfarinn mun sjá að þetta er ekki skrá og mun hunsa línuna. Þetta getur verið gagnlegt fyrir athugasemdir ef skrár eru tilgreindar handvirkt. Hins vegar verður listi yfir skrár oft búinn til við CI-þáttun, til dæmis skrár frá commit eða pull request.
Nú, með því að nota þennan hátt, geturðu fljótt prófað nýjan kóða áður en hann kemst í aðalþróunargreinina. Til þess að sannprófunarkerfið bregðist við viðvörunum greiningartækis, er tólið plog-breytir fána bætt við --vísa-viðvaranir:
plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...
Með þessum fána mun breytirinn skila kóða sem ekki er núll ef viðvaranir eru í greiningarskýrslunni. Með því að nota skilakóðann geturðu lokað á precommit krók, skuldbinda eða draga beiðni og birt greiningarskýrsluna á skjánum, deilt henni eða sent í pósti.
Athugið. Í fyrsta skipti sem þú byrjar að greina lista yfir skrár verður allt verkefnið greint, vegna þess að greiningartækið þarf að búa til skrá yfir ósjálfstæði frumskrár verkefnisins á hausskránum. Þetta er eiginleiki við að flokka C og C++ skrár. Í framtíðinni er hægt að vista ávanaskrána í skyndiminni og hún verður uppfærð sjálfkrafa af greiningartækinu. Kosturinn við að haka við skuldbindingar þegar þú notar skráalistaathugunarham fram yfir að nota stigvaxandi þáttunarham er að aðeins þarf að vista þá skrá, ekki hlutskrárnar.
Almennar reglur um greiningu á dráttarbeiðnum
Greining á öllu verkefninu tekur mikinn tíma og því er skynsamlegt að athuga aðeins hluta þess. Vandamálið er að þú þarft að aðskilja nýju skrárnar frá restinni af verkefnisskránum.
Lítum á dæmi um committré með tveimur greinum:
Við skulum láta sem skuldbindingin A1 inniheldur nokkuð mikið magn af kóða sem þegar hefur verið athugað. Nokkru fyrr gerðum við grein frá skuldbindingunni A1 og breytti nokkrum skrám.
Auðvitað tók maður eftir því eftir það A1 það voru tvær skuldbindingar í viðbót, en þetta voru líka sameiningar annarra útibúa, vegna þess að við skuldbindum okkur ekki í húsbóndi. Og nú er tíminn kominn þegar snarstilli tilbúinn. Þess vegna kom fram dráttarbeiðni um sameininguna B3 и A3.
Auðvitað væri hægt að athuga alla niðurstöðu sameiningar þeirra, en það væri of langt og óréttlætanlegt, þar sem aðeins örfáum skrám var breytt. Því er skilvirkara að greina aðeins þær breyttu.
Til að gera þetta fáum við muninn á greinunum, þar sem við erum í HÖFUÐI greinarinnar sem við viljum sameinast í meistara:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
$MERGE_BASE við munum íhuga í smáatriðum síðar. Staðreyndin er sú að ekki sérhver CI þjónusta veitir nauðsynlegar upplýsingar um grunninn fyrir sameininguna, svo í hvert skipti sem þú þarft að koma með nýjar leiðir til að fá þessi gögn. Þetta verður lýst ítarlega hér að neðan í hverri vefþjónustu sem lýst er.
Þannig að við fengum muninn á útibúunum, eða öllu heldur listann yfir skráarnöfn sem hefur verið breytt. Nú þurfum við að gefa skrána .pvs-pr.listi (við vísuðum úttakinu hér að ofan til þess) í greiningartækið:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
Eftir greiningu þurfum við að umbreyta annálaskránni (PVS-Studio.log) í læsilegt snið:
plog-converter -t errorfile PVS-Studio.log --cerr -w
Þessi skipun mun skrá villurnar í
Aðeins hér þurfum við ekki aðeins að sýna villur, heldur einnig að upplýsa þjónustu okkar fyrir samsetningu og prófanir um tilvist vandamála. Fyrir þetta var flaggi bætt við breytirinn -W (--vísa-viðvaranir). Ef það er að minnsta kosti ein greiningarviðvörun, skilakóði tólsins plog-breytir mun breytast í 2, sem aftur mun tilkynna CI þjónustunni um að hugsanlegar villur séu í skrám um pull request.
Travis C.I.
Stillingin er gerð í formi skráar .travis.yml. Til þæginda ráðlegg ég þér að setja allt í sérstakt bash forskrift með aðgerðum sem verða kallaðar úr skránni .travis.yml (bash scriptname.sh function_name).
Við munum bæta nauðsynlegum kóða við handritið á bash, svo við fáum meiri virkni. Í kafla setja við skulum skrifa eftirfarandi:
install:
- bash .travis.sh travis_install
Ef þú varst með einhverjar leiðbeiningar geturðu fært þær yfir í handritið með því að fjarlægja bandstrikina.
Við skulum opna skrána .travis.sh og bættu uppsetningu greiningartækisins við aðgerðina 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ú skulum við bæta við kaflann handrit hlaupagreining:
script:
- bash .travis.sh travis_script
Og í bash handriti:
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
}
Þennan kóða verður að keyra eftir að verkefnið er byggt, til dæmis ef þú varst með CMake byggingu:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
}
Það mun koma svona út:
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
}
Þú hefur líklega þegar tekið eftir tilgreindum umhverfisbreytum. $TRAVIS_PULL_REQUEST и $TRAVIS_BRANCH. Travis CI lýsir yfir þeim á eigin spýtur:
- $TRAVIS_PULL_REQUEST geymir pull request númerið, eða rangaref það er venjuleg grein;
- $TRAVIS_REPO_SLUG geymir nafn verkefnageymslunnar.
Reiknirit þessarar aðgerða:
Travis CI bregst við skilakóðum, svo tilvist viðvarana mun segja þjónustunni að flagga skuldbindinguna sem galla.
Við skulum skoða þessa línu af kóða nánar:
git diff --name-only origin/HEAD > .pvs-pr.list
Staðreyndin er sú að Travis CI sameinar útibú sjálfkrafa við greiningu á dráttarbeiðni:
Þess vegna greinum við A4Og ekki B3->A3. Vegna þessa eiginleika þurfum við að reikna mismuninn frá A3, sem er bara efst á greininni frá uppruna.
Eitt mikilvægt smáatriði er eftir - að vista ósjálfstæði hausskráa á samsettum þýðingareiningum (*.c, *.cc, *.cpp, osfrv.). Greiningartækið reiknar út þessar ósjálfstæði við fyrstu ræsingu í þeim ham að athuga lista yfir skrár og vistar þær síðan í .PVS-Studio skránni. Travis CI gerir þér kleift að vista möppur í skyndiminni, svo við munum vista möppugögn .PVS-Stúdíó/:
cache:
directories:
- .PVS-Studio/
Þessum kóða þarf að bæta við skrána .travis.yml. Þessi mappa geymir ýmis gögn sem safnað er eftir greiningu, sem mun flýta verulega fyrir síðari keyrslur á skráarlistagreiningu eða stigvaxandi greiningu. Ef þetta er ekki gert mun greiningartækið í raun greina allar skrár í hvert skipti.
Buddy
Eins og Travis C.I.,
Fyrst af öllu þurfum við að bæta við nýrri aðgerð við byggingarlínuna:
Tilgreindu þýðandann sem var notaður til að byggja upp verkefnið. Taktu eftir hafnargámnum sem er uppsettur í þessari starfsemi. Til dæmis er sérstakur gámur fyrir GCC:
Nú skulum við setja upp PVS-Studio og nauðsynleg tól:
Bættu eftirfarandi línum við ritstjórann:
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ú skulum við fara í Run flipann (fyrsta táknið) og bæta eftirfarandi kóða við samsvarandi ritstjórareit:
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
Ef þú hefur lesið kaflann um Travs-CI, þá er þessi kóða þegar kunnuglegur fyrir þig, en nú er nýtt skref:
Staðreyndin er sú að nú erum við ekki að greina niðurstöðu sameiningarinnar, heldur HÖFUÐA útibúsins sem dráttarbeiðnin er gerð frá:
Þannig að við erum í skilyrtri skuldbindingu B3 og við þurfum að fá muninn frá 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
Til að ákvarða A3 Við skulum nota GitHub API:
https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}
Við notuðum eftirfarandi breytur frá Buddy:
- $BUDDY_EXECUTION_PULL_REQEUST_NO - draga beiðni númer;
- $BUDDY_REPO_SLUG - sambland af notendanafni og geymslu (til dæmis max / test).
Nú skulum við vista breytingarnar með því að nota hnappinn hér að neðan og virkja greiningu á dráttarbeiðnum:
Ólíkt Travis CI þurfum við ekki að tilgreina .pvs-stúdíó fyrir skyndiminni, þar sem Buddy vistar allar skrár sjálfkrafa fyrir síðari ræsingu. Þess vegna er það síðasta sem er eftir að vista notandanafnið og lykilorðið fyrir PVS-Studio í Buddy. Eftir að hafa vistað breytingarnar munum við fara aftur í leiðsluna. Við þurfum að fara í að stilla breytur og bæta við innskráningu og lykli fyrir PVS-Studio:
Eftir það mun útlit nýrrar dráttarbeiðni eða skuldbindingar kalla fram ávísun. Ef commit inniheldur villur, þá mun Buddy benda á það á dragbeiðnisíðunni.
AppVeyor
Uppsetning AppVeyor er svipuð og Buddy, þar sem allt gerist í vefviðmótinu og það er engin þörf á að bæta *.yml skrá við verkefnageymsluna.
Við skulum fara í Stillingar flipann í verkefnayfirlitinu:
Við skulum fletta niður þessa síðu og virkja skyndiminni vistun til að byggja upp dráttarbeiðnir:
Nú skulum við fara í Umhverfi flipann, þar sem við tilgreinum myndina sem á að byggja og nauðsynlegar umhverfisbreytur:
Ef þú hefur lesið fyrri hlutana þekkirðu þessar tvær breytur mjög vel - PVS_KEY и PVS_USERNAME. Ef ekki, þá vil ég minna þig á að þeir eru nauðsynlegir til að athuga leyfi PVS-Studio greiningartækisins. Í framtíðinni munum við hitta þá aftur í Bash-handritum.
Á sömu síðu hér að neðan, tilgreindu möppuna fyrir skyndiminni:
Ef við gerum þetta ekki, þá munum við greina allt verkefnið í stað nokkurra skráa, en við munum fá úttakið byggt á tilgreindum skrám. Þess vegna er mikilvægt að slá inn rétt möppuheiti.
Nú er kominn tími fyrir handritið að prófa. Opnaðu próf flipann og veldu Script:
Límdu eftirfarandi kóða inn á þetta eyðublað:
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
Við skulum skoða eftirfarandi hluta kóðans:
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
Frekar sérstaka úthlutun gildis pwd skipunarinnar á breytu sem ætti að geyma þetta sjálfgefna gildi virðist undarlegt við fyrstu sýn, hins vegar mun ég útskýra allt í augnabliki.
Þegar ég setti upp greiningartækið í AppVeyor, rakst ég á afar undarlega hegðun greiningartækisins. Annars vegar virkaði allt rétt en greiningin fór ekki af stað. Ég eyddi miklum tíma í að taka eftir því að við erum í /home/appveyor/projects/testcalc/ skránni og greiningartækið er viss um að við séum í /opt/appveyor/build-agent/. Þá áttaði ég mig á því að $PWD breytan er svolítið lygi. Af þessum sökum uppfærði ég gildi þess handvirkt áður en greiningin hófst.
Og svo allt eins og áður:
Íhugaðu nú eftirfarandi brot:
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"`
Í henni fáum við mismuninn á greinunum sem dráttarbeiðnin er lýst yfir. Til þess þurfum við eftirfarandi umhverfisbreytur:
- $APPVEYOR_PULL_REQUEST_NUMBER - númer dráttarbeiðni;
- $APPVEYOR_REPO_NAME - notandanafn og verkefnageymsla.
Ályktun
Auðvitað höfum við ekki skoðað alla mögulega samfellda samþættingarþjónustu, en þær eru allar með mjög svipaðar vinnueinkenni. Að undanskildum skyndiminni gerir hver þjónusta sitt eigið „hjól“, svo allt er alltaf öðruvísi.
Einhvers staðar, eins og í Travis-CI, virkar nokkrar línur af kóða og skyndiminni gallalaust; einhvers staðar, eins og í AppVeyor, þarftu bara að tilgreina möppuna í stillingunum; en einhvers staðar þarftu að búa til einstaka lykla og reyna að sannfæra kerfið um að gefa þér tækifæri til að skrifa yfir skyndiminni brotið. Þess vegna, ef þú vilt setja upp dráttarbeiðnagreiningu á samfelldri samþættingarþjónustu sem ekki var fjallað um hér að ofan, þá skaltu fyrst ganga úr skugga um að þú eigir ekki í vandræðum með skyndiminni.
Takk fyrir athyglina. Ef eitthvað gengur ekki upp, ekki hika við að skrifa okkur á
Ef þú vilt deila þessari grein með enskumælandi áhorfendum, vinsamlegast notaðu þýðingartengilinn: Maxim Zvyagintsev.
Heimild: www.habr.com