Rakastatko GitLabia ja vihaat bugeja? Haluatko parantaa lähdekoodisi laatua? Sitten olet tullut oikeaan paikkaan. Tänään kerromme, kuinka PVS-Studio C# -analysaattori määritetään tarkistamaan yhdistämispyynnöt. Yksisarvista tunnelmaa ja iloista lukuhetkeä kaikille.
Muuten, julkaisimme PVS-Studio 7.08:n, jossa teimme paljon asioita
- C#-analysaattori Linuxille ja macOS:lle;
- laajennus Riderille;
- uusi tiedostoluettelon tarkistustila.
Tiedostoluettelon tarkistustila
Aiemmin tiettyjen tiedostojen tarkistamiseksi piti välittää analysaattorille .xml tiedostoluetteloineen. Mutta koska tämä ei ole kovin kätevää, olemme lisänneet mahdollisuuden siirtää .txt-tiedostoa, mikä tekee elämästä erittäin helppoa.
Tiettyjen tiedostojen tarkistamiseksi sinun on määritettävä lippu --lähdetiedostot (-f) ja siirrä .txt tiedostoluetteloineen. Se näyttää tältä:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
Jos olet kiinnostunut määrittämään sitoumustarkistus- tai vetopyyntöjä, voit tehdä sen myös tässä tilassa. Erona on analysoitavien tiedostojen luettelon saaminen, ja se riippuu käyttämistäsi järjestelmistä.
Yhdistämispyynnön tarkistamisen periaate
Tarkistuksen päätarkoitus on varmistaa, että analysaattorin yhdistämisen aikana havaitsemat ongelmat eivät joudu järjestelmään mestari haara. Emme myöskään halua analysoida koko projektia joka kerta. Lisäksi, kun haaroja yhdistetään, meillä on luettelo muuttuneista tiedostoista. Siksi suosittelen yhdistämispyynnön tarkistuksen lisäämistä.
Tältä yhdistämispyyntö näyttää ennen staattisen analysaattorin käyttöönottoa:
Eli kaikki virheet, jotka olivat haarassa muutokset, siirtyy päähaaraan. Koska emme haluaisi tätä, lisäämme analyysin, ja nyt kaavio näyttää tältä:
Analysoidaan muutokset 2 ja jos virheitä ei ole, hyväksymme yhdistämispyynnön, muuten hylkäämme sen.
Muuten, jos olet kiinnostunut analysoimaan C/C++:n sitoumuksia ja vetopyyntöjä, voit lukea siitä
GitLab
Ennen kuin aloitat yhdistämispyyntöjen analysoinnin, sinun on rekisteröidyttävä ja ladattava projektisi. Jos et tiedä miten tämä tehdään, niin suosittelen
Huomata. Alla kuvattu ympäristön perustamismenetelmä on yksi mahdollisista. Tavoitteena on näyttää vaiheet analysointiin tarvittavan ympäristön luomiseksi ja analysaattorin käynnistämiseksi. Ehkä sinun tapauksessasi olisi optimaalisempaa erottaa ympäristön valmistelun (arkistojen lisääminen, analysaattorin asennus) ja analyysin vaiheet: esimerkiksi Docker-kuvien valmisteleminen tarvittavalla ympäristöllä ja niiden käyttö tai jokin muu menetelmä.
Ymmärtääksesi paremmin, mitä nyt tapahtuu, suosittelen katsomaan seuraavaa kaaviota:
Analysaattori vaatii toimiakseen .NET Core SDK 3:n, joten ennen analysaattorin asennusta on lisättävä Microsoftin arkistot, joista analysaattorille tarvittavat riippuvuudet asennetaan. Microsoftin tietovarastojen lisääminen erilaisille Linux-jakeluille
Jos haluat asentaa PVS-Studion paketinhallinnan kautta, sinun on myös lisättävä PVS-Studio-arkistot. Tietovarastojen lisääminen eri jakeluille on kuvattu tarkemmin kohdassa
Analysaattori vaatii toimiakseen lisenssiavaimen. Voit saada koekäyttöluvan osoitteessa
Huomata. Huomaa, että kuvattu toimintatapa (yhdistyspyyntöjen analyysi) vaatii Enterprise-lisenssin. Siksi, jos haluat kokeilla tätä toimintatapaa, älä unohda ilmoittaa Viesti-kenttään, että tarvitset Enterprise-lisenssin.
Jos yhdistämispyyntö tapahtuu, meidän on analysoitava vain muuttuneiden tiedostojen luettelo, muuten analysoimme kaikki tiedostot. Analyysin jälkeen meidän on muunnettava lokit tarvitsemaamme muotoon.
Nyt, kun työskentelyalgoritmi on silmiesi edessä, voit siirtyä käsikirjoituksen kirjoittamiseen. Tätä varten sinun on vaihdettava tiedosto .gitlab-ci.yml tai jos sitä ei ole, luo se. Luodaksesi sen, sinun on napsautettava projektisi nimeä -> Aseta CI/CD.
Nyt olemme valmiita kirjoittamaan käsikirjoituksen. Kirjoita ensin koodi, joka asentaa analysaattorin ja syötä lisenssi:
before_script:
- apt-get update && apt-get -y install wget gnupg
- apt-get -y install git
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
- 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-dotnet
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
- dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln
Koska asennuksen ja aktivoinnin on tapahduttava ennen kaikkia muita komentosarjoja, käytämme erityistä etikettiä ennen_kirjoitusta. Selitän hieman tätä fragmenttia.
Analysaattorin asennuksen valmistelu:
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
PVS-Studio-tietovarastojen ja analysaattorin lisääminen:
- 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-dotnet
Lisenssin aktivointi:
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
$PVS_NAME - Käyttäjätunnus.
$PVS_KEY - tuoteavain.
Projektiriippuvuuksien palauttaminen missä $CI_PROJECT_DIR – koko polku projektihakemistoon:
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln
Oikeaa analysointia varten projekti on rakennettava onnistuneesti ja sen riippuvuudet on palautettava (esimerkiksi tarvittavat NuGet-paketit on ladattava).
Voit asettaa lisenssitietoja sisältäviä ympäristömuuttujia napsauttamalla Asetus, ja sen jälkeen - päällä CI/CD.
Etsi avautuvasta ikkunasta kohde Muuttujat, napsauta oikealla olevaa painiketta Laajentaa ja lisää muuttujia. Tuloksen pitäisi näyttää tältä:
Nyt voit siirtyä analyysiin. Lisätään ensin skripti täydelliseen analyysiin. Lippuun -t ohitamme polun ratkaisuun lipulle -o Kirjoita polku tiedostoon, johon analyysitulokset kirjoitetaan. Olemme myös kiinnostuneita palautuskoodista. Tässä tapauksessa olemme kiinnostuneita siitä, että toiminto pysähtyy, kun palautuskoodi sisältää tiedon, että analyysin aikana on annettu varoituksia. Tämä fragmentti näyttää tältä:
job:
script:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o
PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
Paluukoodit toimivat bitimaskin periaatteella. Esimerkiksi jos analyysin tuloksena on annettu varoituksia, palautuskoodi on 8. Jos lupa vanhenee kuukauden sisällä, palautuskoodi on 4. Jos analyysin aikana havaittiin virheitä, ja lisenssi vanhenee kuukauden sisällä, koodi palautuu, molemmat arvot kirjoitetaan: laske numerot yhteen ja saat lopullisen palautuskoodin - 8+4=12. Näin ollen tarkastamalla vastaavat bitit voidaan saada tietoa eri tiloista analyysin aikana. Palautuskoodit on kuvattu tarkemmin asiakirjan "pvs-studio-dotnet (Linux / macOS) Palautuskoodit" -osiossa "
Tässä tapauksessa olemme kiinnostuneita kaikista palautuskoodeista, joissa 8 esiintyy.
- exit_code=$((($exit_code & 8)/8))
Saamme 1, kun palautuskoodi sisältää bitin meitä kiinnostavasta numerosta, muuten saamme 0.
On aika lisätä yhdistämispyyntöanalyysi. Ennen kuin teemme tämän, valmistetaan paikka käsikirjoitukselle. Meidän on suoritettava se vain, kun yhdistämispyyntö tapahtuu. Se näyttää tältä:
merge:
script:
only:
- merge_requests
Siirrytään itse käsikirjoitukseen. Kohtasin sen tosiasian, että virtuaalikone ei tiedä siitä mitään alkuperä/mestari. Joten autetaan häntä hieman:
- git fetch origin
Nyt saamme eron haarojen välillä ja tallennamme tuloksen txt tiedosto:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
jossa $CI_COMMIT_SHA – viimeisen sitoumuksen hash.
Seuraavaksi alamme analysoida tiedostoluetteloa lipun avulla -f. Siirrämme siihen aiemmin vastaanotetun .txt-tiedoston. No, analogisesti täydellisen analyysin kanssa, tarkastelemme palautuskoodeja:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
Täydellinen skripti yhdistämispyynnön tarkistamiseksi näyttää tältä:
merge:
script:
- git fetch origin
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
only:
- merge_requests
Jäljelle jää vain lokin muuntaminen sen jälkeen, kun kaikki komentosarjat on käsitelty. Käytämme etikettiä after_script ja hyödyllisyys plog-muunnin:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
Apuohjelma
Muuten, jos haluat kätevästi työskennellä .json-raporttien kanssa paikallisesti IDE:stä, suosittelen
Tässä se on mukavuuden vuoksi .gitlab-ci.yml kokonaan:
image: debian
before_script:
- apt-get update && apt-get -y install wget gnupg
- apt-get -y install git
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
- 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-dotnet
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
- dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln
merge:
script:
- git fetch origin
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
only:
- merge_requests
job:
script:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o
PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
Kun olet lisännyt kaiken tiedostoon, napsauta Tee muutoksia. Nähdäksesi, että kaikki on oikein, siirry kohtaan CI / CD -> putkistojen -> Running. Näkyviin tulee virtuaalikoneen ikkuna, jonka lopussa pitäisi olla seuraava:
näin Työ onnistui - menestystä, kaikki on hyvin. Nyt voit testata, mitä olet tehnyt.
Työesimerkkejä
Esimerkkinä työstä luodaan yksinkertainen projekti (in mestari), joka sisältää useita tiedostoja. Sen jälkeen muutetaan toisessa haarassa vain yhtä tiedostoa ja yritämme tehdä yhdistämispyynnön.
Tarkastellaan kahta tapausta: milloin muokattu tiedosto sisältää virheen ja milloin se ei sisällä. Ensinnäkin esimerkki virheestä.
Oletetaan, että päähaarassa on tiedosto Program.cs, joka ei sisällä virheitä, mutta toiseen haaraan kehittäjä lisäsi virheellisen koodin ja haluaa tehdä yhdistämispyynnön. Millaisen virheen hän teki, ei ole niin tärkeää, pääasia, että se on olemassa. Esimerkiksi operaattori unohti heittää (Joo,
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}
Katsotaanpa virheen sisältävän esimerkin analysoinnin tulosta. Lisäsin lipun myös varmistaakseni, että vain yksi tiedosto jäsennettiin -r pvs-studio-dotnet-aloitusriville:
Näemme, että analysaattori löysi virheen eikä sallinut haarojen yhdistämistä.
Tarkastetaan esimerkkiä ilman virhettä. Koodin korjaaminen:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}
Yhdistämispyyntöanalyysin tulokset:
Kuten näemme, virheitä ei löytynyt ja tehtävän suoritus onnistui, minkä halusimme tarkistaa.
Johtopäätös
Huonon koodin karsiminen pois ennen oksien yhdistämistä on erittäin kätevää ja miellyttävää. Joten jos käytät CI/CD:tä, yritä upottaa staattinen analysaattori tarkistaaksesi. Lisäksi tämä tehdään melko yksinkertaisesti.
Kiitos huomiota.
Jos haluat jakaa tämän artikkelin englanninkielisen yleisön kanssa, käytä käännöslinkkiä: Nikolay Mironov.
Lähde: will.com