Kev tshuaj xyuas kev sib koom ua ke thov hauv GitLab siv PVS-Studio rau C#

Kev tshuaj xyuas kev sib koom ua ke thov hauv GitLab siv PVS-Studio rau C#
Hlub GitLab thiab ntxub kab? Xav txhim kho qhov zoo ntawm koj qhov chaws? Ces koj twb tuaj rau qhov chaw lawm. Niaj hnub no peb yuav qhia koj yuav ua li cas teeb tsa PVS-Studio C# analyzer txhawm rau txheeb xyuas qhov kev thov sib koom ua ke. Muaj lub siab xav unicorn thiab zoo siab nyeem ntawv rau txhua tus.

PVS Studio yog ib qho cuab yeej los txheeb xyuas qhov ua yuam kev thiab muaj peev xwm ua rau muaj qhov tsis zoo hauv cov cai ntawm cov kev pab cuam sau hauv C, C ++, C # thiab Java. Ua haujlwm ntawm 64-ntsis tshuab ntawm Windows, Linux thiab macOS. Muaj peev xwm txheeb xyuas cov cai tsim rau 32-ntsis, 64-ntsis thiab embedded ARM platforms.

Los ntawm txoj kev, peb tso tawm PVS-Studio 7.08, uas peb tau ua ntau yam nthuav. Piv txwv li:

  • C# analyzer rau Linux thiab macOS;
  • plugin rau Rider;
  • cov ntaub ntawv tshiab kuaj xyuas hom.

Daim ntawv teev npe kuaj hom

Yav dhau los, txhawm rau txheeb xyuas qee cov ntaub ntawv, nws yuav tsum dhau ib qho .xml nrog cov npe ntawm cov ntaub ntawv rau lub ntsuas ntsuas. Tab sis txij li qhov no tsis yooj yim heev, peb tau ntxiv lub peev xwm hloov .txt, uas ua rau lub neej yooj yim heev.

Txhawm rau txheeb xyuas cov ntaub ntawv tshwj xeeb, koj yuav tsum qhia tus chij --sourceFiles (-f) thiab hloov .txt nrog cov npe ntawm cov ntaub ntawv. Nws zoo li no:

pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json

Yog tias koj xav teeb tsa kev kuaj xyuas lossis rub cov lus thov, koj tuaj yeem ua qhov ntawd siv hom no. Qhov sib txawv yuav yog nyob rau hauv tau txais ib daim ntawv teev cov ntaub ntawv los soj ntsuam thiab yuav nyob ntawm seb lub tshuab koj siv.

Lub hauv paus ntsiab lus ntawm kev txheeb xyuas qhov kev thov sib koom ua ke

Lub ntsiab tseem ceeb ntawm daim tshev yog los xyuas kom meej tias cov teeb meem tshawb pom los ntawm lub ntsuas ntsuas thaum sib koom ua ke tsis poob rau hauv tswv ceg. Peb kuj tsis xav txheeb xyuas tag nrho qhov project txhua lub sijhawm. Ntxiv mus, thaum sib koom ua ke ceg, peb muaj cov npe ntawm cov ntaub ntawv hloov pauv. Yog li ntawd, kuv xav kom ntxiv ib daim ntawv thov kev sib koom ua ke.

Nov yog qhov kev thov sib koom ua ke zoo li ua ntej siv tus ntsuas static:

Kev tshuaj xyuas kev sib koom ua ke thov hauv GitLab siv PVS-Studio rau C#
Ntawd yog, txhua qhov yuam kev uas tau nyob hauv ceg kev hloov, yuav txav mus rau tus tswv ceg. Txij li thaum peb tsis xav tau qhov no, peb ntxiv kev tsom xam, thiab tam sim no daim duab zoo li no:

Kev tshuaj xyuas kev sib koom ua ke thov hauv GitLab siv PVS-Studio rau C#
Peb tsom xam kev hloov 2 thiab, yog tias tsis muaj qhov yuam kev, peb lees txais qhov kev thov sib koom ua ke, txwv tsis pub peb tsis lees txais nws.

Los ntawm txoj kev, yog tias koj txaus siab rau kev txheeb xyuas kev cog lus thiab rub cov lus thov rau C / C ++, ces koj tuaj yeem nyeem txog nws no.

GitLab

GitLab yog qhov qhib qhov web-based DevOps lifecycle cuab tam uas muab cov cai tswj kev tswj hwm rau Git nrog nws tus kheej wiki, qhov teeb meem taug qab, CI / CD pipeline thiab lwm yam nta.

