Caru GitLab a chasineb bygiau? Eisiau gwella ansawdd eich cod ffynhonnell? Yna rydych chi wedi dod i'r lle iawn. Heddiw, byddwn yn dweud wrthych sut i ffurfweddu'r dadansoddwr PVS-Studio C# i wirio ceisiadau uno. Cael hwyliau unicorn a darllen hapus i bawb.
Gyda llaw, fe wnaethom ryddhau PVS-Studio 7.08, lle gwnaethom lawer o bethau
- Dadansoddwr C# ar gyfer Linux a macOS;
- ategyn ar gyfer Rider;
- modd gwirio rhestr ffeiliau newydd.
Modd gwirio rhestr ffeiliau
Yn flaenorol, er mwyn gwirio rhai ffeiliau, roedd angen pasio .xml gyda rhestr o ffeiliau i'r dadansoddwr. Ond gan nad yw hyn yn gyfleus iawn, rydym wedi ychwanegu'r gallu i drosglwyddo .txt, sy'n gwneud bywyd yn syml iawn.
Er mwyn gwirio ffeiliau penodol, rhaid i chi nodi'r faner --sourceFiles (-f) a throsglwyddo .txt gyda rhestr o ffeiliau. Mae'n edrych fel hyn:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
Os oes gennych ddiddordeb mewn sefydlu ceisiadau gwirio ymrwymo neu dynnu, gallwch hefyd wneud hynny gan ddefnyddio'r modd hwn. Y gwahaniaeth fydd cael rhestr o ffeiliau i'w dadansoddi a bydd yn dibynnu ar ba systemau rydych chi'n eu defnyddio.
Yr egwyddor o wirio cais uno
Prif hanfod y gwiriad yw sicrhau nad yw problemau a ganfuwyd gan y dadansoddwr yn ystod uno yn disgyn i'r meistr cangen. Nid ydym ychwaith am ddadansoddi'r prosiect cyfan bob tro. Ar ben hynny, wrth uno canghennau, mae gennym restr o ffeiliau wedi'u newid. Felly, rwy'n awgrymu ychwanegu gwiriad cais uno.
Dyma sut olwg sydd ar gais uno cyn gweithredu dadansoddwr statig:
Hynny yw, yr holl wallau oedd yn y gangen newidiadau, yn symud i'r brif gangen. Gan na fyddem eisiau hyn, rydym yn ychwanegu dadansoddiad, ac yn awr mae'r diagram yn edrych fel hyn:
Dadansoddi newidiadau2 ac, os nad oes unrhyw wallau, rydym yn derbyn y cais uno, fel arall rydym yn ei wrthod.
Gyda llaw, os oes gennych ddiddordeb mewn dadansoddi ceisiadau ymrwymo a thynnu am C / C ++, yna gallwch ddarllen amdano
GitLab
Cyn i chi ddechrau dadansoddi ceisiadau uno, mae angen i chi gofrestru a llwytho eich prosiect i fyny. Os nad ydych chi'n gwybod sut i wneud hyn, yna rwy'n awgrymu
Nodyn. Mae'r dull o sefydlu'r amgylchedd a ddisgrifir isod yn un o'r rhai posibl. Y nod yw dangos y camau ar gyfer sefydlu'r amgylchedd angenrheidiol ar gyfer dadansoddi a lansio'r dadansoddwr. Efallai yn eich achos chi y byddai'n fwy optimaidd gwahanu'r camau o baratoi'r amgylchedd (ychwanegu storfeydd, gosod dadansoddwr) a dadansoddiad: er enghraifft, paratoi delweddau Docker gyda'r amgylchedd angenrheidiol a'u defnyddio, neu ryw ddull arall.
Er mwyn deall yn well beth fydd yn digwydd nawr, rwy'n awgrymu edrych ar y diagram canlynol:
Mae angen .NET Core SDK 3 ar y dadansoddwr i weithredu, felly cyn gosod y dadansoddwr mae angen ichi ychwanegu'r ystorfeydd Microsoft y bydd y dibyniaethau sy'n ofynnol ar gyfer y dadansoddwr yn cael eu gosod ohonynt. Ychwanegu ystorfeydd Microsoft ar gyfer gwahanol ddosbarthiadau Linux
I osod PVS-Studio trwy'r rheolwr pecyn, bydd angen i chi hefyd ychwanegu'r ystorfeydd PVS-Studio. Disgrifir ychwanegu storfeydd ar gyfer gwahanol ddosbarthiadau yn fanylach yn
Mae angen allwedd trwydded ar y dadansoddwr i weithredu. Gallwch gael trwydded prawf yn
Nodyn. Sylwch fod angen trwydded Menter ar gyfer y dull gweithredu a ddisgrifir (dadansoddiad o geisiadau uno). Felly, os ydych chi am roi cynnig ar y dull gweithredu hwn, peidiwch ag anghofio nodi yn y maes βNegesβ bod angen trwydded Menter arnoch.
Os bydd cais uno yn digwydd, yna dim ond y rhestr o ffeiliau sydd wedi'u newid y mae angen i ni eu dadansoddi, fel arall byddwn yn dadansoddi pob ffeil. Ar Γ΄l dadansoddi, mae angen inni drosi'r logiau i'r fformat sydd ei angen arnom.
Nawr, gyda'r algorithm gwaith o flaen eich llygaid, gallwch symud ymlaen i ysgrifennu sgript. I wneud hyn, mae angen i chi newid y ffeil .gitlab-ci.yml neu, os nad yw'n bodoli, ei greu. Er mwyn ei greu, mae angen i chi glicio ar enw eich prosiect -> Sefydlu CI/CD.
Nawr rydyn ni'n barod i ysgrifennu'r sgript. Yn gyntaf, gadewch i ni ysgrifennu'r cod a fydd yn gosod y dadansoddwr ac yn nodi'r drwydded:
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
Gan fod yn rhaid gosod ac actifadu cyn pob sgript arall, rydym yn defnyddio label arbennig cyn_script. Gadewch imi egluro'r darn hwn ychydig.
Paratoi i osod y dadansoddwr:
- 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
Ychwanegu ystorfeydd a dadansoddwr PVS-Studio:
- 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
Gweithrediad trwydded:
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
$PVS_NAME - Enw defnyddiwr.
$PVS_KEY - allwedd cynnyrch.
Adennill dibyniaethau prosiect lle $CI_PROJECT_DIR β llwybr llawn i gyfeiriadur y prosiect:
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln
Ar gyfer dadansoddiad cywir, rhaid adeiladu'r prosiect yn llwyddiannus, a rhaid adfer ei ddibyniaethau (er enghraifft, rhaid lawrlwytho'r pecynnau NuGet angenrheidiol).
Gallwch osod newidynnau amgylchedd sy'n cynnwys gwybodaeth trwydded trwy glicio Gosod, ac ar Γ΄l - ymlaen CI/CD.
Yn y ffenestr sy'n agor, dewch o hyd i'r eitem Newidynnau, cliciwch ar y botwm ar y dde Expand ac ychwanegu newidynnau. Dylai'r canlyniad edrych fel hyn:
Nawr gallwch chi symud ymlaen i ddadansoddi. Yn gyntaf, gadewch i ni ychwanegu sgript ar gyfer dadansoddiad cyflawn. I'r faner -t rydym yn pasio'r llwybr i'r ateb i'r faner -o ysgrifennu'r llwybr i'r ffeil lle bydd canlyniadau'r dadansoddiad yn cael eu hysgrifennu. Mae gennym ddiddordeb hefyd yn y cod dychwelyd. Yn yr achos hwn, mae gennym ddiddordeb yn y llawdriniaeth yn dod i ben pan fydd y cod dychwelyd yn cynnwys gwybodaeth y cyhoeddwyd rhybuddion yn ystod y dadansoddiad. Dyma sut olwg sydd ar y darn hwn:
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
Mae codau dychwelyd yn gweithio ar yr egwyddor o fwgwd did. Er enghraifft, os cyhoeddwyd rhybuddion o ganlyniad i'r dadansoddiad, yna bydd y cod dychwelyd yn hafal i 8. Os bydd y drwydded yn dod i ben o fewn mis, yna bydd y cod dychwelyd yn hafal i 4. Os canfuwyd gwallau yn ystod y dadansoddiad, ac mae'r drwydded yn dod i ben o fewn mis, dychweliad y cod, bydd y ddau werth yn cael eu hysgrifennu: ychwanegwch y rhifau at ei gilydd a chael y cod dychwelyd terfynol - 8+4=12. Felly, trwy wirio'r darnau cyfatebol, gellir cael gwybodaeth am wahanol daleithiau yn ystod y dadansoddiad. Disgrifir codau dychwelyd yn fanylach yn yr adran " Codau Dychwelyd pvs-studio-dotnet (Linux / macOS)" o'r ddogfen "
Yn yr achos hwn, mae gennym ddiddordeb ym mhob cod dychwelyd lle mae 8 yn ymddangos.
- exit_code=$((($exit_code & 8)/8))
Byddwn yn derbyn 1 pan fydd y cod dychwelyd yn cynnwys y rhan o'r rhif y mae gennym ddiddordeb ynddo, fel arall byddwn yn derbyn 0.
Mae'n bryd ychwanegu dadansoddiad cais uno. Cyn i ni wneud hyn, gadewch i ni baratoi lle ar gyfer y sgript. Mae angen inni ei weithredu dim ond pan fydd cais uno yn digwydd. Mae'n edrych fel hyn:
merge:
script:
only:
- merge_requests
Gadewch i ni symud ymlaen at y sgript ei hun. Roeddwn yn wynebu'r ffaith nad yw'r peiriant rhithwir yn gwybod dim amdano tarddiad / meistr. Felly gadewch i ni ei helpu ychydig:
- git fetch origin
Nawr rydyn ni'n cael y gwahaniaeth rhwng y canghennau ac yn arbed y canlyniad i mewn txt ffeil:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
Lle $CI_COMMIT_SHA - hash o'r ymrwymiad diwethaf.
Nesaf, rydym yn dechrau dadansoddi'r rhestr o ffeiliau gan ddefnyddio'r faner -f. Rydym yn trosglwyddo'r ffeil .txt a dderbyniwyd yn flaenorol iddo. Wel, trwy gyfatebiaeth Γ’'r dadansoddiad llawn, edrychwn ar y codau dychwelyd:
- 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
Bydd y sgript gyflawn ar gyfer gwirio cais uno yn edrych fel hyn:
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
Y cyfan sydd ar Γ΄l yw ychwanegu trosi log ar Γ΄l i'r holl sgriptiau gael eu prosesu. Rydyn ni'n defnyddio'r label ar Γ΄l_script a defnyddioldeb trawsnewidydd plog:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
Cyfleustodau
Gyda llaw, os ydych chi eisiau gweithio'n gyfleus gydag adroddiadau .json yn lleol o'r DRhA, yna rwy'n awgrymu ein
Er hwylustod, dyma hi .gitlab-ci.yml yn llawn:
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
Unwaith y byddwch wedi ychwanegu popeth at y ffeil, cliciwch ar Ymrwymo newidiadau. Er mwyn gweld bod popeth yn gywir, ewch i CI / CD -> Piblinellau -> rhedeg. Bydd ffenestr peiriant rhithwir yn agor, a dylai fod y canlynol ar ei diwedd:
Gwelodd Llwyddodd Job - llwyddiant, popeth yn iawn. Nawr gallwch chi brofi'r hyn rydych chi wedi'i wneud.
Enghreifftiau o waith
Am enghraifft o waith, gadewch i ni greu prosiect syml (yn meistr) a fydd yn cynnwys sawl ffeil. Ar Γ΄l hynny, mewn cangen arall byddwn yn newid un ffeil yn unig ac yn ceisio gwneud cais uno.
Gadewch i ni ystyried dau achos: pan fydd y ffeil wedi'i haddasu yn cynnwys gwall a phan nad yw. Yn gyntaf, enghraifft gyda gwall.
Gadewch i ni ddweud bod ffeil yn y brif gangen Rhaglen.cs, nad yw'n cynnwys gwallau, ond mewn cangen arall ychwanegodd y datblygwr god gwallus ac mae am wneud cais uno. Pa fath o gamgymeriad a wnaeth nad yw mor bwysig, y prif beth yw ei fod yn bodoli. Er enghraifft, anghofiodd y gweithredwr taflu (Ie,
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}
Gadewch i ni edrych ar ganlyniad dadansoddi enghraifft gyda gwall. Hefyd i wneud yn siΕ΅r mai dim ond un ffeil oedd wedi'i dosrannu, ychwanegais y faner -r i linell lansio pvs-studio-dotnet:
Gwelwn fod y dadansoddwr wedi canfod gwall ac nad oedd yn caniatΓ‘u uno canghennau.
Gadewch i ni wirio'r enghraifft heb wall. Cywiro'r cod:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}
Canlyniadau dadansoddiad cais uno:
Fel y gallwn weld, ni chanfuwyd unrhyw wallau, ac roedd cyflawni'r dasg yn llwyddiannus, sef yr hyn yr oeddem am ei wirio.
Casgliad
Mae chwynnu cod drwg cyn uno canghennau yn gyfleus a dymunol iawn. Felly os ydych chi'n defnyddio CI/CD, ceisiwch fewnosod dadansoddwr statig i wirio. Ar ben hynny, gwneir hyn yn eithaf syml.
Diolch i chi am eich sylw.
Os ydych chi am rannu'r erthygl hon Γ’ chynulleidfa Saesneg ei hiaith, defnyddiwch y ddolen gyfieithu: Nikolay Mironov.
Ffynhonnell: hab.com