GitLabin yhdistämispyyntöjen analysointi PVS-Studio for C#:lle

GitLabin yhdistämispyyntöjen analysointi PVS-Studio for C#:lle
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.

PVS-studio on työkalu C-, C++-, C#- ja Java-kielillä kirjoitettujen ohjelmien lähdekoodien virheiden ja mahdollisten haavoittuvuuksien tunnistamiseen. Toimii 64-bittisissä järjestelmissä Windowsissa, Linuxissa ja macOS:ssä. Osaa analysoida 32-bittisille, 64-bittisille ja sulautetuille ARM-alustoille suunniteltua koodia.

Muuten, julkaisimme PVS-Studio 7.08:n, jossa teimme paljon asioita mielenkiintoista. Esimerkiksi:

  • 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:

GitLabin yhdistämispyyntöjen analysointi PVS-Studio for C#:lle
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ä:

GitLabin yhdistämispyyntöjen analysointi PVS-Studio for C#:lle
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ä täällä.

GitLab

GitLab on avoimen lähdekoodin verkkopohjainen DevOps-elinkaarityökalu, joka tarjoaa Gitille koodivaraston hallintajärjestelmän, jossa on oma wiki, ongelmanseurantajärjestelmä, CI/CD-putki ja muita ominaisuuksia.

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 Artikkeli kollegani.

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:

GitLabin yhdistämispyyntöjen analysointi PVS-Studio for C#:lle
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 kuvataan vastaavassa asiakirjassa.

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 asiakirjojen asianmukainen osa.

Analysaattori vaatii toimiakseen lisenssiavaimen. Voit saada koekäyttöluvan osoitteessa analysaattorin lataussivu.

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.

GitLabin yhdistämispyyntöjen analysointi PVS-Studio for C#:lle
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.

GitLabin yhdistämispyyntöjen analysointi PVS-Studio for C#:lle
Etsi avautuvasta ikkunasta kohde Muuttujat, napsauta oikealla olevaa painiketta Laajentaa ja lisää muuttujia. Tuloksen pitäisi näyttää tältä:

GitLabin yhdistämispyyntöjen analysointi PVS-Studio for C#:lle
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 "Visual Studio / MSBuild / .NET Core -projektien tarkistaminen komentoriviltä PVS-Studion avulla".

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 plog-muunnin on avoimen lähdekoodin projekti, jota käytetään jäsentimen virheraporttien muuntamiseen erilaisiin muotoihin, kuten HTML-muotoon. Tarkempi kuvaus apuohjelmasta löytyy alaosiosta "Plog Converter Utility" asiakirjojen asianmukainen osa.

Muuten, jos haluat kätevästi työskennellä .json-raporttien kanssa paikallisesti IDE:stä, suosittelen plugin joukkueelle IDE Rider. Sen käyttöä on kuvattu tarkemmin kohdassa asiaankuuluva asiakirja.

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:

GitLabin yhdistämispyyntöjen analysointi PVS-Studio for C#:lle
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, niin väärin):

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:

GitLabin yhdistämispyyntöjen analysointi PVS-Studio for C#:lle
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:

GitLabin yhdistämispyyntöjen analysointi PVS-Studio for C#:lle
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.

GitLabin yhdistämispyyntöjen analysointi PVS-Studio for C#:lle
Jos haluat jakaa tämän artikkelin englanninkielisen yleisön kanssa, käytä käännöslinkkiä: Nikolay Mironov. GitLabin yhdistämispyyntöjen analysointi PVS-Studio for C#:lle.

Lähde: will.com

Lisää kommentti