Nyochaa arịrịọ njikọta na GitLab site na iji PVS-Studio maka C #

Nyochaa arịrịọ njikọta na GitLab site na iji PVS-Studio maka C #
Hụrụ GitLab n'anya ma kpọọ ahụhụ asị? Chọrọ ịkwalite ogo koodu isi mmalite gị? Mgbe ahụ ị bịarutere ebe kwesịrị ekwesị. Taa, anyị ga-agwa gị otu esi ahazi PVS-Studio C # analyzer iji lelee arịrịọ njikọ. Nwee ọnọdụ unicorn na ọgụgụ dị ụtọ nye onye ọ bụla.

PVS-.lọ nka bụ ngwá ọrụ e ji achọpụta njehie na adịghị ike dị na koodu isi mmalite nke mmemme e dere na C, C++, C # na Java. Na-arụ ọrụ na sistemụ 64-bit na Windows, Linux na macOS. Nwere ike nyochaa koodu emere maka nyiwe ARM 32-bit, 64-bit na agbakwunyere.

Site n'ụzọ, anyị wepụtara PVS-Studio 7.08, nke anyị mere ọtụtụ ihe na-adọrọ mmasị. Dịka ọmụmaatụ:

  • C # nyocha maka Linux na macOS;
  • ngwa mgbakwunye maka Rider;
  • ọnọdụ nlele ndepụta faịlụ ọhụrụ.

Ụdị ndetu faịlụ

Na mbụ, iji lelee ụfọdụ faịlụ, ọ dị mkpa ịnyefe .xml nwere ndepụta faịlụ na onye nyocha. Ma ebe ọ bụ na nke a adịghị adaba nke ukwuu, anyị agbakwunyela ikike ịnyefe .txt, nke na-eme ka ndụ dị mfe.

Iji lelee faịlụ ndị akọwapụtara, ị ga-ezipụta ọkọlọtọ --sourceFiles (-f) ma nyefee .txt na ndepụta faịlụ. Ọ dị ka nke a:

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

Ọ bụrụ na ị nwere mmasị ịtọlite ​​​​nyocha ma ọ bụ dọpụta arịrịọ, ị nwekwara ike ime nke ahụ site na iji ọnọdụ a. Ihe dị iche ga-abụ na ịnweta ndepụta faịlụ iji nyochaa ma dabere na ụdị sistemụ ị na-eji.

Ụkpụrụ nke ịlele arịrịọ njikọ

Ihe kachasị mkpa nke nlele ahụ bụ iji hụ na nsogbu ndị nyocha chọpụtara n'oge njikọta adịghị adaba na nwe- alaka. Anyị achọghịkwa inyocha ọrụ ahụ dum oge ọ bụla. Ọzọkwa, mgbe ị na-ejikọta alaka, anyị nwere ndepụta nke faịlụ gbanwere. Ya mere, m na-atụ aro ka ịtinye nlele arịrịọ njikọ.

Nke a bụ ihe arịrịọ njikọta dị ka tupu emejuputa ihe nyocha static:

Nyochaa arịrịọ njikọta na GitLab site na iji PVS-Studio maka C #
Ya bụ, njehie niile dị na alaka ụlọ ọrụ ahụ mgbanwe, ga-akwaga na ngalaba nna ukwu. Ebe ọ bụ na anyị agaghị achọ nke a, anyị na-agbakwunye nyocha, ma ugbu a eserese ahụ dị ka nke a:

Nyochaa arịrịọ njikọta na GitLab site na iji PVS-Studio maka C #
Anyị na-enyocha mgbanwe2 na, ọ bụrụ na enweghị njehie, anyị na-anabata arịrịọ njikọ, ma ọ bụghị ya, anyị jụrụ ya.

Site n'ụzọ, ọ bụrụ na ị nwere mmasị na-nyocha eme ma dọta arịrịọ maka C / C ++, mgbe ahụ ị nwere ike ịgụ banyere ya. ebe a.

GitLab

GitLab bụ ngwa ọrụ ndụ ndụ DevOps webụ mepere emepe nke na-enye sistemụ nchekwa nchekwa koodu maka Git na wiki nke ya, usoro nsochi mbipụta, pipeline CI/CD na atụmatụ ndị ọzọ.

