GitLabá áááłá áĽá áľá
á°áśá˝á áá áá? á¨ááá áŽáľáá áĽáŤáľ ááťáťá ááááá? á¨á፠áá° áľááááá áŚáł ááĽá°áá. á¨áá
á°áľ áĽáŤááá˝á áááá°á˝ áᏠá¨PVS-Studio C# analyzerá áĽáá´áľ áĽáá°ááŤáá
አáĽááááááłááᢠáááá áĽááłá á°áľ á áááľ áĽá á°áľá°á ááŁáĽá˘
á áááŤá˝á áá áĽá ááá á¨á°áŤáá áľá PVS-Studio 7.08 á ááĽá°ááá˘
- áááááľ áĽá ááááŽáľ Რ# á°ááłá;
- á°á°áŞ á Rider;
- á á˛áľ á¨ááá áááá áźá áááł.
á¨ááá áááá á á¨ááἠáááł
á¨áá á ááľ á¨á°áá°á áááá˝á áááá°á˝ ᨠ.xml ááá á¨áááá˝ áááá áá áá° á°ááłá ááľá°ááá á áľááá áá áᢠááá áá áá á áŁá ááš áľáááá, á áááľá á áĽá á á¨ááŤááá txt á á¨ááľá°ááá á˝ááłá á¨áá¨áá.
á¨á°áá°á áááá˝á áááá°á˝ áŁáá˛áŤáá ááĽááľ á ááĽááľ --ááá áááá˝ (-f) áĽá txt á áááá˝ áááá áááᢠáá á áááľááá˘
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
áźáŽá˝á ááááá ááá áĽáŤááá˝á áááłáĽ ááááľ áŤáá áá á áááł á áá ááá ááľá¨á áľá˝ááá ᢠááŠááą ááá°áá°á á¨áááá˝á áááá á ááááľ áá áááá áĽá á á¨áľáá áľáááśá˝ áá áĽáá°áá áá ááá°áá.
á¨áá á°áľ áĽáŤá áá¨áá፠ááá
á¨áźáŠ áá áááľ á á°ááłá á¨á°áááľ á˝ááŽá˝ áá° áá á°áľ ááľáĽ áĽááłááᥠáá¨ááἠáá áŁáá¤áľ á áááŤá. áĽáá˛ááᣠá á ááá ááŽáááąá á áĽáŤááłááą áá áá°áá°á á áááááᢠá¨áá á á áá á áááŤáá˝á á ááááľ, á¨á°áá¨áŠ áááá˝ áááá á áá. áľááá á¨áá á°áľ áĽáŤá áźá ááá¨áá ááłáĽ á áááŁááá˘
á¨áááááłááľ á°ááłá á¨áá á¨áĄ á ááľ á¨áá á°áľ áĽáŤáá áá á áááľááá˘
á á
áááŤá ááľáĽ á¨áá áŠáľ ááá áľá
á°áśá˝ áááľ áá áááŚá˝, áá° ááá á
áááŤá áá¸áááŤá. áá
áá áľáááááá, áľááłááá áĽáá¨ááŤáá, áĽá á áá áá¨áłá áá
á áááľáá.
áĽááá¨ááŤááᢠáááŚá˝2 áĽá, ááá áľá
á°áśá˝ á¨áá, á¨áá
á°áľ áĽáŤáá áĽááá ááá, á áá áá፠áá ááľá
áĽáá°áááá.
á áááŤá˝á áá ááá áááľá ááá°áá°á áĽá á¨C/C++ áĽáŤááá˝á áááłáĽ ááááľ áŤááľ áľááą ááá ἠáá˝ááá˘
GitLab
á¨áá
á°áľ áĽáŤááá˝á áľáá°á áľáá ፠á¨ááá áá á ááľ ááŽáááľáá ááááἠáĽá ááľáá áŤáľáááááłáᢠáá
á áĽáá´áľ ááľá¨á áĽááłááĽá áŤááá, áĽá áĽá áááá
á ááá¨á°. á¨áá á áłá˝ á¨á°ááá¸áá á áŤáŁá˘ á¨áááááľ ááááľ á¨ááťááľ ááľáĽ á ááą áá. áᥠááá°áá°á á áľááá á¨áááá á áŤáŁá˘ ááááááľ áĽá á°ááłáá ááááá á°á¨ááá˝á ááłá¨áľ áá. ááááŁáľ á áĽááľá ááłá áá á¨á áŤáŁá˘ ááá áľ á°á¨ááá˝á ááá¨áľ (áá¨ááťáá˝á áá¨áá ᣠá°ááłáá ááŤá) áĽá áľáá°á-áááłá ᣠá¨áśá¨á ááľáá˝á á¨á áľáááá á á¨áŁá˘ áá á áááááľ áĽá áĽááąá á áá áá ᣠááá á áá ááááľ ááá¨áľ á¨á áá áĽáŠ áááá á˘
á áá áá áĽáá°ááá á¨á áá ááá¨áłáľáŁ á¨áá¨á°ááá áľáĽá áĽáá˛ááá¨áą ááłáĽ á áááŁááá˘
á°ááłá ᨠNET Core SDK 3 áĽáá˛á°áŤ ááááá ᣠáľáááá á°ááłáá á¨ááŤáá á ááľ á¨ááááŽáśááľ áá¨ááťáá˝á áá¨á áŤáľáááááłá ᣠá¨áĽááŤá áá°ááłá á áľááá á¨áá áĽááá˝ ááŤááᢠáá°ááŤáŠ á¨ááááľ áľáááśá˝ á¨ááááŽáśááľ áá¨ááťáá˝á áá¨á
PVS-Studioá á áĽá
á á áááŁáŞ á áŠá áááŤá á¨PVS-Studio áá¨ááťáá˝á áá¨á áŤáľáááááłáᢠáá°ááŤáŠ áľáááśá˝ áá¨ááťáá˝á áá¨áá á ááľáĽ á á áá áááá á°áááżá
á°ááłá áááľáŤáľ á¨áááľ ááá áŤáľáááááᢠá áá á¨áá¨áŤ áááľ ááááľ áá˝ááá˘
á ááá¨á°. áĽáŁáá á¨á°ááá¸á á¨á á áŤá áá´ (á¨áá á°áľ áĽáŤááá˝ áľáá°á) á¨á˘áá°áááŤáá áááľ áĽáá°ááŤáľáááá áἠáá áᢠáľááá , áá áá á¨á á°áŤá áá´ áááá¨á á¨ááá, á "áááĽááľ" ááľá ááľáĽ, á¨áľáá áľ áááľ áĽáá°ááŤáľáááá áááá¨áľáá á áááą.
á¨áá á°áľ áĽáŤá á¨á°ááł, á¨á°áá¨áŠáľá áááá˝ áááá áĽáť áá°áá°á á ááĽá, á áá áá፠áááá áááá˝ áĽááá¨ááŤáá. á¨áá°áá°á á áá, ááááŚášá áá°áááááá á áá¸áľ áááἠáŤáľááááá.
á áá, á ááááťá˝á ááľ á¨áľáŤ áľáá°-ááá áľááá, áľááŞááąá áá° ááá ááá á áĽáá˝ááá. áá áá áááľá¨á áááá ááá¨á áŤáľáááááłá .gitlab-ci.yml ááá á¨áá, ááá áŠ. áĽáąá áááá á á¨ááŽáááľáá áľá -> áá á á ááľá¨á áŤáľáááááłá CI/á˛á˛ áŤáá áŠ.
á áá áľááŞááąá áááťá ááá áá. ááááŞáŤ á°ááłáá á¨ááá áŽáľ áĽáá˝á áĽá áááąá áĽááľááŁáĄ-
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-áľáąá˛áŽ áĽá á°ááłá áá¨ááťáá˝á áá¨ááĄ
- 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/á˛á˛.
á áá¨áá°á ááľáŽáľ ááľáĽ ááĽáá áŤáá á°ááááŽá˝áŁ á á ááŤáŠ áá á áá á á
áŤáľáá ááá áĽá á°ááááŽá˝á áŤááᢠáá¤áą á¨áá¨á°áá ááá á áá áľ.
á áá áá° áľáá°áá áááľ áĽáá˝ááá. á ááááŞáŤ ᣠáá°áá áľáá°á áľááŞááľ áĽáá¨ááᢠáá° áŁáá˛áŤ -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) á¨ááááť áŽáśá˝ á¨á°ááą ááá ááľáĽ á á áá áááá á°ááá¸ááá˘
á áá á ááŁá 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 - á¨áá¨á¨áťá ááá áááľ áá˝.
á ááá á áŁáá˛áŤáá á áá áá á¨áááá˝á áááá áľáá°á áĽááááŤáá -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:
- plog-converter -t html -o eLog ./PVS-Studio.json
áááááŤ
á áááŤá˝á áá ᨠIDE ᨠ.json ááᣠáá á á áá ááľáĽ áááľáŤáľ á¨áááá˝á á¨áĽáá ááłáĽ á áááŁáá
áĽáá áážáľ áááááľ .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
á áá´ ááá ááá áá° ááá á¨áłá¨á á áá á á áŤáľáá áááŚá˝á ááľá¨á. ááá ááá áľááá áááá ááá¨áľ áá° áááą á˛á á / á˛á˛ -> á§áá§áá˝ -> á áááľ áá. á¨á¨áášáá áá˝á ááľáŽáľ áá¨ááłááŁá áá á áá¨á¨áť á¨áá¨á°áá ááá á áá áľá˘
á á¨á á˘áŽáĽ á°áłááśááłá - áľáŹáľ, ááá ááá á°á
á áá. á áá áŤá°á¨ááľá ááá¨á áá˝ááá˘
á¨áĽáŤ ááłááá˝
ááľáŤ ááłáᣠááá ááŽáááľ áĽááá á (á áŁáá¤áľ) á ááŤáł áááá˝á ááááᢠá¨á፠á áá, á áá á áááŤá ááľáĽ, á ááľ ááá áĽáť áĽááááŁáá áĽá á¨áá á°áľ áĽáŤá ááá á¨áĽ áĽááááŤáá.
áááľ ááłáŽá˝á áĽáááá¨áľáĄ á¨á°áťáťáá ááá áľá á°áľ á˛áá áĽá á ááááá áľ ááᢠá ááááŞáŤ, áľá á°áľ áŤáá áľ ááłá.
á ááá á
áááŤá ááľáĽ ááá á á áĽáá á ááŽááŤá.csáľá
á°áśá˝á áŤááŤá áĽá á áá á
áááŤá ááľáĽ ááá˘á á¨á°áłáłá° áŽáľ á¨ááŻá áĽá á¨áá
á°áľ áĽáŤá áá
á¨áĽ áááááᢠáá á áááľ áľá
á°áľ áĽáá°á°áŤ á áŁá á áľááá á áá°áá, ááá ááá ááአáá. áááłá áŚááŹá°áŠá á¨áłááľ ááĽá (á á,
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}
á¨ááłá áľááłá áá¤áąá á¨áľá á°áľ áá áĽááᢠáĽáá˛áá á ááľ ááá áĽáť áá°áá°áá ááá¨ááἠáŁáá˛áŤáá á¨ááŹáŤáá -r áá° pvs-studio-dotnet áááť ááľáááĄ-
á°ááłá áľá
á°áľ áĽááłáá áĽá á
áááŤáášá áĽáá˛áááą áĽááłáááá° áĽááŤááá˘
ááłááá áŤáááá áľá á°áľ áĽáááľá˝á˘ áŽáąá á ááľá°áŤá¨á áá;
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}
á¨áá á°áľ áĽáŤá áľáá°á áá¤áśá˝áĄ-
áĽáá°ááá¨á, ááá áľá
á°áśá˝ á áá°ááá, áĽá á¨á°ááŁáŠ á áááá á¨á°áłáŤ áá á, áá
á áááá°á˝ á¨ááááá áá.
áá°áá°ááŤ
á áááŤáá˝á á¨ááááľ á ááľ ááĽá áŽáľá ááľáááľ á áŁá ááš áĽá á áľá°áłá˝ áá. áľááá ᣠCI/CD á¨áá áá á¨ááᣠáĽáąá áááá°á˝ á¨áááááłááľ á°ááłá áááá°áľ ááááŠá˘ á á°á¨ááŞá, áá á áŁá ááá áá.
á¨áĽááľáá áľáŠá¨áľ áĽááá°áááá.
áá
á á˝áá ááĽááááá á°áá᪠áłáłááá˝ áááŤáľ á¨áááᣠáĽáŁáá á¨áľááá áááááá áá ááᥠNikolay Mironová˘
ááá: hab.com