Ua ntej koj pib txheeb xyuas cov kev thov sib koom ua ke, koj yuav tsum sau npe thiab xa koj qhov project. Yog tias koj tsis paub yuav ua li cas, ces kuv qhia tsab xov xwm kuv cov npoj yaig.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Txoj kev teeb tsa ib puag ncig tau piav qhia hauv qab no yog ib qho ua tau. Lub hom phiaj yog los qhia cov kauj ruam rau kev teeb tsa ib puag ncig tsim nyog rau kev tsom xam thiab tso tawm lub ntsuas ntsuas. Tej zaum nyob rau hauv koj rooj plaub nws yuav zoo dua los cais cov theem ntawm kev npaj ib puag ncig (ntxiv repositories, txhim kho lub analyzer) thiab tsom xam: piv txwv li, npaj Docker dluab nrog rau qhov tsim nyog ib puag ncig thiab siv lawv, los yog ib co lwm txoj kev.

Yuav kom nkag siab zoo dua qhov yuav tshwm sim tam sim no, kuv xav kom saib ntawm daim duab hauv qab no:

Kev tshuaj xyuas kev sib koom ua ke thov hauv GitLab siv PVS-Studio rau C#
Lub analyzer xav tau .NET Core SDK 3 ua haujlwm, yog li ua ntej txhim kho lub ntsuas ntsuas koj yuav tsum tau ntxiv cov Microsoft repositories los ntawm qhov kev cia siab xav tau rau lub ntsuas ntsuas yuav raug teeb tsa. Ntxiv Microsoft repositories rau ntau yam Linux faib tau piav nyob rau hauv cov ntaub ntawv sib raug.

Txhawm rau nruab PVS-Studio los ntawm tus thawj tswj pob, koj yuav tsum tau ntxiv PVS-Studio repositories. Ntxiv repositories rau txawv distributions yog piav nyob rau hauv kom meej ntxiv nyob rau hauv seem ntawm cov ntaub ntawv.

Lub ntsuas ntsuas yuav tsum muaj daim ntawv tso cai yuam sij rau kev ua haujlwm. Koj tuaj yeem tau txais daim ntawv tso cai sim ntawm analyzer download nplooj.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Thov nco ntsoov tias hom kev ua haujlwm tau piav qhia (kev tshuaj xyuas ntawm kev thov sib koom ua ke) yuav tsum muaj daim ntawv tso cai Enterprise. Yog li ntawd, yog tias koj xav sim hom kev ua haujlwm no, tsis txhob hnov ​​​​qab qhia hauv "Xov Xwm" teb uas koj xav tau daim ntawv tso cai Enterprise.

Yog tias qhov kev thov sib koom ua ke tshwm sim, ces peb tsuas yog yuav tsum txheeb xyuas cov npe ntawm cov ntaub ntawv hloov pauv, txwv tsis pub peb txheeb xyuas tag nrho cov ntaub ntawv. Tom qab kev tsom xam, peb yuav tsum hloov cov cav mus rau hauv hom peb xav tau.

Tam sim no, muaj cov algorithm ntawm kev ua haujlwm ua ntej koj ob lub qhov muag, koj tuaj yeem txav mus rau kev sau ntawv. Ua li no, koj yuav tsum tau hloov cov ntaub ntawv .gitlab-ci.yml los yog, yog tias nws tsis muaj, tsim nws. Txhawm rau tsim nws, koj yuav tsum nyem rau ntawm lub npe ntawm koj qhov project -> Teeb tsa CI/CD.

Kev tshuaj xyuas kev sib koom ua ke thov hauv GitLab siv PVS-Studio rau C#
Tam sim no peb npaj txhij los sau tsab ntawv. Cia peb xub sau cov cai uas yuav nruab qhov ntsuas ntsuas thiab nkag mus rau daim ntawv tso cai:

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

Txij li kev teeb tsa thiab kev ua haujlwm yuav tsum tshwm sim ua ntej tag nrho lwm cov ntawv sau, peb siv cov ntawv tshwj xeeb ua ntej_script. Cia kuv piav me ntsis txog qhov no.

Npaj rau nruab lub analyzer:

  - 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

Ntxiv PVS-Studio repositories thiab analyzer:

  - 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

Daim ntawv tso cai qhib:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - Tus neeg siv lub npe.

$PVS_KEY - cov khoom tseem ceeb.

Rov qab qhov project dependencies qhov twg $CI_PROJECT_DIR - tag nrho txoj kev mus rau qhov project directory:

  - dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln

Rau kev tsom xam kom raug, qhov project yuav tsum tau ua tiav, thiab nws cov kev cia siab yuav tsum tau rov qab los (piv txwv li, cov pob khoom tsim nyog NuGet yuav tsum rub tawm).

