Ka nānā ʻana i nā noi hoʻohui i GitLab me ka hoʻohana ʻana i ka PVS-Studio no C#

Ka nānā ʻana i nā noi hoʻohui i GitLab me ka hoʻohana ʻana i ka PVS-Studio no C#
Makemake ʻoe iā GitLab a inaina i nā pōpoki? Makemake ʻoe e hoʻomaikaʻi i ka maikaʻi o kāu code kumu? A laila ua hele mai ʻoe i kahi kūpono. I kēia lā, e haʻi mākou iā ʻoe pehea e hoʻonohonoho ai i ka PVS-Studio C# analyer e nānā i nā noi hoʻohui. Loaʻa i kahi ʻano unicorn a hauʻoli i ka heluhelu ʻana i nā mea a pau.

ʻO PVS-Studio he mea hana no ka ʻike ʻana i nā hewa a me nā nāwaliwali i ke kumu kumu o nā papahana i kākau ʻia ma C, C++, C# a me Java. Hana ma nā ʻōnaehana 64-bit ma Windows, Linux a me macOS. Hiki iā ia ke kālailai i ka code i hoʻolālā ʻia no 32-bit, 64-bit a i hoʻokomo ʻia i nā kahua ARM.

Ma ke ala, ua hoʻokuʻu mākou i ka PVS-Studio 7.08, kahi i hana ai mākou i nā mea he nui hoihoi. ^ E Ha yM. Ma ke ʻano he:

  • C# anaana no Linux a me macOS;
  • plugin no Rider;
  • ʻano nānā papa inoa waihona hou.

Ke ʻano nānā papa inoa waihona

Ma mua, no ka nānā ʻana i kekahi mau faila, pono e hāʻawi i kahi .xml me kahi papa inoa o nā faila i ka mea ana. Akā no ka mea ʻaʻole maʻalahi kēia, ua hoʻohui mākou i ka hiki ke hoʻololi i ka .txt, ka mea e maʻalahi ai ke ola.

No ka nānā ʻana i nā faila kikoʻī, pono ʻoe e kuhikuhi i ka hae --sourceFiles (-f) a hoʻoili i ka .txt me kahi papa inoa o nā faila. Penei kona ano:

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

Inā makemake ʻoe i ka hoʻonohonoho ʻana i nā noi commit checking a huki paha, hiki iā ʻoe ke hana i kēlā me ka hoʻohana ʻana i kēia ʻano. ʻO ka ʻokoʻa ka loaʻa ʻana o kahi papa inoa o nā faila e nānā ai a e hilinaʻi ʻia i nā ʻōnaehana āu e hoʻohana nei.

ʻO ke kumu o ka nānā ʻana i kahi noi hoʻohui

ʻO ke kumu nui o ka loiloi e hōʻoia i ka hāʻule ʻole o nā pilikia i ʻike ʻia e ka mea hoʻoponopono i ka wā hoʻohui. haku lālā. ʻAʻole mākou makemake e nānā i ka papahana holoʻokoʻa i kēlā me kēia manawa. Eia kekahi, i ka hoʻohui ʻana i nā lālā, loaʻa iā mākou kahi papa inoa o nā faila i hoʻololi ʻia. No laila, manaʻo wau e hoʻohui i kahi loiloi noi hoʻohui.

ʻO kēia ke ʻano o ka noi hoʻohui ʻana ma mua o ka hoʻokō ʻana i kahi mea hoʻoponopono static:

Ka nānā ʻana i nā noi hoʻohui i GitLab me ka hoʻohana ʻana i ka PVS-Studio no C#
ʻO ia hoʻi, nā hewa a pau i loko o ka lālā Nā loli hou, e neʻe i ka lālā kumu. No ka mea ʻaʻole mākou makemake i kēia, hoʻohui mākou i ka nānā ʻana, a i kēia manawa ua like ke kiʻi:

Ka nānā ʻana i nā noi hoʻohui i GitLab me ka hoʻohana ʻana i ka PVS-Studio no C#
Nānā mākou hoololi2 a inā ʻaʻohe hewa, ʻae mākou i ka noi hoʻohui, a i ʻole e hōʻole mākou.

Ma ke ala, inā makemake ʻoe i ka nānā ʻana i nā hana a huki i nā noi no C/C++, a laila hiki iā ʻoe ke heluhelu e pili ana. maanei.

GitLab

GitLab he punaewele punaewele DevOps lifecycle mea hana e hāʻawi ana i kahi ʻōnaehana hoʻokele code repository no Git me kāna wiki ponoʻī, ʻōnaehana hoʻopuka hoʻopuka, CI/CD pipeline a me nā hiʻohiʻona ʻē aʻe.