Tupu ịmalite nyochaa arịrịọ njikọ, ịkwesịrị ịdebanye aha na bulite ọrụ gị. Ọ bụrụ na ị maghị ka esi eme nke a, m na-atụ aro ederede onye otu m.

Примечание. Usoro nhazi nke gburugburu ebe a kọwara n'okpuru ebe a bụ otu n'ime ihe ndị nwere ike ime. Ebumnuche bụ igosi usoro maka ịtọlite ​​​​gburugburu ebe dị mkpa maka nyocha na ịmalite nyocha. Ikekwe n'ọnọdụ gị ọ ga-akacha mma ikewapụ ọkwa nke nkwadebe gburugburu ebe obibi (ịgbakwunye ebe nchekwa, ịwụnye ihe nyocha) na nyocha: dịka ọmụmaatụ, ịkwadebe ihe oyiyi Docker na gburugburu ebe dị mkpa na iji ha, ma ọ bụ usoro ọzọ.

Iji ghọta nke ọma ihe ga-eme ugbu a, a na m atụ aro ka ilele eserese ndị a:

Nyochaa arịrịọ njikọta na GitLab site na iji PVS-Studio maka C #
Onye nyocha ahụ chọrọ .NET Core SDK 3 ka ọ rụọ ọrụ, yabụ tupu ịwụnye ihe nyocha, ịkwesịrị ịgbakwunye ebe nchekwa Microsoft nke a ga-etinye ihe ndabere achọrọ maka onye nyocha. Na-agbakwụnye ebe nchekwa Microsoft maka nkesa Linux dị iche iche kọwara na akwụkwọ kwekọrọ.

Iji wụnye PVS-Studio site na njikwa ngwugwu, ị ga-achọkwa ịgbakwunye ebe nchekwa PVS-Studio. A kọwapụtara ịgbakwunye ebe nchekwa maka nkesa dị iche iche n'ụzọ zuru ezu n'ime akụkụ dị mkpa nke akwụkwọ ahụ.

Onye nyocha chọrọ igodo ikike iji rụọ ọrụ. Ị nwere ike nweta akwụkwọ ikike ikpe na analyzer nbudata ibe.

Примечание. Biko mara na ụdị ọrụ akọwara (nyocha nke arịrịọ njikọta) chọrọ ikikere Enterprise. Ya mere, ọ bụrụ na ịchọrọ ịnwale ụdị ọrụ a, echefula igosi na mpaghara "Ozi" na ịchọrọ ikikere Enterprise.

Ọ bụrụ na arịrịọ njikọta emee, yabụ naanị anyị kwesịrị inyocha ndepụta nke faịlụ gbanwere, ma ọ bụghị ya, anyị na-enyocha faịlụ niile. Mgbe nyochachara, anyị kwesịrị ịgbanwe ndekọ ahụ n'ụdị anyị chọrọ.

Ugbu a, inwe algọridim nke ọrụ n'ihu anya gị, ị nwere ike ịga n'ihu na-ede edemede. Iji mee nke a, ịkwesịrị ịgbanwe faịlụ ahụ .gitlab-ci.yml ma ọ bụ, ọ bụrụ na ọ dịghị, mepụta ya. Iji mepụta ya, ịkwesịrị pịa aha ọrụ gị -> Hazie CI/CD.

Nyochaa arịrịọ njikọta na GitLab site na iji PVS-Studio maka C #
Ugbu a, anyị dị njikere ide edemede. Ka anyị buru ụzọ dee koodu ga-etinye ihe nyocha wee tinye ikike:

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

Ebe ọ bụ na echichi na ịgbalite ga-emerịrị tupu edemede ndị ọzọ niile, anyị na-eji akara pụrụ iche tupu_script. Ka m kọwaa nke a ntakịrị.

Na-akwado ịwụnye ihe nyocha:

  - 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

Na-agbakwụnye ebe nchekwa PVS-Studio na onye nyocha:

  - 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

Nkwalite ikike:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - Aha njirimara.

$PVS_KEY - igodo ngwaahịa.

Na-agbake ndabere oru ngo ebe $CI_PROJECT_DIR - ụzọ zuru oke na ndekọ ọrụ:

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

Maka nyocha ziri ezi, a ga-arụrịrị ọrụ ahụ nke ọma, a ga-eweghachikwa ndabere ya (dịka ọmụmaatụ, ngwugwu NuGet dị mkpa ga-ebudata).

