Katika kichanganuzi cha PVS-Studio cha lugha za C na C++ kwenye Linux na macOS, kuanzia toleo la 7.04, chaguo la jaribio limeonekana kuangalia orodha ya faili maalum. Kwa kutumia hali mpya, unaweza kusanidi kichanganuzi ili kuangalia ahadi na maombi ya kuvuta. Nakala hii itakuambia jinsi ya kusanidi kuangalia orodha ya faili zilizobadilishwa za mradi wa GitHub katika mifumo maarufu ya CI (Ushirikiano Unaoendelea) kama Travis CI, Buddy na AppVeyor.
Hali ya kukagua orodha ya faili
Katika toleo la PVS-Studio 7.04 la Linux na macOS, hali ya kuangalia orodha ya faili za chanzo imeonekana. Hii inafanya kazi kwa miradi ambayo mfumo wake wa ujenzi hukuruhusu kutoa faili
Pia, hali ya kukagua orodha ya faili inaweza kutumika pamoja na kumbukumbu ya ufuatiliaji ya uzinduaji wa mkusanyaji (pvs-studio-analyzer trace). Ili kufanya hivyo, utahitaji kwanza kufanya ujenzi kamili wa mradi na ufuatilie ili analyzer kukusanya taarifa kamili kuhusu vigezo vya mkusanyiko wa faili zote zinazokaguliwa.
Walakini, chaguo hili lina shida kubwa - utahitaji kutekeleza ufuatiliaji kamili wa mradi mzima kila wakati unapoiendesha, ambayo yenyewe inapingana na wazo la kuangalia ahadi haraka. Au, ukiweka akiba ya matokeo ya ufuatiliaji yenyewe, utendakazi unaofuata wa kichanganuzi unaweza kuwa haujakamilika ikiwa muundo wa utegemezi wa faili za chanzo utabadilika baada ya ufuatiliaji (kwa mfano, #include mpya imeongezwa kwenye mojawapo ya faili za chanzo).
Kwa hivyo, hatupendekezi kutumia hali ya kuangalia orodha ya faili na logi ya kufuatilia ili kuangalia ahadi au maombi ya kuvuta. Iwapo unaweza kufanya ujenzi wa nyongeza wakati wa kuangalia ahadi, fikiria kutumia modi
Orodha ya faili za chanzo kwa uchambuzi huhifadhiwa kwenye faili ya maandishi na kupitishwa kwa analyzer kwa kutumia parameter -S:
pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt
Faili hii inabainisha njia za jamaa au kabisa za faili, na kila faili mpya lazima iwe kwenye mstari mpya. Inakubalika kutaja sio tu majina ya faili kwa ajili ya uchambuzi, lakini pia maandishi mbalimbali. Mchambuzi ataona kuwa hii sio faili na itapuuza mstari. Hii inaweza kuwa muhimu kwa kutoa maoni ikiwa faili zimebainishwa mwenyewe. Walakini, mara nyingi orodha ya faili itatolewa wakati wa uchambuzi katika CI, kwa mfano, hizi zinaweza kuwa faili kutoka kwa ahadi au ombi la kuvuta.
Sasa, kwa kutumia hali hii, unaweza kuangalia kwa haraka msimbo mpya kabla ya kuingia kwenye tawi kuu la uendelezaji. Ili kuhakikisha kuwa mfumo wa skanning unajibu maonyo ya kichanganuzi, matumizi kibadilishaji cha plagi bendera imeongezwa --onyesha-maonyo:
plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...
Kwa alama hii, kigeuzi kitarejesha msimbo usio sifuri ikiwa kuna maonyo katika ripoti ya kichanganuzi. Kwa kutumia msimbo wa kurejesha, unaweza kuzuia ndoano ya awali, ahadi, au kuvuta ombi, na ripoti ya kichanganuzi iliyotolewa inaweza kuonyeshwa, kushirikiwa, au kutumwa kwa barua pepe.
Kumbuka. Unapoanza kwanza kuchambua orodha ya faili, mradi mzima utachambuliwa, kwa sababu mchambuzi anahitaji kutoa faili ya utegemezi wa faili za chanzo cha mradi kwenye faili za kichwa. Hiki ni kipengele cha kuchambua faili za C na C++. Katika siku zijazo, faili ya utegemezi inaweza kuhifadhiwa na itasasishwa moja kwa moja na analyzer. Faida ya kuangalia ahadi wakati wa kutumia hali ya kuangalia orodha ya faili kwa kutumia modi ya uchanganuzi unaoongezeka ni kwamba unahitaji tu kuweka akiba faili hiyo na sio faili za kitu.
Kanuni za jumla za uchambuzi wa ombi la kuvuta
Kuchambua mradi mzima huchukua muda mwingi, kwa hivyo ni mantiki kuangalia sehemu fulani tu yake. Shida ni kwamba unahitaji kutenganisha faili mpya kutoka kwa faili zingine za mradi.
Wacha tuangalie mfano wa mti wa ahadi na matawi mawili:
Hebu fikiria ahadi hiyo A1 ina idadi kubwa ya msimbo ambayo tayari imejaribiwa. Mapema kidogo tulifanya tawi kutoka kwa ahadi A1 na kubadilisha baadhi ya faili.
Wewe, bila shaka, niliona kwamba baada ya A1 ahadi mbili zaidi zilifanyika, lakini hizi pia zilikuwa muunganisho wa matawi mengine, kwa sababu hatujitolea bwana. Na sasa wakati umefika ambapo hotfix tayari. Ndiyo sababu ombi la kuvuta kwa kuunganisha lilionekana B3 ΠΈ A3.
Bila shaka, itawezekana kuangalia matokeo yote ya kuunganishwa kwao, lakini hii itakuwa ya muda mrefu sana na isiyofaa, kwa kuwa faili chache tu zilibadilishwa. Kwa hiyo, ni ufanisi zaidi kuchambua tu waliobadilishwa.
Ili kufanya hivyo, tunapata tofauti kati ya matawi, kuwa kwenye KICHWA cha tawi ambalo tunataka kuunganishwa kuwa bwana:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
$MERGE_BASE tutaiangalia kwa undani baadaye. Ukweli ni kwamba si kila huduma ya CI hutoa taarifa muhimu kuhusu database ya kuunganisha, hivyo kila wakati unapaswa kuja na njia mpya za kupata data hii. Hii itaelezewa kwa undani hapa chini katika kila moja ya huduma zilizoelezewa za wavuti.
Kwa hiyo, tulipata tofauti kati ya matawi, au tuseme, orodha ya majina ya faili ambayo yalibadilishwa. Sasa tunahitaji kutoa faili .pvs-pr.list (tulielekeza pato hapo juu kwake) kwa kichanganuzi:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
Baada ya uchanganuzi, tunahitaji kubadilisha faili ya kumbukumbu (PVS-Studio.log) kuwa umbizo rahisi kusoma:
plog-converter -t errorfile PVS-Studio.log --cerr -w
Amri hii itaorodhesha makosa ndani
Sasa tu hatuhitaji tu kuonyesha makosa, lakini pia kuwajulisha huduma yetu kwa mkusanyiko na kupima kuhusu kuwepo kwa matatizo. Kwa kusudi hili, bendera iliongezwa kwa kibadilishaji -W (--onyesha-maonyo) Ikiwa kuna angalau onyo moja la kichanganuzi, msimbo wa kurejesha matumizi kibadilishaji cha plagi itabadilika hadi 2, ambayo kwa upande wake itajulisha huduma ya CI kuhusu kuwepo kwa makosa yanayoweza kutokea katika faili za ombi la kuvuta.
Travis C.I.
Usanidi unafanywa kama faili .travis.yml. Kwa urahisi, nakushauri uweke kila kitu kwenye hati tofauti ya bash na kazi ambazo zitaitwa kutoka kwa faili .travis.yml (bash script_name.sh function_name).
Tutaongeza msimbo unaohitajika kwenye hati bash, kwa njia hii tutapata utendakazi zaidi. Katika sehemu kufunga tuandike yafuatayo:
install:
- bash .travis.sh travis_install
Ikiwa ulikuwa na maagizo yoyote, unaweza kuyahamisha kwenye hati, ukiondoa hyphens.
Hebu tufungue faili .travis.sh na ongeza mpangilio wa kichanganuzi kwenye kitendakazi 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
}
Sasa hebu tuongeze kwenye sehemu Muswada endesha uchambuzi:
script:
- bash .travis.sh travis_script
Na kwenye hati ya 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
}
Nambari hii inahitaji kuendeshwa baada ya kujenga mradi, kwa mfano, ikiwa ulikuwa na ujenzi kwenye CMake:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
}
Itageuka kama hii:
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
}
Labda tayari umegundua anuwai za mazingira $TRAVIS_PULL_REQUEST ΠΈ $TRAVIS_BRANCH. Travis CI inawatangaza kwa kujitegemea:
- $TRAVIS_PULL_REQUEST huhifadhi nambari ya ombi la kuvuta au uongo, ikiwa hii ni tawi la kawaida;
- $TRAVIS_REPO_SLUG huhifadhi jina la hazina ya mradi.
Algorithm ya kazi hii:
Travis CI hujibu misimbo ya kurejesha, kwa hivyo kuwepo kwa maonyo kutaambia huduma kuashiria ahadi kuwa ina makosa.
Sasa hebu tuangalie kwa karibu safu hii ya nambari:
git diff --name-only origin/HEAD > .pvs-pr.list
Ukweli ni kwamba Travis CI huunganisha matawi kiatomati wakati wa kuchambua ombi la kuvuta:
Kwa hivyo tunachambua A4na sio B3->A3. Kwa sababu ya kipengele hiki, tunahitaji kuhesabu tofauti na A3, ambayo ni sehemu ya juu ya tawi kutoka asili.
Kuna maelezo moja muhimu yaliyosalia - kuakibisha vitegemezi vya faili za vichwa kwenye vitengo vya tafsiri vilivyokusanywa (*.c, *.cc, *.cpp, nk.). Kichanganuzi hukokotoa vitegemezi hivi kinapozinduliwa kwa mara ya kwanza katika hali ya kuangalia orodha ya faili na kisha kuzihifadhi kwenye saraka ya .PVS-Studio. Travis CI hukuruhusu kuhifadhi folda, kwa hivyo tutahifadhi data ya saraka .PVS-Studio/:
cache:
directories:
- .PVS-Studio/
Nambari hii inahitaji kuongezwa kwenye faili .travis.yml. Saraka hii huhifadhi data mbalimbali zilizokusanywa baada ya uchanganuzi, ambayo itaharakisha kwa kiasi kikubwa uendeshaji unaofuata wa uchanganuzi wa orodha ya faili au uchanganuzi wa nyongeza. Ikiwa hii haijafanywa, basi analyzer itachambua faili zote kila wakati.
Buddy
Kama Travis CI,
Kwanza kabisa, tunahitaji kuongeza hatua mpya kwenye mstari wa kusanyiko:
Wacha tuonyeshe mkusanyaji ambaye alitumiwa kujenga mradi huo. Angalia kontena ya docker ambayo imesakinishwa katika hatua hii. Kwa mfano, kuna chombo maalum cha GCC:
Sasa wacha tusakinishe PVS-Studio na huduma muhimu:
Wacha tuongeze mistari ifuatayo kwa mhariri:
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
Sasa wacha tuende kwenye kichupo cha Run (ikoni ya kwanza) na ongeza nambari ifuatayo kwenye uwanja wa mhariri unaolingana:
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
Ikiwa unasoma sehemu kwenye Travs-CI, basi nambari hii tayari inajulikana kwako, hata hivyo, sasa kuna hatua mpya:
Ukweli ni kwamba sasa hatuchambui matokeo ya kuunganishwa, lakini MKUU wa tawi ambalo ombi la kuvuta hufanywa:
Kwa hivyo tuko katika ahadi ya masharti B3 na tunahitaji kupata tofauti kutoka 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
Kwa kuamua A3 Wacha tutumie API ya GitHub:
https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}
Tulitumia anuwai zifuatazo ambazo Buddy hutoa:
- $BUDDY_EXECUTION_PULL_REQEUST_NO - nambari ya ombi la kuvuta;
- $BUDDY_REPO_SLUG β mchanganyiko wa jina la mtumiaji na hazina (kwa mfano max/test).
Sasa wacha tuhifadhi mabadiliko kwa kutumia kitufe hapa chini na kuwezesha uchanganuzi wa ombi la kuvuta:
Tofauti na Travis CI, hatuhitaji kubainisha .pvs-studio kwa akiba, kwani Buddy huhifadhi kiotomatiki faili zote kwa uzinduzi unaofuata. Kwa hiyo, jambo la mwisho lililobaki ni kuhifadhi kuingia na nenosiri kwa PVS-Studio katika Buddy. Baada ya kuhifadhi mabadiliko, tutarejeshwa kwenye Pipeline. Tunahitaji kuendelea na kusanidi anuwai na kuongeza kuingia na ufunguo wa PVS-Studio:
Baada ya hayo, kuonekana kwa ombi jipya la kuvuta au kujitolea kutasababisha ukaguzi. Ikiwa ahadi ina makosa, Buddy ataonyesha hii kwenye ukurasa wa ombi la kuvuta.
AppVeyor
Kuweka AppVeyor ni sawa na Buddy, kwa kuwa kila kitu hutokea katika kiolesura cha wavuti na hakuna haja ya kuongeza faili ya *.yml kwenye hazina ya mradi.
Wacha tuende kwenye kichupo cha Mipangilio katika muhtasari wa mradi:
Hebu tutembeze chini ukurasa huu na kuwezesha kuhifadhi akiba kwa ajili ya kukusanya maombi ya kuvuta:
Sasa hebu tuende kwenye kichupo cha Mazingira, ambapo tunataja picha ya kusanyiko na vigezo muhimu vya mazingira:
Ikiwa umesoma sehemu zilizotangulia, unazifahamu vyema viambajengo hivi viwili - PVS_KEY ΠΈ PVS_USERNAME. Ikiwa sivyo, wacha nikukumbushe kwamba ni muhimu kuthibitisha leseni ya analyzer ya PVS-Studio. Tutaziona tena katika hati za Bash katika siku zijazo.
Katika ukurasa huo huo hapa chini tunaonyesha folda ya caching:
Ikiwa hatutafanya hivi, tutachambua mradi mzima badala ya faili kadhaa, lakini tutapata matokeo kutoka kwa faili zilizoainishwa. Kwa hiyo, ni muhimu kuingiza jina la saraka sahihi.
Sasa ni wakati wa hati kujaribu. Fungua kichupo cha Majaribio na uchague Hati:
Unahitaji kubandika nambari ifuatayo kwenye fomu hii:
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
Wacha tuzingatie sehemu ifuatayo ya nambari:
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
Mgawo maalum wa thamani ya amri ya pwd kwa kutofautisha ambayo inapaswa kuhifadhi dhamana hii chaguo-msingi inaonekana ya kushangaza kwa mtazamo wa kwanza, hata hivyo, nitaelezea kila kitu sasa.
Wakati wa kusanidi kichanganuzi katika AppVeyor, nilikutana na tabia ya kushangaza sana ya kichanganuzi. Kwa upande mmoja, kila kitu kilifanya kazi kwa usahihi, lakini uchambuzi haukuanza. Nilitumia muda mwingi kugundua kuwa tuko kwenye saraka ya /home/appveyor/projects/testcalc/, na mchambuzi ana uhakika kuwa tuko katika /opt/appveyor/build-agent/. Kisha nikagundua kuwa tofauti ya $PWD ilikuwa imelala kidogo. Kwa sababu hii, nilisasisha thamani yake mwenyewe kabla ya kuanza uchambuzi.
Na kisha kila kitu ni kama hapo awali:
Sasa fikiria kipande kifuatacho:
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"`
Ndani yake tunapata tofauti kati ya matawi ambayo ombi la kuvuta linatangazwa. Ili kufanya hivyo, tunahitaji vigezo vifuatavyo vya mazingira:
- $APPVEYOR_PULL_REQUEST_NUMBER - nambari ya ombi la kuvuta;
- $APPVEYOR_REPO_NAME - jina la mtumiaji na hazina ya mradi.
Hitimisho
Bila shaka, hatujazingatia huduma zote zinazowezekana za ujumuishaji, hata hivyo, zote zina sifa za uendeshaji zinazofanana sana kwa kila mmoja. Isipokuwa caching, kila huduma hufanya "baiskeli" yake mwenyewe, hivyo kila kitu ni tofauti kila wakati.
Mahali fulani, kama vile Travis-CI, mistari kadhaa ya msimbo na kache hufanya kazi bila dosari; mahali fulani, kama katika AppVeyor, unahitaji tu kutaja folda katika mipangilio; lakini mahali fulani unahitaji kuunda funguo za kipekee na jaribu kushawishi mfumo kukupa fursa ya kufuta kipande cha cached. Kwa hiyo, ikiwa unataka kuanzisha uchambuzi wa maombi ya kuvuta kwenye huduma ya ushirikiano inayoendelea ambayo haikujadiliwa hapo juu, basi kwanza uhakikishe kuwa hutakuwa na matatizo na caching.
Asante kwa umakini wako. Ikiwa kitu hakifanyiki, jisikie huru kutuandikia
Ikiwa ungependa kushiriki makala hii na hadhira inayozungumza Kiingereza, tafadhali tumia kiungo cha kutafsiri: Maxim Zvyagintsev.
Chanzo: mapenzi.com