Ma mua o kou hoʻomaka ʻana i ke kālailai ʻana i nā noi hoʻohui, pono ʻoe e kākau inoa a hoʻouka i kāu papahana. Inā ʻaʻole ʻoe ʻike pehea e hana ai i kēia, a laila manaʻo wau ʻO kahi mea kākau koʻu hoa hana.

i hoʻopuka. ʻO ke ʻano o ka hoʻonohonoho ʻana i ke kaiapuni i wehewehe ʻia ma lalo nei kekahi o nā mea hiki. ʻO ka pahuhopu ka hōʻike ʻana i nā ʻanuʻu no ka hoʻonohonoho ʻana i ke kaiapuni e pono ai no ka nānā ʻana a me ka hoʻomaka ʻana i ka mea hoʻoponopono. Malia paha i kāu hihia, ʻoi aku ka maikaʻi o ka hoʻokaʻawale ʻana i nā pae o ka hoʻomākaukau ʻana i ke kaiapuni (hoʻohui ʻana i nā waihona, hoʻokomo i kahi mea anamanaʻo) a me ka nānā ʻana: no ka laʻana, ka hoʻomākaukau ʻana i nā kiʻi Docker me ke kaiapuni kūpono a me ka hoʻohana ʻana iā lākou, a i ʻole kekahi ala ʻē aʻe.

No ka hoʻomaopopo maikaʻi ʻana i ka mea e hiki mai ana i kēia manawa, manaʻo wau e nānā i kēia kiʻi:

Ka nānā ʻana i nā noi hoʻohui i GitLab me ka hoʻohana ʻana i ka PVS-Studio no C#
Pono ka mea anaana i ka .NET Core SDK 3 e hana, no laila ma mua o ka ho'okomo'ana i ka mea anaana, pono'oe e ho'ohui i nā waihona waihona Microsoft kahi e ho'okomo'ia ai nā hilina'i e pono ai no ka mea anaana. Hoʻohui i nā waihona waihona Microsoft no nā māhele Linux like ʻole i wehewehe ʻia ma ka palapala pili.

No ka hoʻokomo ʻana iā PVS-Studio ma o ka luna hoʻonohonoho, pono ʻoe e hoʻohui i nā waihona waihona PVS-Studio. ʻO ka hoʻohui ʻana i nā waihona no nā māhele like ʻole i wehewehe ʻia i nā kikoʻī hou aku ma ʻāpana kūpono o ka palapala.

Pono ka mea anaana i ke kī laikini e hana. Hiki iā ʻoe ke loaʻa ka laikini hoʻokolokolo ma ʻaoʻao hoʻoiho ʻanakala.

i hoʻopuka. E ʻoluʻolu e hoʻomaopopo i ke ʻano o ka hana i wehewehe ʻia (ka nānā ʻana i nā noi hoʻohui) pono i kahi laikini Enterprise. No laila, inā makemake ʻoe e hoʻāʻo i kēia ʻano hana, mai poina e hōʻike i ke kahua "Message" pono ʻoe i kahi laikini Enterprise.

Inā loaʻa kahi noi hoʻohui, a laila pono mākou e nānā i ka papa inoa o nā faila i hoʻololi ʻia, inā ʻaʻole mākou e loiloi i nā faila āpau. Ma hope o ka nānā ʻana, pono mākou e hoʻololi i nā logs i ke ʻano a mākou e pono ai.

I kēia manawa, loaʻa ka algorithm o ka hana ma mua o kou mau maka, hiki iā ʻoe ke neʻe i ke kākau ʻana i kahi palapala. No ka hana ʻana i kēia, pono ʻoe e hoʻololi i ka faila .gitlab-ci.yml a i ʻole, inā ʻaʻole ia, e hana. No ka hana ʻana, pono ʻoe e kaomi i ka inoa o kāu papahana -> Hoʻonohonoho iā CI/CD.

Ka nānā ʻana i nā noi hoʻohui i GitLab me ka hoʻohana ʻana i ka PVS-Studio no C#
I kēia manawa ua mākaukau mākou e kākau i ka palapala. E kākau mua i ke code e hoʻokomo ai i ka mea hoʻoponopono a hoʻokomo i ka laikini:

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

No ka mea pono e hoʻokomo ʻia a hoʻāla ʻia ma mua o nā palapala ʻē aʻe, hoʻohana mākou i kahi lepili kūikawā before_script. E wehewehe iki au i kēia ʻāpana.

Ke hoʻomākaukau nei e hoʻokomo i ka mea hoʻoponopono:

  - 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

Hoʻohui i nā waihona waihona PVS-Studio a me ka mea nānā:

  - 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

Laikini ho'ā 'ana:

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY

$PVS_NAME - inoa hoʻohana.

$PVS_KEY - kī huahana.