Koj tuaj yeem teeb tsa ib puag ncig hloov pauv uas muaj cov ntaub ntawv tso cai los ntawm txhaj chaw, thiab tom qab ntawd CI/CD.

Kev tshuaj xyuas kev sib koom ua ke thov hauv GitLab siv PVS-Studio rau C#
Hauv qhov rai uas qhib, nrhiav cov khoom ntau yam, nyem rau ntawm lub pob ntawm sab xis Nthuav ntxiv thiab ntxiv cov hloov pauv. Cov txiaj ntsig yuav tsum zoo li no:

Kev tshuaj xyuas kev sib koom ua ke thov hauv GitLab siv PVS-Studio rau C#
Tam sim no koj tuaj yeem txav mus rau kev txheeb xyuas. Ua ntej, cia peb ntxiv ib tsab ntawv rau kev txheeb xyuas tiav. Rau tus chij -t peb dhau txoj kev mus rau kev daws rau tus chij -o sau txoj hauv kev mus rau cov ntaub ntawv uas cov txiaj ntsig kev tshuaj ntsuam yuav raug sau. Peb kuj txaus siab rau qhov rov qab code. Hauv qhov no, peb txaus siab rau kev ua haujlwm nres thaum tus lej xa rov qab muaj cov ntaub ntawv ceeb toom tau tshaj tawm thaum lub sijhawm tshuaj xyuas. Qhov no yog qhov seem no zoo li:

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

Cov lej xa rov qab ua haujlwm ntawm lub hauv paus ntsiab lus ntawm lub ntsej muag me ntsis. Piv txwv li, yog tias cov lus ceeb toom tau tshaj tawm los ntawm kev txheeb xyuas, tom qab ntawd tus lej xa rov qab yuav sib npaug li 8. Yog tias daim ntawv tso cai tas sij hawm hauv ib hlis, ces tus lej rov qab yuav sib npaug li 4. Yog tias qhov yuam kev raug kuaj pom thaum lub sijhawm tshuaj xyuas, thiab daim ntawv tso cai tas sij hawm nyob rau hauv ib lub hlis, cov code rov qab, ob qho tag nrho cov nqi yuav raug sau: ntxiv cov lej ua ke thiab tau txais qhov kawg rov qab code - 8 + 4 = 12. Yog li, los ntawm kev txheeb xyuas cov khoom sib txuas, cov ntaub ntawv hais txog ntau lub xeev tuaj yeem tau txais thaum kev tshuaj xyuas. Cov lej xa rov qab tau piav qhia ntau ntxiv hauv "pvs-studio-dotnet (Linux / macOS) Rov qab Codes" ntu ntawm daim ntawv "Tshawb xyuas Visual Studio / MSBuild / .NET Core tej yaam num los ntawm kab hais kom ua siv PVS-Studio".

Hauv qhov no, peb txaus siab rau txhua tus lej xa rov qab qhov twg 8 tshwm.

  - exit_code=$((($exit_code & 8)/8))

Peb yuav tau txais 1 thaum tus lej xa rov qab muaj me ntsis ntawm tus lej peb xav tau, txwv tsis pub peb yuav tau txais 0.

Nws yog lub sijhawm los ntxiv kev sib koom ua ke thov kev txheeb xyuas. Ua ntej peb ua qhov no, cia peb npaj ib qho chaw rau tsab ntawv. Peb xav tau nws kom ua tiav tsuas yog thaum muaj kev thov sib koom ua ke. Nws zoo li no:

merge:
  script:
  only:
  - merge_requests

Cia peb mus rau tsab ntawv nws tus kheej. Kuv tau ntsib nrog qhov tseeb tias lub tshuab virtual tsis paub dab tsi txog keeb kwm/master. Yog li cia peb pab nws me ntsis:

  - git fetch origin

Tam sim no peb tau txais qhov sib txawv ntawm cov ceg ntoo thiab txuag qhov tshwm sim hauv txt ntaub ntawv:

  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt

Qhov twg $CI_COMMIT_SHA - hash ntawm kev cog lus kawg.

Tom ntej no, peb pib txheeb xyuas cov npe ntawm cov ntaub ntawv siv tus chij -f. Peb hloov cov ntaub ntawv .txt yav dhau los rau nws. Zoo, los ntawm kev sib piv nrog cov kev ntsuam xyuas tag nrho, peb saib cov lej rov qab:

  - 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

Daim ntawv ua tiav rau kev txheeb xyuas qhov kev thov sib koom ua ke yuav zoo li no:

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

Txhua yam uas tseem tshuav yog ntxiv cov kev hloov pauv hloov tom qab tag nrho cov ntawv tau ua tiav. Peb siv daim ntawv lo tom qab_script thiab siv tau Plog converter:

