Ukuqala kwinguqulo 7.04, umhlalutyi wePVS-Studio weC kunye neC ++ kwiilwimi zeLinux kunye neMacOS inokhetho lokuvavanya ukujonga uluhlu lweefayile ezikhankanyiweyo. Usebenzisa imo entsha, unokuqwalasela umhlalutyi ukujonga ukuzibophelela kunye nokutsala izicelo. Eli nqaku liza kukubonisa indlela yokuseta uluhlu lwefayile yeprojekthi yeGitHub kwiinkqubo ezidumileyo zeCI (Uhlanganiso oluqhubekayo) ezifana neTravis CI, Buddy kunye neAppVeyor.
Imowudi yokujonga uluhlu lwefayile
Inguqulelo yePVS-Studio 7.04 yeLinux kunye neMacOS inemowudi yokujonga uluhlu lweefayile zomthombo. Oku kusebenza kwiiprojekthi ezinenkqubo yokwakha ekuvumela ukuba wenze ifayile
Kwakhona, indlela yokukhangela uluhlu lweefayile zingasetyenziswa kunye ne trace trace ye compiler runs (pvs-studio-analyzer trace). Ukwenza oku, kuya kufuneka uqale uqhube ukwakhiwa okupheleleyo kweprojekthi kwaye uyilandele ukuze umhlalutyi aqokelele ulwazi olupheleleyo malunga neeparitha zokuhlanganiswa kwazo zonke iifayile ezitshekishwayo.
Nangona kunjalo, olu khetho lune-drawback ebalulekileyo - kuya kufuneka wenze umkhondo opheleleyo wokwakha yonke iprojekthi ekusungulweni ngalunye, yona ngokwayo iphikisana nombono wokutshekisha ngokukhawuleza. Okanye, ukuba ugcina i-cache isiphumo sokulandela ngokwaso, ukuqaliswa okulandelayo komhlalutyi kunokujika kungagqibekanga ukuba ifayile yemvelaphi yokuxhomekeka kwesakhiwo siyatshintsha emva kokulandela umkhondo (umzekelo, i-#include entsha yongezwa kwenye yeefayile zomthombo).
Ke ngoko, asicebisi ukusebenzisa imowudi yokukhangela uluhlu lwefayile kunye nelogi yokulandela ukujonga ukwenza okanye ukutsala izicelo. Kwimeko apho unokwenza ulwakhiwo olongezelelekileyo xa ujonga ukuzibophelela, cinga ukusebenzisa imowudi
Uluhlu lweefayile zomthombo wokuhlalutya zigcinwa kwifayile yombhalo kwaye idluliselwe kwi-analyzer usebenzisa iparameter -S:
pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt
Le fayile iqulethe iindlela ezizalanayo okanye ezipheleleyo kwiifayile, kwaye ifayile entsha nganye kufuneka ibe kumgca omtsha. Kuvumelekile ukuba ungakhankanyi kuphela amagama eefayile zokuhlalutya, kodwa kunye neetekisi ezahlukeneyo. Umhlaseli uya kubona ukuba oku akuyofayile kwaye akayi kuwuhoya umgca. Oku kunokuba luncedo ekuphawuleni ukuba iifayile zichazwe ngesandla. Nangona kunjalo, rhoqo uluhlu lweefayile luya kwenziwa ngexesha lokwahlulahlula kweCI, umzekelo iifayile ezivela kwisibophelelo okanye isicelo sokutsalwa.
Ngoku, usebenzisa le mowudi, ungakhawuleza uvavanye ikhowudi entsha phambi kokuba ingene kwisebe eliphambili lophuhliso. Ukuze inkqubo yokuqinisekisa isabele kwizilumkiso zomhlalutyi, usetyenziso iplagi-converter iflegi yongeziwe --bonisa-izilumkiso:
plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...
Ngale flegi, umguquleli uya kubuyisela ikhowudi engekho zero ukuba kukho izilumkiso kwingxelo yomhlalutyi. Ukusebenzisa ikhowudi yokubuyisela, unokuvala i-hook ye-precommit, ukuzibophelela okanye ukutsala isicelo, kwaye ubonise ingxelo yomhlalutyi owenziweyo kwisikrini, wabelane ngayo okanye uyithumele ngeposi.
Phawula. Ngethuba lokuqala uqala ukuhlalutya uluhlu lweefayile, yonke iprojekthi iya kuhlalutywa, kuba umhlalutyi ufuna ukuvelisa ifayile yokuxhomekeka kwiifayile zomthombo weprojekthi kwiifayile zeheader. Olu luphawu lokwahlulahlula iifayile zeC kunye neC ++. Kwixesha elizayo, ifayile yokuxhomekeka ingagcinwa kwaye iya kuhlaziywa ngokuzenzekelayo ngumhlalutyi. I-advanteji yokujonga ukwenza xa usebenzisa imowudi yokujonga uluhlu lwefayile ngaphezulu kokusebenzisa imowudi yokwahlulahlula okongeziweyo kukuba kuphela loo fayile kufuneka igcinwe, hayi iifayile zento.
Imigaqo ngokubanzi yohlalutyo lwesicelo sokutsalwa
Uhlalutyo lweprojekthi yonke luthatha ixesha elininzi, ngoko kunengqiqo ukujonga inxalenye yayo kuphela. Ingxaki kukuba kufuneka ukwahlule iifayile ezintsha kwezinye iifayile zeprojekthi.
Qwalasela umzekelo womthi wokuzibophelela onamasebe amabini:
Masenze ngathi ukuzibophelela A1 iqulethe inani elikhulu ngokwaneleyo lekhowudi esele ikhangelwe. Kwangaphambilana senze isebe kwisivumelwano A1 kwaye utshintshe ezinye iifayile.
Ngokuqinisekileyo, uqaphele ukuba emva koko A1 bekukho izinto ezimbini zokuzibophelela, kodwa ezi zikwadityanisiwe kwamanye amasebe, kuba asizibophelelanga inkosi. Kwaye ngoku lifikile ixesha lokuba hotfix ilungile. Ke ngoko, kuye kwavela isicelo sokutsala ukudityaniswa B3 ΠΈ A3.
Ngokuqinisekileyo, kuya kwenzeka ukujonga yonke isiphumo sokudityaniswa kwabo, kodwa oku kuya kuba kude kakhulu kwaye kungafanelekanga, kuba iifayile ezimbalwa zatshintshwa. Ngoko ke, kusebenza ngakumbi ukuhlalutya kuphela ezitshintshileyo.
Ukwenza oku, sifumana umahluko phakathi kwamasebe, ekubeni kwi-INTLOKO yesebe apho sifuna ukudibanisa kwinkosi:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
$MERGE_BASE siza kuqwalasela ngokweenkcukacha kamva. Inyaniso kukuba akusiyo yonke inkonzo yeCI inikeza ulwazi oluyimfuneko malunga nesiseko sokudibanisa, ngoko ke rhoqo kufuneka ufike ngeendlela ezintsha zokufumana le datha. Oku kuya kuchazwa ngezantsi kwinkonzo nganye yewebhu echazwe.
Ke, sifumene umahluko phakathi kwamasebe, okanye kunoko, uluhlu lwamagama efayile atshintshiweyo. Ngoku kufuneka sinikeze ifayile .pvs-pr.list (sibuyisele imveliso engentla kuyo) kumhlalutyi:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
Emva kohlalutyo, kufuneka siguqule ifayile yelog (PVS-Studio.log) kwifomathi efundekayo:
plog-converter -t errorfile PVS-Studio.log --cerr -w
Lo myalelo uza kudwelisa iimpazamo kwi
Kuphela apha akufuneki kuphela ukubonisa iimpazamo, kodwa nokwazisa inkonzo yethu kwindibano kunye nokuvavanya malunga nobukho beengxaki. Kule nto, iflegi yongezwa kwisiguquli -W (--bonisa-izilumkiso). Ukuba kukho ubuncinane isilumkiso somhlalutyi omnye, ikhowudi yokubuyisela yoncedo iplagi-converter iya kutshintsha ukuya kwi-2, eya kuthi ikwazise inkonzo yeCI ukuba kukho iimpazamo ezinokuthi zifake iifayile zesicelo sokutsala.
UTravis CI
Uqwalaselo lwenziwe ngendlela yefayile .travis.yml. Ukuze kube lula, ndikucebisa ukuba ubeke yonke into kwiskripthi se-bash esahlukileyo esinemisebenzi eya kubizwa kwifayile .travis.yml (bash scriptname.sh function_name).
Siya kongeza ikhowudi efunekayo kwiskripthi ukutshatyalaliswa, ngoko sifumana ukusebenza okungakumbi. Kwicandelo fakela masibhale oku kulandelayo:
install:
- bash .travis.sh travis_install
Ukuba ubunayo nayiphi na imiyalelo, unokuyihambisa kwiscript ngokususa iqhagamshela.
Masivule ifayile .travis.sh kwaye wongeza ukuseta uhlalutyi kumsebenzi travis_fake ():
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
}
Ngoku masongeze kwicandelo elishicilelwe qhuba uhlalutyo:
script:
- bash .travis.sh travis_script
Kwaye kwiskripthi se-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
}
Le khowudi kufuneka iqhutywe emva kokuba iprojekthi yakhiwe, umzekelo, ukuba unokwakha i-CMake:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
}
Kuya kuvela ngolu hlobo:
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
}
Mhlawumbi sele uqaphele iimeko eziguquguqukayo ezikhankanyiweyo. $TRAVIS_PULL_REQUEST ΠΈ $TRAVIS_BRANCH. I-Travis CI izibhengeza ngokwayo:
- $TRAVIS_PULL_REQUEST igcina inombolo yesicelo sokutsalwa, okanye amangaukuba lisebe eliqhelekileyo;
- $TRAVIS_REPO_SLUG igcina igama lovimba weprojekthi.
I-algorithm yalo msebenzi:
I-Travis CI iphendula kwiikhowudi zokubuyisela, ngoko ubukho bezilumkiso buya kuxelela inkonzo ukuba ifake iflegi yokuzibophelela njenge-buggy.
Makhe sijonge ngakumbi kulo mgca wekhowudi:
git diff --name-only origin/HEAD > .pvs-pr.list
Inyani kukuba iTravis CI idibanisa ngokuzenzekelayo amasebe ngexesha lohlalutyo lwesicelo sokutsala:
Ngoko ke, sihlalutya A4, kwaye akunjalo B3->A3. Ngenxa yolu phawu, kufuneka sibale umahluko A3, engumphezulu wesebe ukusuka mvelaphi.
Kushiyeke inkcukacha enye ebalulekileyo - igcina ukuxhomekeka kweefayili zeheader kwiiyunithi zoguqulo ezihlanganisiweyo (*.c, *.cc, *.cpp, njl.). Umhlalutyi ubala ezi zixhomekeke kwisiqalo sokuqala kwindlela yokukhangela uluhlu lweefayile kwaye emva koko uzigcine kwi-.PVS-Studio directory. I-Travis CI ikuvumela ukuba ugcine iifolda, ngoko ke siya kugcina idatha yolawulo .PVS-Studio/:
cache:
directories:
- .PVS-Studio/
Le khowudi kufuneka yongezwe kwifayile .travis.yml. Olu luhlu lugcina idatha eyahlukeneyo eqokelelwe emva kokuhlalutya, eya kuthi ikhawulezise ngokukhawuleza ukuqhubela phambili koluhlu lweefayile okanye uhlalutyo olongezelelweyo. Ukuba oku akwenziwanga, ngoko umhlalutyi uya kuhlalutya zonke iifayile ngalo lonke ixesha.
Buddy
NjengoTravis C.I.,
Okokuqala, kufuneka songeze isenzo esitsha kumgca wokwakha:
Chaza umqokeleli osetyenzisiweyo ukwakha iprojekthi. Qaphela i-docker container efakwe kulo msebenzi. Umzekelo, kukho isikhongozeli esikhethekileyo se-GCC:
Ngoku masifake i-PVS-Studio kunye nezinto eziyimfuneko:
Yongeza le migca ilandelayo kumhleli:
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
Ngoku masiye kwi-Run tab (umfanekiso wokuqala) kwaye wongeze ikhowudi elandelayo kwindawo yomhleli ehambelanayo:
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
Ukuba ulifundile icandelo kwiTravs-CI, ke le khowudi sele iqhelekile kuwe, nangona kunjalo, ngoku kukho inyathelo elitsha:
Inyani kukuba ngoku asihlalutyi isiphumo sokudityaniswa, kodwa INTLOKO yesebe apho isicelo sokutsalwa senziwa khona:
Ke sikwisivumelwano esinemiqathango B3 kwaye kufuneka sifumane umahluko 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
Ukufumanisa A3 Masisebenzise iGitHub API:
https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}
Sisebenzise ezi ziguquguqukayo zilandelayo ezibonelelwe nguBuddy:
- $BUDDY_EXECUTION_PULL_REQEUST_NO - inombolo yesicelo sokutsala;
- $BUDDY_REPO_SLUG - indibaniselwano yegama lomsebenzisi kunye nendawo yokugcina (umzekelo max / test).
Ngoku masigcine utshintsho sisebenzisa iqhosha elingezantsi, kwaye sivumele uhlalutyo lwesicelo sokutsala:
Ngokungafaniyo neTravis CI, akufuneki sichaze .pvs-studio kugcino, kuba iBuddy igcina ngokuzenzekela zonke iifayile zokuqaliswa okulandelayo. Ke ngoko, into yokugqibela eseleyo kukugcina igama lokungena kunye negama lokugqitha lePVS-Studio eBuddy. Emva kokugcina utshintsho, siya kubuyela kwiPipeline. Kufuneka siye ekusetheni izinto eziguquguqukayo kwaye songeze ukungena kunye nesitshixo sePVS-Studio:
Emva koko, ukubonakala kwesicelo esitsha sokutsalwa okanye ukuzibophelela kuya kubangela itshekhi. Ukuba isiboniso sineempazamo, ke uBuddy uya kuyikhomba kwiphepha lesicelo sokutsalwa.
AppVeyor
Ukuseta i-AppVeyor kuyafana noBuddy, kuba yonke into yenzeka kujongano lwewebhu kwaye akukho mfuneko yokongeza ifayile * .yml kwindawo yokugcina iprojekthi.
Makhe siye kwi Useto thebhu kwisishwankathelo seprojekthi:
Masikrole ezantsi eli phepha kwaye sivumele ukugcinwa kwe-cache kwizicelo zokutsalwa zokwakha:
Ngoku masiye kwi-Environment thebhu, apho sichaza umfanekiso wokwakha kunye nezinto eziyimfuneko zokuguquguquka kwendawo:
Ukuba uwafundile amacandelo angaphambili, uqhelene kakhulu nezi ziguquguqukayo zimbini β PVS_KEY ΠΈ PVS_USERNAME. Ukuba akunjalo, makhe ndikukhumbuze ukuba bayimfuneko ukujonga ilayisenisi ye-PVS-Studio analyzer. Kwixesha elizayo, siya kudibana nabo kwakhona kwimibhalo yeBash.
Kwiphepha elinye elingezantsi, khankanya isiqulathi seefayili sogcino:
Ukuba asikwenzi oku, ngoko siya kuhlalutya yonke iprojekthi endaweni yeefayile ezimbalwa, kodwa siya kufumana umphumo ngokusekelwe kwiifayile ezikhankanyiweyo. Ngoko ke, kubalulekile ukufaka igama lolawulo oluchanekileyo.
Ngoku lixesha lokuba iskripthi sivavanye. Vula ithebhu yoVavanyo kwaye ukhethe iSikripthi:
Ncamathelisa le khowudi ilandelayo kule fomu:
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
Makhe sijonge le nxalenye ilandelayo yekhowudi:
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
Isabelo esikhethekileyo sexabiso lomyalelo we-pwd kuguquko olufanele ukugcina eli xabiso lingagqibekanga libonakala lingaqhelekanga ekuqaleni, nangona kunjalo, ndiza kucacisa yonke into ngomzuzwana.
Ngelixa ndiseta umhlalutyi kwi-AppVeyor, ndiye ndadibana nokuziphatha okungaqhelekanga komhlalutyi. Ngakolunye uhlangothi, yonke into yayisebenza ngokuchanekileyo, kodwa uhlalutyo aluzange luqale. Ndichithe ixesha elininzi ndiqaphela ukuba sikwikhaya/appveyor/projects/testcalc/directory, kwaye umhlalutyi uqinisekile ukuba sikuyo/opt/appveyor/build-agent/. Emva koko ndaqonda ukuba i-$ PWD eguquguqukayo ibubuxoki. Ngesi sizathu, ndihlaziye ixabiso layo ngesandla ngaphambi kokuba ndiqale uhlalutyo.
Kwaye emva koko yonke into, njengangaphambili:
Ngoku qwalasela esi siqwengana silandelayo:
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"`
Kuyo, sifumana umahluko phakathi kwamasebe apho isicelo sokutsalwa sibhengezwa khona. Ukwenza oku, sidinga oku kuguquguquka kwemekobume kulandelayo:
- $APPVEYOR_PULL_REQUEST_NUMBER - inombolo yesicelo sokutsala;
- $APPVEYOR_REPO_NAME - igama lomsebenzisi kunye novimba weprojekthi.
isiphelo
Ewe kunjalo, asikhange siqwalasele zonke iinkonzo zohlanganiso eziqhubekayo, nangona kunjalo, zonke zineenkcukacha zomsebenzi ezifanayo. Ngaphandle kwe-caching, inkonzo nganye yenza "ibhayisikili" yayo, ngoko yonke into ihlala ihlukile.
Kwindawo ethile, njengaseTravis-CI, imigca embalwa yekhowudi kunye ne-caching isebenza ngokungenasiphako; kwindawo ethile, njengakwiAppVeyor, kufuneka ukhankanye incwadi eneenkcukacha kwizicwangciso; kodwa kwindawo ethile kufuneka wenze izitshixo ezizodwa kwaye uzame ukukholisa inkqubo ukukunika ithuba lokubhala ngaphezulu iqhekeza elifihliweyo. Ke ngoko, ukuba ufuna ukuseta uhlalutyo lwesicelo sokutsala kwinkonzo yokudibanisa eqhubekayo engakhange ixoxwe ngasentla, ke qiniseka ukuba awuzukuba neengxaki nge-caching.
Enkosi ngosinaka kwakho. Ukuba kukho into engahambi kakuhle, zive ukhululekile ukusibhalela
Ukuba ufuna ukwabelana ngeli nqaku kunye nabaphulaphuli abathetha isiNgesi, nceda usebenzise ikhonkco lokuguqulela: UMaxim Zvyagintsev.
umthombo: www.habr.com