Ị nwere ike ịtọ mgbanwe gburugburu ebe nwere ozi ikike site na ịpị Setting, na mgbe - na CI/CD.

Nyochaa arịrịọ njikọta na GitLab site na iji PVS-Studio maka C #
Na mpio mepere emepe, chọta ihe ahụ Mgbanwe, pịa bọtịnụ dị n'aka nri Gbasawanye ma tinye mgbanwe. Nsonaazụ kwesịrị ịdị ka nke a:

Nyochaa arịrịọ njikọta na GitLab site na iji PVS-Studio maka C #
Ugbu a ị nwere ike ịga n'ihu na nyocha. Nke mbụ, ka anyị tinye otu edemede maka nyocha zuru oke. Na ọkọlọtọ -t anyị na-agafe ụzọ ngwọta na ọkọlọtọ -o dee ụzọ na faịlụ nke a ga-edepụta nsonaazụ nyocha. Anyị nwekwara mmasị na koodu nloghachi. N'okwu a, anyị nwere mmasị na nkwụsị ọrụ ahụ mgbe koodu nloghachi nwere ozi na ịdọ aka ná ntị nyere n'oge nyocha. Nke a bụ ihe iberibe a dị ka:

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

Koodu nloghachi na-arụ ọrụ na ụkpụrụ nke nkpuchi ntakịrị. Dịka ọmụmaatụ, ọ bụrụ na enyere ịdọ aka ná ntị n'ihi nyocha ahụ, mgbe ahụ, koodu nloghachi ga-abụ nha 8. Ọ bụrụ na ikike ahụ agwụ n'ime otu ọnwa, mgbe ahụ, koodu nloghachi ga-adị nha 4. Ọ bụrụ na achọpụtara njehie n'oge nyocha. na ikike agwụ n'ime otu ọnwa, koodu nloghachi, a ga-ede ụkpụrụ abụọ ahụ: tinye ọnụ ọgụgụ ọnụ ma nweta koodu nloghachi ikpeazụ - 8+4=12. Ya mere, site na ịlele ibe ndị kwekọrọ, enwere ike nweta ozi gbasara steeti dị iche iche n'oge nyocha. A kọwapụtara koodu nloghachi n'ụzọ zuru ezu na mpaghara "pvs-studio-dotnet (Linux / macOS) Koodu nloghachi" nke akwụkwọ ahụ "Nyochaa Visual Studio / MSBuild / .NET Core ọrụ site na ahịrị iwu site na iji PVS-Studio".

N'okwu a, anyị nwere mmasị na koodu nloghachi niile ebe 8 pụtara.

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

Anyị ga-enweta 1 mgbe koodu nloghachi nwere ntakịrị nke nọmba anyị nwere mmasị na ya, ma ọ bụghị ya, anyị ga-enweta 0.

Ọ bụ oge ịgbakwunye nyocha arịrịọ. Tupu anyị emee nke a, ka anyị kwadoo ebe maka edemede. Anyị kwesịrị ka emechaa ya naanị mgbe arịrịọ njikọta mere. Ọ dị ka nke a:

merge:
  script:
  only:
  - merge_requests

Ka anyị gaa n'ihu na edemede ahụ n'onwe ya. M chere ihu na igwe mebere amaghị ihe ọ bụla mmalite/nna ukwu. Ya mere, ka anyị nyere ya aka ntakịrị:

  - git fetch origin

Ugbu a, anyị na-enweta ọdịiche dị n'etiti alaka ma chekwaa nsonaazụ na txt faịlụ:

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

Ebee $CI_COMMIT_SHA – hash nke ikpeazụ eme.

Ọzọ, anyị na-amalite nyochaa ndepụta faịlụ site na iji ọkọlọtọ -f. Anyị na-ebufe faịlụ .txt enwetaburu na ya. Ọfọn, site na ntụnyere na nyocha zuru oke, anyị na-ele anya na koodu nloghachi:

  - 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

Edemede zuru ezu maka ịlele arịrịọ njikọ ga-adị ka nke a:

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

Naanị ihe fọdụrụ bụ ịgbakwunye ntụgharị log ka emechara script niile. Anyị na-eji akara after_script na ịba uru plog-ngbanwe:

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