after_script:
  - plog-converter -t html -o eLog ./PVS-Studio.json

Π’ΠΈΠ»ΠΈΡ‚Π° Plog converter yog qhov qhib qhov project uas yog siv los hloov cov ntaub ntawv yuam kev parser rau hauv ntau hom ntawv, xws li HTML. Cov lus piav qhia ntxaws ntxiv ntawm cov khoom siv hluav taws xob tau muab rau hauv ntu "Plog Converter Utility" seem ntawm cov ntaub ntawv.

Los ntawm txoj kev, yog tias koj xav kom yooj yim ua hauj lwm nrog .json qhia hauv zos los ntawm IDE, ces kuv xav kom peb plugin rau IDE Rider. Nws siv tau piav qhia ntau ntxiv hauv cov ntaub ntawv ntsig txog.

Kom yooj yim, ntawm no yog .gitlab-ci.yml nyob rau hauv tag nrho:

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

Thaum koj tau ntxiv txhua yam rau cov ntaub ntawv, nyem rau ntawm Muab kev hloov pauv. Yuav kom pom tias txhua yam yog lawm, mus rau CI / CD -> Cov raj xa dej -> khiav. Lub qhov rais tshuab virtual yuav qhib, thaum kawg ntawm qhov yuav tsum muaj cov hauv qab no:

Kev tshuaj xyuas kev sib koom ua ke thov hauv GitLab siv PVS-Studio rau C#
pom Txoj hauj lwm ua tiav - kev vam meej, txhua yam zoo. Tam sim no koj tuaj yeem sim qhov koj tau ua.

Cov piv txwv ua haujlwm

Rau qhov piv txwv ntawm kev ua haujlwm, cia peb tsim ib qhov project yooj yim (hauv tswv) uas yuav muaj ntau cov ntaub ntawv. Tom qab ntawd, nyob rau hauv lwm ceg peb yuav hloov tsuas yog ib cov ntaub ntawv thiab sim ua ib tug merge thov.

Cia peb xav txog ob qhov xwm txheej: thaum cov ntaub ntawv hloov kho muaj qhov yuam kev thiab thaum nws tsis ua. Ua ntej, piv txwv nrog qhov yuam kev.

Cia peb hais tias muaj cov ntaub ntawv nyob rau hauv tus tswv ceg Program.cs, uas tsis muaj qhov yuam kev, tab sis nyob rau hauv lwm ceg tus tsim tawm ntxiv yuam kev code thiab xav ua ib qho kev thov sib koom ua ke. Qhov kev ua yuam kev twg nws tsis yog qhov tseem ceeb, qhov tseem ceeb yog nws muaj. Piv txwv li, tus neeg teb xov tooj tsis nco qab muab pov (Yog, tsis ncaj ncees lawm):

void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // do something
  ....
}

Cia peb saib qhov tshwm sim ntawm kev txheeb xyuas ib qho piv txwv nrog qhov yuam kev. Tsis tas li kom paub tseeb tias tsuas yog ib cov ntaub ntawv tau txheeb xyuas, kuv ntxiv tus chij -r mus rau pvs-studio-dotnet tso kab:

Kev tshuaj xyuas kev sib koom ua ke thov hauv GitLab siv PVS-Studio rau C#
Peb pom tias tus ntsuas tau pom qhov yuam kev thiab tsis tso cai rau kev sib koom ua ke.

Cia peb kuaj qhov piv txwv yam tsis muaj qhov yuam kev. Kho qhov chaws:

void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // do something
  ....
}

Merge thov kev txheeb xyuas cov txiaj ntsig:

Kev tshuaj xyuas kev sib koom ua ke thov hauv GitLab siv PVS-Studio rau C#
Raws li peb tuaj yeem pom, tsis pom qhov yuam kev, thiab kev ua haujlwm tiav, uas yog qhov peb xav kuaj xyuas.

xaus

Weeding tawm phem code ua ntej merging ceg yog heev yooj yim thiab qab ntxiag. Yog li yog tias koj siv CI / CD, sim embedding tus ntsuas zoo li qub los kuaj xyuas. Ntxiv mus, qhov no yog ua tau yooj yim heev.

Ua tsaug koj rau koj mloog.

Kev tshuaj xyuas kev sib koom ua ke thov hauv GitLab siv PVS-Studio rau C#
Yog tias koj xav qhia cov lus no nrog cov neeg hais lus Askiv, thov siv qhov txuas txhais lus: Nikolay Mironov. Kev tshuaj xyuas kev sib koom ua ke thov hauv GitLab siv PVS-Studio rau C#.

Tau qhov twg los: www.hab.com

Ntxiv ib saib