Hoʻihoʻi hou i nā hilinaʻi papahana ma kahi $CI_PROJECT_DIR – ala piha i ka papa kuhikuhi papahana:

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

No ka loiloi pololei, pono ke kūkulu pono ʻia ka papahana, a pono e hoʻihoʻi ʻia kona mau hilinaʻi (no ka laʻana, pono e hoʻoiho ʻia nā pūʻolo NuGet pono).

Hiki iā ʻoe ke hoʻonohonoho i nā ʻano hoʻololi kaiapuni i loaʻa ka ʻike laikini ma ke kaomi ʻana Kāu Mau Koho Paʻamau, a ma hope - ma CI/CD.

Ka nānā ʻana i nā noi hoʻohui i GitLab me ka hoʻohana ʻana i ka PVS-Studio no C#
Ma ka puka aniani e wehe ai, e huli i ka mea Nānā, kaomi i ke pihi ma ka ʻākau E ho'ākea i a hoʻohui i nā mea hoʻololi. Pono ka hopena e like me kēia:

Ka nānā ʻana i nā noi hoʻohui i GitLab me ka hoʻohana ʻana i ka PVS-Studio no C#
I kēia manawa hiki iā ʻoe ke neʻe i ka nānā ʻana. ʻO ka mea mua, e hoʻohui i kahi palapala no ka nānā ʻana piha. I ka hae -t hele mākou i ke ala i ka hopena o ka hae -o e kākau i ke ala i ka waihona kahi e kākau ʻia ai nā hualoaʻa. Ua hoihoi pū mākou i ke code hoʻihoʻi. I kēia hihia, makemake mākou i ka pau ʻana o ka hana inā loaʻa i ka code hoʻihoʻi ka ʻike i hoʻopuka ʻia nā ʻōlelo luhi i ka wā o ka loiloi. ʻO kēia ke ʻano o kēia ʻāpana:

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

Hana nā code hoʻihoʻi ma ke kumu o kahi mask. No ka laʻana, inā i hoʻopuka ʻia nā ʻōlelo aʻo ma muli o ka nānā ʻana, a laila e like ka helu hoʻihoʻi me 8. Inā pau ka laikini i loko o hoʻokahi mahina, a laila e like ke code hoʻihoʻi me 4. Inā ʻike ʻia nā hewa i ka wā o ka nānā ʻana. a pau ka laikini i loko o hoʻokahi mahina, e hoʻihoʻi ke code, e kākau ʻia nā waiwai ʻelua: hoʻohui pū i nā helu a loaʻa i ke code hoʻihoʻi hope - 8+4=12. No laila, ma ka nānā ʻana i nā bits pili, hiki ke loaʻa ka ʻike e pili ana i nā mokuʻāina like ʻole i ka wā o ka nānā ʻana. Hōʻike ʻia nā code hoʻihoʻi i nā kikoʻī hou aku ma ka ʻāpana "pvs-studio-dotnet (Linux / macOS) Return Codes" o ka palapala "Ke nānā nei i nā papahana Visual Studio / MSBuild / .NET Core mai ka laina kauoha me ka hoʻohana ʻana i ka PVS-Studio".

I kēia hihia, makemake mākou i nā code hoʻihoʻi a pau kahi i ʻike ʻia ai 8.

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

E loaʻa iā mākou ka 1 i ka wā e loaʻa ai ka helu hoʻihoʻi i ka helu o ka helu a mākou e makemake ai, i ʻole e loaʻa iā mākou ka 0.

ʻO ka manawa kēia e hoʻohui i ka noiʻi noiʻi hoʻohui. Ma mua o ka hana ʻana i kēia, e hoʻomākaukau kākou i wahi no ka palapala. Pono mākou e hoʻokō ʻia i ka wā i loaʻa ai kahi noi hoʻohui. Penei kona ano:

merge:
  script:
  only:
  - merge_requests

E neʻe kāua i ka palapala ponoʻī. Ua alo au me ka ʻike ʻole o ka mīkini virtual i kekahi mea kumu / haku. No laila e kōkua iki kāua iā ia:

  - git fetch origin

I kēia manawa, loaʻa iā mākou ka ʻokoʻa ma waena o nā lālā a mālama i ka hopena i loko txt waihona:

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

'Ahea $CI_COMMIT_SHA - hash o ka hana hope.

A laila, hoʻomaka mākou e nānā i ka papa inoa o nā faila me ka hoʻohana ʻana i ka hae -f. Hoʻololi mākou i ka faila .txt i loaʻa mua iā ia. ʻAe, ma ka hoʻohālikelike me ka loiloi piha, nānā mākou i nā code hoʻihoʻi:

  - 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

ʻO ka palapala piha no ka nānā ʻana i kahi noi hoʻohui e like me kēia:

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

