Միաձուլման հարցումների վերլուծություն GitLab-ում PVS-Studio-ի միջոցով C#-ի համար

Միաձուլման հարցումների վերլուծություն GitLab-ում PVS-Studio-ի միջոցով C#-ի համար
Սիրու՞մ եք GitLab-ը և ատո՞ւմ եք սխալները: Ցանկանու՞մ եք բարելավել ձեր սկզբնական կոդի որակը: Ապա դուք ճիշտ տեղում եք եկել: Այսօր մենք ձեզ կպատմենք, թե ինչպես կարգավորել PVS-Studio C# անալիզատորը՝ ստուգելու միաձուլման հարցումները: Ունեցեք միաեղջյուր տրամադրություն և ուրախ ընթերցանություն բոլորին:

PVS- ստուդիա C, C++, C# և Java լեզուներով գրված ծրագրերի սկզբնական կոդի սխալներն ու հնարավոր խոցելիությունները հայտնաբերելու գործիք է։ Աշխատում է Windows-ի, Linux-ի և macOS-ի 64-բիթանոց համակարգերի վրա: Կարող է վերլուծել կոդը, որը նախատեսված է 32-բիթանոց, 64-բիթանոց և ներդրված ARM հարթակների համար:

Ի դեպ, մենք թողարկեցինք PVS-Studio 7.08-ը, որում շատ բան արեցինք հետաքրքիր. Օրինակ `

  • C# անալիզատոր Linux-ի և macOS-ի համար;
  • plugin Rider-ի համար;
  • նոր ֆայլերի ցուցակի ստուգման ռեժիմ:

Ֆայլերի ցուցակի ստուգման ռեժիմ

Նախկինում որոշակի ֆայլեր ստուգելու համար անհրաժեշտ էր անալիզատորին փոխանցել .xml ֆայլերի ցանկով։ Բայց քանի որ սա այնքան էլ հարմար չէ, մենք ավելացրել ենք .txt փոխանցելու հնարավորությունը, ինչը կյանքը շատ պարզ է դարձնում։

Հատուկ ֆայլեր ստուգելու համար դուք պետք է նշեք դրոշը --sourceFiles (-f) և փոխանցեք .txt ֆայլերի ցանկով: Այն կարծես այսպիսին է.

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

Եթե ​​դուք հետաքրքրված եք կարգավորելու պարտավորությունների ստուգում կամ pull հարցումներ, կարող եք դա անել նաև այս ռեժիմի միջոցով: Տարբերությունը կլինի վերլուծելու համար ֆայլերի ցանկ ստանալու մեջ և կախված կլինի նրանից, թե ինչ համակարգեր եք օգտագործում:

Միաձուլման հարցումը ստուգելու սկզբունքը

Ստուգման հիմնական էությունն այն է, որ միաձուլման ընթացքում անալիզատորի կողմից հայտնաբերված խնդիրները չընկնեն վարպետ մասնաճյուղ. Մենք նաև չենք ցանկանում ամեն անգամ վերլուծել ամբողջ նախագիծը: Ավելին, մասնաճյուղերի միաձուլման ժամանակ մենք ունենք փոփոխված ֆայլերի ցանկ։ Հետևաբար, ես առաջարկում եմ ավելացնել միաձուլման հայտի ստուգում:

Ստատիկ անալիզատորի ներդրումից առաջ միաձուլման հարցումն այսպիսի տեսք ունի.

Միաձուլման հարցումների վերլուծություն GitLab-ում PVS-Studio-ի միջոցով C#-ի համար
Այսինքն՝ բոլոր այն սխալները, որոնք եղել են մասնաճյուղում փոփոխություններ, կտեղափոխվի գլխավոր մասնաճյուղ։ Քանի որ մենք դա չէինք ցանկանա, մենք ավելացնում ենք վերլուծություն, և այժմ դիագրամն այսպիսի տեսք ունի.

Միաձուլման հարցումների վերլուծություն GitLab-ում PVS-Studio-ի միջոցով C#-ի համար
Վերլուծելով փոփոխություններ 2 և եթե սխալներ չկան, մենք ընդունում ենք միաձուլման հարցումը, այլապես մերժում ենք այն:

Ի դեպ, եթե ձեզ հետաքրքրում է պարտավորությունների վերլուծություն և C/C++-ի հարցումներ, ապա կարող եք կարդալ դրա մասին այստեղ.

Գիտլաբը

Գիտլաբը բաց կոդով վեբ վրա հիմնված DevOps-ի կյանքի ցիկլի գործիք է, որն ապահովում է Git-ի համար կոդերի պահեստի կառավարման համակարգ՝ իր սեփական վիքիով, խնդիրների հետևման համակարգով, CI/CD խողովակաշարով և այլ հնարավորություններով:

Նախքան միաձուլման հարցումների վերլուծությունը սկսելը, դուք պետք է գրանցվեք և վերբեռնեք ձեր նախագիծը: Եթե ​​չգիտեք, թե ինչպես դա անել, ապա առաջարկում եմ статью Իմ գործընկեր.

Նշում. Ստորև նկարագրված միջավայրի ստեղծման մեթոդը հնարավորներից մեկն է: Նպատակն է ցույց տալ վերլուծության համար անհրաժեշտ միջավայրի ստեղծման և անալիզատորը գործարկելու քայլերը: Թերևս ձեր դեպքում ավելի օպտիմալ կլիներ առանձնացնել միջավայրի պատրաստման (պահեստների ավելացում, անալիզատորի տեղադրում) և վերլուծության փուլերը. օրինակ՝ պատրաստել Docker պատկերներ անհրաժեշտ միջավայրով և օգտագործել դրանք կամ որևէ այլ մեթոդ:

Ավելի լավ հասկանալու համար, թե ինչ է լինելու հիմա, առաջարկում եմ դիտել հետևյալ գծապատկերը.

Միաձուլման հարցումների վերլուծություն GitLab-ում PVS-Studio-ի միջոցով C#-ի համար
Անալիզատորը պահանջում է .NET Core SDK 3 աշխատելու համար, ուստի անալիզատորը տեղադրելուց առաջ անհրաժեշտ է ավելացնել Microsoft-ի պահեստները, որտեղից կտեղադրվեն անալիզատորի համար պահանջվող կախվածությունները: Microsoft-ի պահեստների ավելացում Linux-ի տարբեր բաշխումների համար նկարագրված է համապատասխան փաստաթղթում.

PVS-Studio-ն փաթեթների կառավարչի միջոցով տեղադրելու համար անհրաժեշտ կլինի նաև ավելացնել PVS-Studio-ի պահեստները: Տարբեր բաշխումների համար պահեստների ավելացումը ավելի մանրամասն նկարագրված է փաստաթղթերի համապատասխան բաժինը.

Անալիզատորը գործելու համար պահանջում է լիցենզիայի բանալի: Դուք կարող եք ստանալ փորձնական լիցենզիա այստեղ անալիզատորի ներբեռնման էջ.

Նշում. Խնդրում ենք նկատի ունենալ, որ նկարագրված գործող ռեժիմը (միաձուլման հարցումների վերլուծություն) պահանջում է Enterprise լիցենզիա: Հետևաբար, եթե ցանկանում եք փորձել այս գործողության ռեժիմը, մի մոռացեք «Հաղորդագրություն» դաշտում նշել, որ Ձեզ անհրաժեշտ է Enterprise լիցենզիա:

Եթե ​​տեղի է ունենում միաձուլման հարցում, ապա մենք միայն պետք է վերլուծենք փոփոխված ֆայլերի ցանկը, հակառակ դեպքում մենք վերլուծում ենք բոլոր ֆայլերը: Վերլուծությունից հետո մենք պետք է տեղեկամատյանները փոխարկենք մեզ անհրաժեշտ ձևաչափի:

Այժմ, աչքիդ առաջ ունենալով աշխատանքի ալգորիթմը, կարող ես անցնել սցենար գրելուն։ Դա անելու համար դուք պետք է փոխեք ֆայլը .gitlab-ci.yml կամ, եթե այն գոյություն չունի, ստեղծեք այն: Այն ստեղծելու համար հարկավոր է սեղմել ձեր նախագծի անվանման վրա -> Կարգավորեք CI/CD.

Միաձուլման հարցումների վերլուծություն GitLab-ում PVS-Studio-ի միջոցով C#-ի համար
Այժմ մենք պատրաստ ենք գրել սցենարը։ Եկեք նախ գրենք այն կոդը, որը կտեղադրի անալիզատորը և մուտքագրենք լիցենզիան.

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

Քանի որ տեղադրումը և ակտիվացումը պետք է տեղի ունենան բոլոր մյուս սկրիպտներից առաջ, մենք օգտագործում ենք հատուկ պիտակ նախքան_սկրիպտը. Մի փոքր բացատրեմ այս հատվածը։

Անալիզատորի տեղադրման նախապատրաստում.

  - 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 պահեստների և անալիզատորի ավելացում.

  - 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

$PVS_NAME - Օգտագործողի անունը.

$PVS_KEY - ապրանքի բանալին:

Ծրագրի կախվածության վերականգնում, որտեղ $CI_PROJECT_DIR - նախագծի գրացուցակի ամբողջական ուղին.

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

Ճիշտ վերլուծության համար նախագիծը պետք է հաջողությամբ կառուցվի, և դրա կախվածությունները պետք է վերականգնվեն (օրինակ՝ անհրաժեշտ NuGet փաթեթները պետք է ներբեռնվեն)։

Դուք կարող եք սահմանել շրջակա միջավայրի փոփոխականներ, որոնք պարունակում են լիցենզիայի տեղեկատվություն՝ սեղմելով Կարգավորում, և դրանից հետո CI/CD.

Միաձուլման հարցումների վերլուծություն GitLab-ում PVS-Studio-ի միջոցով C#-ի համար
Բացվող պատուհանում գտեք տարրը Փոփոխականների, սեղմեք աջ կողմում գտնվող կոճակի վրա Ընդարձակել և ավելացրեք փոփոխականներ: Արդյունքը պետք է այսպիսին լինի.

Միաձուլման հարցումների վերլուծություն GitLab-ում PVS-Studio-ի միջոցով C#-ի համար
Այժմ կարող եք անցնել վերլուծության: Նախ, եկեք ավելացնենք սցենար ամբողջական վերլուծության համար: Դրոշին -t մենք անցնում ենք դրոշի լուծման ճանապարհը -o գրեք այն ֆայլի ուղին, որտեղ կգրվեն վերլուծության արդյունքները: Մեզ հետաքրքրում է նաև վերադարձի կոդը։ Այս դեպքում մենք շահագրգռված ենք, որ գործողությունը դադարեցվի, երբ վերադարձի ծածկագիրը պարունակում է տեղեկատվություն, որ նախազգուշացումներ են տրվել վերլուծության ընթացքում: Ահա թե ինչ տեսք ունի այս հատվածը.

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

Վերադարձի կոդերն աշխատում են մի քիչ դիմակի սկզբունքով։ Օրինակ, եթե վերլուծության արդյունքում տրվել են նախազգուշացումներ, ապա վերադարձի կոդը հավասար կլինի 8-ի: Եթե լիցենզիայի ժամկետը լրանում է մեկ ամսվա ընթացքում, ապա վերադարձի ծածկագիրը հավասար է 4-ի: Եթե վերլուծության ընթացքում սխալներ են հայտնաբերվել, իսկ լիցենզիայի ժամկետը լրանում է մեկ ամսվա ընթացքում, ծածկագիրը վերադարձվում է, երկու արժեքներն էլ կգրվեն՝ գումարեք թվերը և ստացեք վերադարձի վերջնական կոդը՝ 8+4=12։ Այսպիսով, համապատասխան բիթերը ստուգելով՝ վերլուծության ժամանակ կարելի է տեղեկատվություն ստանալ տարբեր վիճակների մասին։ Վերադարձի կոդերը ավելի մանրամասն նկարագրված են փաստաթղթի «pvs-studio-dotnet (Linux / macOS) վերադարձի կոդեր» բաժնում:Visual Studio / MSBuild / .NET Core նախագծերի ստուգում հրամանի տողից PVS-Studio-ի միջոցով".

Այս դեպքում մեզ հետաքրքրում է վերադարձի բոլոր կոդերը, որտեղ հայտնվում է 8-ը:

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

Մենք կստանանք 1, երբ վերադարձի կոդը պարունակի մեզ հետաքրքրող թվի բիթը, հակառակ դեպքում մենք կստանանք 0:

Ժամանակն է ավելացնել միաձուլման հարցումների վերլուծությունը: Նախքան դա անելը, եկեք տեղ պատրաստենք սցենարի համար: Մեզ անհրաժեշտ է, որ այն կատարվի միայն միաձուլման հարցում առաջանալու դեպքում: Այն կարծես այսպիսին է.

merge:
  script:
  only:
  - merge_requests

Անցնենք բուն սցենարին։ Ես կանգնած էի այն փաստի հետ, որ վիրտուալ մեքենան ոչինչ չգիտի ծագում/վարպետ. Այսպիսով, եկեք մի փոքր օգնենք նրան.

  - git fetch origin

Այժմ մենք ստանում ենք ճյուղերի տարբերությունը և պահպանում ենք արդյունքը txt ֆայլ:

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

Որտեղ $CI_COMMIT_SHA – վերջին commit-ի հեշը:

Հաջորդը, մենք սկսում ենք վերլուծել ֆայլերի ցանկը, օգտագործելով դրոշը -f. Դրան ենք փոխանցում նախկինում ստացված .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

Միաձուլման հարցումը ստուգելու ամբողջական սցենարը կունենա հետևյալ տեսքը.

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

Մնում է միայն ավելացնել տեղեկամատյանների փոխարկումը բոլոր սցենարների մշակումից հետո: Մենք օգտագործում ենք պիտակը after_script և օգտակար լոգ-փոխարկիչ:

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

Օգտակար լոգ-փոխարկիչ բաց կոդով նախագիծ է, որն օգտագործվում է վերլուծիչի սխալի հաշվետվությունները տարբեր ձևերի փոխակերպելու համար, օրինակ՝ HTML: Կոմունալ ծրագրի ավելի մանրամասն նկարագրությունը տրված է «Plog Converter Utility» ենթաբաժնում: փաստաթղթերի համապատասխան բաժինը.

Ի դեպ, եթե ցանկանում եք IDE-ից տեղային .json հաշվետվությունների հետ հարմար աշխատել, ապա առաջարկում եմ մեր. plug-in- ը IDE Rider-ի համար: Դրա օգտագործումը ավելի մանրամասն նկարագրված է համապատասխան փաստաթուղթ.

Հարմարության համար ահա .gitlab-ci.yml լրիվ:

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

Ամեն ինչ ֆայլում ավելացնելուց հետո սեղմեք Փոփոխություններ կատարել. Որպեսզի տեսնեք, որ ամեն ինչ ճիշտ է, գնացեք CI / CD -> Խողովակաշարեր -> Վազում. Կբացվի վիրտուալ մեքենայի պատուհան, որի վերջում պետք է լինի հետևյալը.

Միաձուլման հարցումների վերլուծություն GitLab-ում PVS-Studio-ի միջոցով C#-ի համար
տեսավ Հոբը հաջողվեց - Հաջողություն, ամեն ինչ լավ է: Այժմ դուք կարող եք ստուգել այն, ինչ արել եք:

Աշխատանքային օրինակներ

Աշխատանքի օրինակի համար եկեք ստեղծենք մի պարզ նախագիծ (in վարպետ) որը կպարունակի մի քանի ֆայլ: Դրանից հետո մեկ այլ մասնաճյուղում մենք կփոխենք միայն մեկ ֆայլ և կփորձենք միաձուլման հարցում կատարել։

Դիտարկենք երկու դեպք՝ երբ փոփոխված ֆայլը պարունակում է սխալ, և երբ՝ ոչ։ Նախ, օրինակ՝ սխալմամբ։

Եկեք ասենք, որ կա ֆայլ գլխավոր մասնաճյուղում Program.cs, որը սխալներ չի պարունակում, սակայն մեկ այլ ճյուղում մշակողը սխալ կոդ է ավելացրել և ցանկանում է միաձուլման հարցում կատարել։ Թե ինչ սխալ է նա արել, այնքան էլ կարեւոր չէ, գլխավորը, որ դա կա։ Օրինակ, օպերատորը մոռացել է նետում (Այո, այնքան սխալ):

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

Եկեք նայենք սխալով օրինակի վերլուծության արդյունքին։ Նաև համոզվելու համար, որ միայն մեկ ֆայլ է վերլուծված, ես ավելացրի դրոշը -r դեպի pvs-studio-dotnet գործարկման գիծ.

Միաձուլման հարցումների վերլուծություն GitLab-ում PVS-Studio-ի միջոցով C#-ի համար
Մենք տեսնում ենք, որ անալիզատորը սխալ է գտել և թույլ չի տվել միացնել ճյուղերը։

Եկեք ստուգենք օրինակը առանց սխալի: Կոդի ուղղում.

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

Միաձուլման հարցումների վերլուծության արդյունքները.

Միաձուլման հարցումների վերլուծություն GitLab-ում PVS-Studio-ի միջոցով C#-ի համար
Ինչպես տեսնում ենք, սխալներ չեն հայտնաբերվել, և առաջադրանքի կատարումը հաջող էր, ինչը մենք ուզում էինք ստուգել:

Ամփոփում

Ճյուղերի միաձուլումից առաջ վատ կոդի մաքրումը շատ հարմար և հաճելի է: Այսպիսով, եթե դուք օգտագործում եք CI/CD, փորձեք տեղադրել ստատիկ անալիզատոր՝ ստուգելու համար: Ավելին, դա արվում է բավականին պարզ.

Շնորհակալություն ուշադրության համար:

Միաձուլման հարցումների վերլուծություն GitLab-ում PVS-Studio-ի միջոցով C#-ի համար
Եթե ​​ցանկանում եք կիսվել այս հոդվածով անգլիախոս լսարանի հետ, խնդրում ենք օգտագործել թարգմանության հղումը՝ Նիկոլայ Միրոնով: Միաձուլման հարցումների վերլուծություն GitLab-ում PVS-Studio-ի միջոցով C#-ի համար.

Source: www.habr.com

Добавить комментарий