Ịbara uru plog-ngbanwe bụ ọrụ mepere emepe nke a na-eji iji tọghata akụkọ njehie parser ka ọ bụrụ ụdị dị iche iche, dị ka HTML. A na-enye nkọwa zuru ezu nke akụrụngwa na ngalaba nke "Plog Converter Utility" akụkụ dị mkpa nke akwụkwọ ahụ.

Site n'ụzọ, ọ bụrụ na ịchọrọ ịrụ ọrụ nke ọma na akụkọ .json na mpaghara sitere na IDE, m na-atụ aro nke anyị. ngwa mgbakwunye maka IDE Rider. A kọwara ojiji ya n'ụzọ zuru ezu na akwụkwọ dị mkpa.

Maka ịdị mma, ebe a bụ .gitlab-ci.yml n'uju:

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

Ozugbo i tinyechara ihe niile na faịlụ ahụ, pịa Mee mgbanwe. Iji hụ na ihe niile ziri ezi, gaa na CI / CD -> Pipelines -> -agba ọsọ. Window igwe mebere ga-emeghe, na njedebe nke enwere ihe ndị a:

Nyochaa arịrịọ njikọta na GitLab site na iji PVS-Studio maka C #
hụrụ Job nwere ihe ịga nke ọma - ihe ịga nke ọma, ihe niile dị mma. Ugbu a ị nwere ike ịnwale ihe ị mere.

Ihe atụ ọrụ

Maka ọmụmaatụ ọrụ, ka anyị mepụta ọrụ dị mfe (na nwe-) nke ga-enwe ọtụtụ faịlụ. Mgbe nke ahụ gasịrị, na ngalaba ọzọ anyị ga-agbanwe naanị otu faịlụ ma gbalịa ịrịọ arịrịọ njikọ.

Ka anyị tụlee ikpe abụọ: mgbe faịlụ gbanwetụrụ nwere njehie na mgbe ọ naghị. Nke mbụ, ihe atụ nwere njehie.

Ka anyị kwuo na enwere faịlụ na ngalaba nna ukwu Mmemme.cs, nke na-enweghị njehie, mana na ngalaba ọzọ onye nrụpụta gbakwunyere koodu na-ezighi ezi ma chọọ ịrịọ arịrịọ. Kedu ụdị ndudue o mere adịghị mkpa, isi ihe bụ na ọ dị. Dịka ọmụmaatụ, onye ọrụ chefuru otutu (Ee, ya mere ihe ọjọọ):

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

Ka anyị leba anya na nsonaazụ iji njehie nyochaa ihe atụ. Ọzọkwa iji jide n'aka na ọ bụ naanị otu faịlụ ka a tụgharịrị, agbakwunyere m ọkọlọtọ -r gaa n'ahịrị mmalite pvs-studio-dotnet:

Nyochaa arịrịọ njikọta na GitLab site na iji PVS-Studio maka C #
Anyị na-ahụ na onye nyocha ahụ chọtara njehie ma ghara ikwe ka ejikọta alaka ndị ahụ.

Ka anyị lelee ihe atụ na-enweghị njehie. Na-emezi koodu:

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

Jikota nsonaazụ nyocha arịrịọ:

Nyochaa arịrịọ njikọta na GitLab site na iji PVS-Studio maka C #
Dị ka anyị nwere ike ịhụ, ọ dịghị njehie ahụghị, na arụrụ ọrụ ahụ gara nke ọma, nke bụ ihe anyị chọrọ ịlele.

nkwubi

Weeding si ọjọọ koodu tupu merging alaka dị nnọọ adaba na obi ụtọ. Yabụ ọ bụrụ na ị na-eji CI/CD, gbalịa itinye ihe nyocha static ka ịlele. Ọzọkwa, a na-eme nke a n'ụzọ dị mfe.

Daalụ maka mmasị gị.

Nyochaa arịrịọ njikọta na GitLab site na iji PVS-Studio maka C #
Ọ bụrụ na ịchọrọ ịkọrọ ndị na-ege ntị na-asụ Bekee akụkọ a, biko jiri njikọ ntụgharị asụsụ: Nikolay Mironov. Nyochaa arịrịọ njikọta na GitLab site na iji PVS-Studio maka C #.

isi: www.habr.com

Tinye a comment