ʻO nā mea a pau i koe, ʻo ia ka hoʻohui ʻana i ka hoʻololi ʻana i ka lāʻau ma hope o ka hana ʻia ʻana o nā palapala āpau. Hoʻohana mākou i ka lepili after_script a me ka pono mea hoʻololi-palapala:

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

Mea hoʻohana mea hoʻololi-palapala he papahana kumu wehe i hoʻohana ʻia e hoʻololi i nā hōʻike hewa parser i nā ʻano like ʻole, e like me HTML. Hāʻawi ʻia kahi wehewehe kikoʻī o ka pono ma ka ʻāpana "Plog Converter Utility" ʻāpana kūpono o ka palapala.

Ma ke ala, inā makemake ʻoe e hana maʻalahi me .json hōʻike kūloko mai ka IDE, a laila manaʻo wau i kā mākou plugin no IDE Rider. Ua wehewehe nui ʻia kona hoʻohana ʻana ma palapala pili.

No ka maʻalahi, eia nō .gitlab-ci.yml piha:

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

Ke hoʻohui ʻoe i nā mea a pau i ka faila, kaomi ma luna Hana i nā hoʻololi. I mea e ʻike ai ua pololei nā mea a pau, e hele i CI / CD -> ʻO Pipelines -> holo. E wehe ʻia kahi puka aniani mīkini virtual, a ma ka hope e pono ai kēia:

Ka nānā ʻana i nā noi hoʻohui i GitLab me ka hoʻohana ʻana i ka PVS-Studio no C#
ʻike Ua lanakila ʻo Job - holomua, maikaʻi nā mea a pau. I kēia manawa hiki iā ʻoe ke hoʻāʻo i kāu mea i hana ai.

Nā laʻana hana

No ka laʻana o ka hana, e hana mākou i kahi papahana maʻalahi (in haku) e loaʻa i kekahi mau faila. Ma hope o kēlā, ma kahi lālā ʻē aʻe e hoʻololi mākou i hoʻokahi faila a hoʻāʻo e hana i kahi noi hoʻohui.

E noʻonoʻo kākou i ʻelua mau hihia: i ka wā i loaʻa ai ka hewa i ka faila i hoʻololi ʻia a inā ʻaʻole. ʻO ka mea mua, he laʻana me kahi hewa.

E ʻōlelo kākou aia kahi faila ma ka lālā kumu Program.cs, ʻaʻohe hewa, akā ma kahi lālā ʻē aʻe ua hoʻohui ka mea hoʻomohala i nā code hewa a makemake e hana i kahi noi hoʻohui. He aha ke ʻano o ka hewa āna i hana ai ʻaʻole ia he mea nui, ʻo ka mea nui ke ola. No ka laʻana, poina ka mea hoʻohana hoolei (Ae, hewa loa):

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

E nānā kākou i ka hopena o ke kālailai ʻana i kekahi laʻana me ka hewa. No ka hōʻoia ʻana hoʻokahi wale nō faila i paʻi ʻia, ua hoʻohui au i ka hae -r i ka laina hoʻomaka pvs-studio-dotnet:

Ka nānā ʻana i nā noi hoʻohui i GitLab me ka hoʻohana ʻana i ka PVS-Studio no C#
ʻIke mākou ua loaʻa i ka mea hōʻike he hewa a ʻaʻole i ʻae i ka hui ʻana i nā lālā.

E nānā kākou i ka laʻana me ka hewa ʻole. Hoʻoponopono i ke code:

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

Hoʻohui i nā hualoaʻa noiʻi noiʻi:

Ka nānā ʻana i nā noi hoʻohui i GitLab me ka hoʻohana ʻana i ka PVS-Studio no C#
E like me kā mākou e ʻike ai, ʻaʻohe hewa i loaʻa, a ua kūleʻa ka hoʻokō hana, ʻo ia ka mea a mākou i makemake ai e nānā.

hopena

ʻO ka wehe ʻana i nā code hewa ma mua o ka hoʻohui ʻana i nā lālā he mea maʻalahi a ʻoluʻolu hoʻi. No laila, inā ʻoe e hoʻohana nei i ka CI/CD, e hoʻāʻo e hoʻokomo i kahi mea hoʻoponopono static e nānā. Eia kekahi, hana maʻalahi kēia.

Mahalo oe no kou noonoo.

Ka nānā ʻana i nā noi hoʻohui i GitLab me ka hoʻohana ʻana i ka PVS-Studio no C#
Inā makemake ʻoe e kaʻana like i kēia ʻatikala me kahi anaina ʻōlelo Pelekania, e ʻoluʻolu e hoʻohana i ka loulou unuhi: Nikolay Mironov. Ka nānā ʻana i nā noi hoʻohui i GitLab me ka hoʻohana ʻana i ka PVS-Studio no C#.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka