Mimitian ti vérsi 7.04, analisa PVS-Studio pikeun basa C sareng C ++ dina Linux sareng macOS gaduh pilihan tés pikeun mariksa daptar file anu ditangtukeun. Ngagunakeun modeu anyar, anjeun tiasa ngonpigurasikeun analyzer pikeun pariksa commits sarta narik requests. Tulisan ieu bakal nunjukkeun anjeun kumaha nyetél daptar daptar file proyék GitHub dina sistem CI (Continuous Integration) populér sapertos Travis CI, Buddy sareng AppVeyor.
Modeu pariksa daptar file
Versi PVS-Studio 7.04 pikeun Linux sareng macOS gaduh mode pikeun mariksa daptar file sumber. Ieu lumaku pikeun proyék-proyék anu ngawangun sistem ngamungkinkeun anjeun ngahasilkeun file
Ogé, modus mariksa daptar file bisa dipaké babarengan jeung strace renik ngajalankeun compiler (pvs-studio-analyzer trace). Jang ngalampahkeun ieu, anjeun mimitina kedah ngalaksanakeun konstruksi pinuh ku proyék sareng ngalacak éta supados analisa ngumpulkeun inpormasi lengkep ngeunaan parameter kompilasi sadaya file anu dipariksa.
Nanging, pilihan ieu ngagaduhan kalemahan anu signifikan - anjeun kedah kedah ngalaksanakeun ngalacak konstruksi pinuh ku sadayana proyék dina unggal peluncuran, anu nyalira bertentangan sareng ideu cek komitmen gancang. Atanapi, upami anjeun nyéépkeun hasil nyukcruk sorangan, peluncuran analisa anu salajengna tiasa janten teu lengkep upami struktur katergantungan file sumber robih saatos dilacak (contona, #include énggal ditambah kana salah sahiji file sumber).
Ku alatan éta, kami henteu nyarankeun ngagunakeun modeu pariksa daptar file sareng log jejak pikeun pariksa commits atanapi pull requests. Bisi anjeun tiasa ngalakukeun pangwangunan tambahan nalika mariksa komitmen, pertimbangkeun ngagunakeun modeu
Daptar file sumber pikeun analisa disimpen kana file téks sareng dikirimkeun ka analisa nganggo parameter -S:
pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt
Berkas ieu netepkeun jalur relatif atanapi mutlak kana file, sareng unggal file énggal kedah aya dina jalur énggal. Diijinkeun pikeun netepkeun henteu ngan ukur nami file pikeun dianalisis, tapi ogé sababaraha téks. Parser bakal ningali yén ieu sanés file sareng bakal malire jalur. Ieu bisa jadi mangpaat pikeun commenting lamun file dieusian sacara manual. Sanajan kitu, mindeng daptar file bakal dihasilkeun salila CI parsing, contona file ti commit atawa pamundut tarikan.
Ayeuna, nganggo modeu ieu, anjeun tiasa gancang nguji kode anyar sateuacan asup kana cabang pangembangan utama. Supados sistem verifikasi ngaréaksikeun kana peringatan analis, utilitas plog-converter bandéra ditambahkeun --nunjukkeun-warning:
plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...
Kalayan bandéra ieu, konvérsi bakal ngabalikeun kode anu henteu nol upami aya peringatan dina laporan analisa. Ngagunakeun kodeu balik, anjeun tiasa meungpeuk hiji hook precommit, bunuh atawa narik pamundut, sarta nembongkeun laporan analyzer dihasilkeun dina layar, babagi atawa ngirim ku mail.
Catetan. Pertama kali anjeun ngamimitian analisa daptar file, sakabéh proyék bakal dianalisis, sabab analisa kedah ngahasilkeun file gumantungna file sumber proyék dina file header. Ieu mangrupikeun fitur parsing file C sareng C ++. Dina mangsa nu bakal datang, file kagumantungan bisa sindangan sarta eta bakal diropéa otomatis ku analyzer nu. Kauntungannana mariksa commits nalika ngagunakeun modeu pariksa filelist leuwih ngagunakeun mode parsing Incremental nyaeta ngan éta file perlu sindangan, teu file objék.
Prinsip umum analisis pamundut tarikan
Analisis sakabéh proyék nyokot loba waktu, jadi masuk akal pikeun pariksa ngan sababaraha bagian tina eta. Masalahna nyaéta anjeun kedah misahkeun file énggal tina sesa file proyék.
Pertimbangkeun conto tangkal komit sareng dua cabang:
Hayu urang pura-pura yén komitmen A1 ngandung jumlah cukup badag kode nu geus dipariksa. A saeutik saméméhna urang nyieun cabang ti commit A1 sareng ngarobih sababaraha file.
Tangtu, anjeun noticed nu sanggeus A1 aya dua deui komitmen, tapi ieu ogé ngahijikeun cabang anu sanés, sabab kami henteu komitmen ngawasaan. Sareng ayeuna waktosna parantos sumping hotfix siap. Ku alatan éta, pamundut tarikan mucunghul pikeun ngahiji B3 и A3.
Tangtosna, anjeun tiasa pariksa sadayana hasil ngahijikeunana, tapi ieu bakal panjang teuing sareng teu leres, sabab ngan ukur sababaraha file anu dirobih. Ku sabab éta, langkung éfisién pikeun nganalisis ngan ukur anu dirobih.
Jang ngalampahkeun ieu, urang kéngingkeun bédana antara cabang-cabang, anu aya dina KEPALA cabang anu urang badé ngahijikeun kana master:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
$MERGE_BASE urang bakal mertimbangkeun di jéntré engké. Kanyataanna nyaéta henteu unggal jasa CI nyayogikeun inpormasi anu dipikabutuh ngeunaan dasar pikeun ngahiji, janten unggal waktos anjeun kedah gaduh cara énggal pikeun nyandak data ieu. Ieu bakal diwincik di handap dina unggal jasa wéb anu dijelaskeun.
Janten, urang ngagaduhan bédana antara cabang, atanapi langkungna, daptar nami file anu parantos dirobih. Ayeuna urang kedah masihan file .pvs-pr.list (urang dialihkeun kaluaran di luhur ka dinya) ka analyzer:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
Saatos analisa, urang kedah ngarobih file log (PVS-Studio.log) kana format anu tiasa dibaca:
plog-converter -t errorfile PVS-Studio.log --cerr -w
Paréntah ieu bakal daptar kasalahan dina
Ngan di dieu urang kedah henteu ngan ukur ningalikeun kasalahan, tapi ogé nginpokeun jasa kami pikeun ngarakit sareng nguji ngeunaan ayana masalah. Jang ngalampahkeun ieu, hiji bandéra ditambahkeun kana converter nu -W (--nunjukkeun-warning). Lamun aya sahanteuna hiji warning analyzer, kodeu balik ti utiliti plog-converter bakal robah jadi 2, anu dina gilirannana bakal ngabéjaan jasa CI nu aya kasalahan poténsial dina file pamundut tarikan.
Travis C.I.
Konfigurasi dilakukeun dina bentuk file .travis.yml. Pikeun genah, kuring mamatahan anjeun nempatkeun sadayana dina skrip bash anu misah sareng fungsi anu bakal disebat tina file .travis.yml (bash scriptname.sh function_name).
Urang bakal nambahan kodeu diperlukeun pikeun naskah on bash, sangkan meunang leuwih fungsionalitas. Dina bagian masang hayu urang nulis kieu:
install:
- bash .travis.sh travis_install
Upami anjeun ngagaduhan petunjuk, anjeun tiasa ngalihkeunana kana naskah ku cara ngahapus tanda hubung.
Hayu urang muka file .travis.sh sareng tambahkeun setelan analis kana fungsina 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
}
Ayeuna hayu urang tambahkeun kana bagian naskah ngajalankeun analisis:
script:
- bash .travis.sh travis_script
Sareng dina skrip 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
}
Kode ieu kedah dijalankeun saatos proyék diwangun, contona, upami anjeun ngagaduhan ngawangun CMake:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
}
Éta bakal katingali sapertos kieu:
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
}
Anjeun meureun geus noticed variabel lingkungan dieusian. $TRAVIS_PULL_REQUEST и $TRAVIS_BRANCH. Travis CI nyatakeun aranjeunna nyalira:
- $TRAVIS_PULL_REQUEST nyimpen angka pamundut tarikan, atawa palsulamun éta cabang normal;
- $TRAVIS_REPO_SLUG nyimpen nami Repository proyék.
Algoritma fungsi ieu:
Travis CI ngaréspon kana kodeu balik, ku kituna ayana peringatan bakal nyarioskeun jasa pikeun bendera komitmen salaku buggy.
Hayu urang ningal langkung caket kana garis kode ieu:
git diff --name-only origin/HEAD > .pvs-pr.list
Nyatana nyaéta Travis CI sacara otomatis ngahijikeun cabang nalika analisa paménta tarik:
Ku kituna, urang analisa A4teu B3->A3. Kusabab fitur ieu, urang kudu ngitung bédana tina А3, nu ngan luhureun cabang ti asal.
Hiji detil penting tetep - cache dependensi file lulugu dina unit tarjamah disusun (*.c, *.cc, *.cpp, jsb). Analyzer ngitung katergantungan ieu dina mimitina dina modeu mariksa daptar file teras simpen dina diréktori .PVS-Studio. Travis CI ngidinan Anjeun pikeun cache polder, ku kituna urang bakal nyimpen data diréktori .PVS-Studio/:
cache:
directories:
- .PVS-Studio/
Kode ieu perlu ditambahkeun kana file .travis.yml. Diréktori ieu nyimpen rupa-rupa data nu dikumpulkeun sanggeus analisis, nu nyata bakal nyepetkeun ngajalankeun saterusna analisis daptar file atawa analisis incremental. Upami ieu henteu dilakukeun, maka analisa leres-leres bakal nganalisis sadaya file unggal waktos.
Buddy
Kawas Travis C.I.,
Anu mimiti, urang kedah nambihan tindakan énggal kana garis ngawangun:
Sebutkeun kompiler anu dianggo pikeun ngawangun proyék. Perhatikeun wadah docker anu dipasang dina kagiatan ieu. Contona, aya wadah husus pikeun GCC:
Ayeuna hayu urang pasang PVS-Studio sareng utilitas anu diperyogikeun:
Tambihkeun garis di handap ieu kana éditor:
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
Ayeuna hayu urang ka tab Run (ikon kahiji) sareng tambahkeun kodeu di handap ieu kana widang éditor anu saluyu:
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
Upami anjeun parantos maca bagian dina Travs-CI, maka kode ieu parantos wawuh ka anjeun, tapi ayeuna aya léngkah énggal:
Kanyataanna nyaéta ayeuna urang nganalisa sanés hasil tina ngahiji, tapi KEPALA cabang dimana pamenta tarik dilakukeun:
Janten urang dina komitmen kondisional B3 sarta kami kudu meunang bédana ti 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
Pikeun nangtoskeun A3 Hayu urang nganggo GitHub API:
https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}
Kami nganggo variabel di handap ieu anu disayogikeun ku Buddy:
- $BUDDY_EXECUTION_PULL_REQEUST_NO - nomer pamundut tarik;
- $BUDDY_REPO_SLUG - kombinasi nami pangguna sareng gudang (contona max / test).
Ayeuna hayu urang simpen parobihan nganggo tombol di handap, sareng aktipkeun analisa pamundut tarik:
Teu kawas Travis CI, urang teu kudu nangtukeun .pvs-studio pikeun cache, saprak Buddy otomatis caches sadaya file pikeun peluncuran saterusna. Ku alatan éta, hal panungtungan ditinggalkeun pikeun nyimpen login sarta sandi pikeun PVS-Studio di Buddy. Saatos nyimpen parobihan, urang bakal uih deui ka Pipeline. Urang kedah angkat ka netepkeun variabel sareng tambahkeun login sareng konci pikeun PVS-Studio:
Saatos éta, penampilan pamundut tarik atanapi komitmen énggal bakal memicu cek. Upami komitmen ngandung kasalahan, maka Buddy bakal nunjukkeun éta dina halaman pamundut tarik.
AppVeyor
Nyetél AppVeyor téh sarupa jeung Buddy, saprak sagalana kajadian dina panganteur web tur teu perlu pikeun nambahkeun hiji * .yml file ka Repository proyék.
Hayu urang ka tab Setélan dina tinjauan proyék:
Hayu urang gulung ka handap halaman ieu sareng aktipkeun nyimpen cache pikeun ngawangun pamundut tarik:
Ayeuna hayu urang angkat ka tab Lingkungan, dimana urang netepkeun gambar pikeun ngawangun sareng variabel lingkungan anu diperyogikeun:
Upami anjeun parantos maca bagian sateuacana, anjeun terang pisan kana dua variabel ieu - PVS_KEY и PVS_USERNAME. Upami henteu, hayu atuh ngingetkeun yén aranjeunna kedah pariksa lisénsi analis PVS-Studio. Dina mangsa nu bakal datang, urang bakal papanggih aranjeunna deui dina Aksara Bash.
Dina kaca nu sami di handap, tangtukeun folder pikeun cache:
Upami urang henteu ngalakukeun ieu, maka urang bakal nganalisis sadayana proyék tinimbang sababaraha file, tapi urang bakal nampi kaluaran dumasar kana file anu ditangtukeun. Ku alatan éta, hal anu penting pikeun nuliskeun ngaran diréktori bener.
Ayeuna waktuna pikeun nguji naskah. Buka tab Tests tur pilih Script:
Tempelkeun kodeu ieu kana formulir ieu:
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
Hayu urang nempo bagian handap kode:
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
Tugas rada spésifik tina nilai paréntah pwd kana variabel anu kedah nyimpen nilai standar ieu sigana aneh dina glance kahiji, kumaha oge, kuring bakal ngajelaskeun sagalana dina momen.
Nalika nyetél analisa di AppVeyor, kuring mendakan paripolah anu anéh pisan tina analisa. Di hiji sisi, sagalana jalan leres, tapi analisis teu dimimitian. Kuring spent loba waktu perhatikeun yén kami di / home / appveyor / projects / testcalc / diréktori, sarta analyzer yakin yén kami aya dina / milih / appveyor / ngawangun-agén /. Teras kuring sadar yén variabel $ PWD mangrupikeun bohong. Ku sabab kitu, kuring sacara manual ngamutahirkeun nilaina sateuacan ngamimitian analisa.
Teras sadayana, sapertos sateuacana:
Ayeuna pertimbangkeun snippet di handap ieu:
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"`
Di jerona, urang kéngingkeun bédana antara cabang anu dinyatakeun paménta tarik. Pikeun ieu urang peryogi variabel lingkungan di handap ieu:
- $APPVEYOR_PULL_REQUEST_NUMBER - nomer pamundut tarik;
- $APPVEYOR_REPO_NAME - ngaran pamaké sarta gudang proyék.
kacindekan
Tangtosna, kami henteu nganggap sadaya jasa integrasi kontinyu anu mungkin, tapi aranjeunna sadayana gaduh spésifikasi padamelan anu sami. Iwal cache, unggal jasa nyieun sorangan "sapédah", jadi sagalana salawasna béda.
Di mana waé, sapertos di Travis-CI, sababaraha garis kode sareng cache tiasa dianggo sacara sampurna; wae, sakumaha dina AppVeyor, Anjeun ngan perlu nangtukeun folder dina setélan; tapi wae anjeun kudu nyieun konci unik tur coba ngayakinkeun sistem pikeun masihan anjeun kasempetan pikeun nimpa sempalan sindangan. Kukituna, upami anjeun hoyong nyetél analisa pamundut tarik dina jasa integrasi kontinyu anu henteu dibahas di luhur, teras pastikeun heula anjeun moal ngagaduhan masalah sareng cache.
Nuhun kana perhatosanana. Lamun hal teu hasil, teras ngarasa Luncat ka nulis ka kami di
Upami anjeun hoyong ngabagikeun tulisan ieu ka pamiarsa anu nyarios basa Inggris, mangga nganggo tautan tarjamahan: Maxim Zvyagintsev.
sumber: www.habr.com