GitLab ááá¯áá»á
áºááŒá®áž bug ááœá±ááá¯áá¯ááºážáá«ááá¬ážá ááá·áºá¡áááºážá¡ááŒá
áºáá¯ááºá á¡áááºá¡ááœá±ážááᯠááŒáŸáá·áºáááºááá¯áá«ááá¬ážá áá«ááá¯ááẠáááºážáá±áá¬ááŸááºááá¯áá±á¬ááºááŒá®á áá±á«ááºážá
ááºážááŒááºážáá±á¬ááºážááá¯ááŸá¯áá»á¬ážááá¯á
á
áºáá±ážááẠPVS-Studio C# ááœá²ááŒááºážá
áááºááŒá¬áááºážááᯠááá±á·áá»áœááºá¯ááºááá¯á·ááŒá±á¬ááŒáá«áááºá áá°ááá¯ááºážá¡ááœáẠunicorn á
áááºáá¶á
á¬ážáá»ááºááŸáá·áº áá»á±á¬áºááœáŸááºá
áœá¬ á
á¬áááºáá«á
á
áá¬ážáá
ááºá áá»áœááºá¯ááºááá¯á·ááẠáá»á¬ážá
áœá¬áá¯ááºáá±á¬ááºáá²á·ááá·áº PVS-Studio 7.08 ááᯠáá¯ááºááŒááºáá²á·áááºá
- Linux ááŸáá·áº macOS á¡ááœáẠC# ááœá²ááŒááºážá áááºááŒá¬áá°á
- Rider á¡ááœáẠplugin;
- ááá¯ááºá á¬áááºážá á áºáá±ážááŒááºážáá¯ááºá¡áá áºá
ááá¯ááºá á¬áááºážá á áºáá±ážáá¯ááº
ááááºáá á¡áá»áá¯á·ááá¯ááºáá»á¬ážááᯠá á áºáá±ážáááºá¡ááœáẠááœá²ááŒááºážá áááºááŒá¬áá°áᶠááá¯ááºáá»á¬ážá á¬áááºážááŸáá·áºá¡áá° .xml ááᯠáá±ážááá¯á·ááẠááá¯á¡ááºáá«áááºá ááá¯á·áá±á¬áº áááºážááẠá¡ááœááºá¡áááºáááŒá±áá±á¬ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠ.txt ááᯠááœáŸá²ááŒá±á¬ááºážááá¯ááºááá·áº á áœááºážáááºááᯠáá±á«ááºážááá·áºáá¬ážááŒá®ážá áááºážááẠááááᯠá¡ááœááºááá¯ážááŸááºážá á±áááºá
áá®ážááŒá¬ážááá¯ááºáá»á¬ážááᯠá á áºáá±ážáááºá¡ááœáẠá¡áá¶ááᯠáááºááŸááºááá«áááºá --sourceFiles (-f) ááŸáá·áº .txt ááᯠááá¯ááºáá»á¬ážá á¬áááºážááŒáá·áº ááœáŸá²ááŒá±á¬ááºážáá«á á€áá¯á¶áááº-
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
á¡áááºá áááºááẠcommit checking ááá¯á·ááá¯áẠpull requests áá»á¬ážááᯠá áá áºááá·áºááœááºážááẠá áááºáááºá á¬ážáá«áá áááºááẠá€áá¯ááºááᯠá¡áá¯á¶ážááŒá¯á áááºážááᯠááŒá¯áá¯ááºááá¯ááºáááºá ááŒá¬ážáá¬ážáá»ááºááŸá¬ ááœá²ááŒááºážá áááºááŒá¬ááẠááá¯ááºáá»á¬ážá á¬áááºážááᯠááá°ááŒááºážááŸáá·áº áááºá¡áá¯á¶ážááŒá¯áá±ááá·áº á áá áºáá»á¬ážá¡áá±á«áº áá°áááºáááºááŒá áºáááºá
áá±á«ááºážá ááºážáá±á¬ááºážááá¯ááŸá¯ á á áºáá±ážááŒááºážáááá¬á
á á áºáá±ážááŒááºážá á¡áááá¡ááŸá áºáá¬áááŸá¬ áá±á«ááºážá ááºááŸá¯á¡ááœááºáž ááœá²ááŒááºážá áááºááŒá¬áá°á០ááœá±á·ááŸááá¬ážáá±á¬ ááŒá¿áá¬áá»á¬áž á¡ááœááºážááá¯á· ááá»áá±á¬ááºááŒá±á¬ááºáž áá±áá»á¬á á±áááºááŒá áºáááºá áá¬á áᬠá¡áááºá ááá±á¬áá»ááºáá áºáá¯áá¯á¶ážááá¯áááºáž á¡áá»áááºááá¯ááºáž áááœá²ááŒááºážá áááºááŒá¬áá»ááºáá«á ááá¯á·á¡ááŒááºá á¡ááá¯ááºážá¡áááºáá»á¬ážááᯠáá±á«ááºážá ááºážáá±á¬á¡áá«á áá»áœááºá¯ááºááá¯á·ááœáẠááŒá±á¬ááºážáá²áá¬ážáá±á¬ááá¯ááºáá»á¬ážá á¬áááºážááŸááááºá ááá¯á·ááŒá±á¬áá·áºá áá±á«ááºážá ááºážááẠáá±á¬ááºážááá¯áá»ááºá á áºáá±ážááŸá¯ááᯠááá·áºááœááºážááẠáá»áœááºá¯ááºá¡ááŒá¶ááŒá¯á¡ááºáá«áááºá
static analyzer ááᯠá¡áá±á¬ááºá¡áááºááá±á¬áºáá® áá±á«ááºážá ááºážááẠáá±á¬ááºážááá¯áá»ááºááẠáá¯á¶ááá¹áá¬ááºááŒá áºáááºá
ááá¯ááá¯áááºááŸá¬ áá¬áááœá²ááœááºááŸááá²á·áá±á¬ á¡ááŸá¬ážáá»á¬ážá¡á¬ážáá¯á¶ážááᯠááá¯ááá¯áá«áááºá á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážáá¬á
áá¬áá¬áááœá²ááá¯á· ááŒá±á¬ááºážááœáŸá±á·áá«áááºá áá«ááᯠáááá¯áá»ááºáá²á·á¡ááœááºá ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ááᯠáá±á«ááºážááá·áºááá¯ááºáá¬áá²á· á¡áᯠáá¯á¶ááŒááºážá áá®ááá¯áá¯á¶áá«áá²á
ááœá²ááŒááºážá
áááºááŒá¬áá«á á¡ááŒá±á¬ááºážá¡áá²áá»á¬áž á ááŸáá·áº á¡ááŸá¬ážá¡ááœááºážáá»á¬áž áááŸááá«á áá±á«ááºážá
ááºážááẠáá±á¬ááºážááá¯áá»ááºááᯠáááºáá¶áááºá ááá¯á·ááá¯ááºáá«á áá»áœááºá¯ááºááá¯á·á áááºážááᯠááŒááºážáááºáá«áááºá
á
áá¬ážáá
ááºá áááºááẠcommits áá»á¬ážááᯠááœá²ááŒááºážá
áááºááŒá¬ááŒá®áž C/C++ á¡ááœáẠáá±á¬ááºážááá¯áá»ááºáá»á¬ážááᯠááœá²áá¯ááºááẠá
áááºáááºá
á¬ážáá«áá áááºážá¡ááŒá±á¬ááºážááᯠáááºáááºááá¯ááºáá«áááºá
GitLab
áá±á«ááºážá
ááºážááŒááºážáá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠááœá²ááŒááºážá
áááºááŒá¬ááŒááºážáááŒá¯áá®á áááºááẠáááºáááá±á¬áá»ááºááᯠá
á¬áááºážááœááºážááŒá®áž á¡ááºáá¯ááºáá¯ááºááẠááá¯á¡ááºáá«áááºá áá«ááá¯áááºááá¯áá¯ááºáááá²áááááẠáá»áœááºáá±á¬áºá¡ááŒá¶ááŒá¯áá«áááºá
ááœá±á¬ááá¯. á¡á±á¬ááºááœááºáá±á¬áºááŒáá¬ážáá±á¬ áááºáááºážáá»ááºááᯠáááºáá±á¬ááºááŒááºážáááºážáááºážááẠááŒá áºááá¯ááºááá·áºáááºážáááºážáá»á¬ážáá²á០áá áºáá¯ááŒá áºáááºá áááºááœááºáá»ááºááŸá¬ ááœá²ááŒááºážá áááºááŒá¬ááŒááºážááŸáá·áº ááœá²ááŒááºážá áááºááŒá¬á ááºááᯠá áááºááŒááºážá¡ááœáẠááá¯á¡ááºáá±á¬ áááºáááºážáá»ááºááᯠáááºááŸááºááŒááºážá¡ááœáẠá¡ááá·áºáá»á¬ážááᯠááŒááááºááŒá áºáááºá ááá·áºá¡ááŒá±á¡áá±ááœáẠáááºáááºážáá»ááºááŒááºáááºááŸá¯á¡ááá·áºáá»á¬áž (ááá¯ááŸá±á¬ááºááŸá¯áá»á¬ážááá·áºááŒááºážá ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááá·áºááœááºážááŒááºáž) ááŸáá·áº ááœá²ááŒááºážá áááºááŒá¬ááŒááºážá¡ááá·áºáá»á¬ážááᯠááá¯ááºážááŒá¬ážááẠááá·áºá¡ááŒá±á¡áá±ááœáẠááŒá áºááá¯ááºáááº- á¥ááá¬á Docker áá¯á¶áá»á¬ážááᯠááá¯á¡ááºáá±á¬áááºáááºážáá»ááºááŒáá·áº ááŒááºáááºááŒááºážááŸáá·áº áááºážááá¯á·ááá¯á¡áá¯á¶ážááŒá¯ááŒááºáž ááá¯á·ááá¯áẠá¡ááŒá¬ážáááºážáááºážá¡áá»áá¯á·ááᯠááœá²áá¯ááºááẠááá·áºááá á¹á ááœáẠááá¯áááá·áºáá»á±á¬áºáááºá
ááá¯áá¬ááŒá áºáá¬áááºááᯠááá¯ááá¯áá±á¬ááºážááœááºá áœá¬ áá¬ážáááºááẠá¡á±á¬ááºáá«áá¯á¶ááŒááºážááᯠááŒáá·áºááŸá¯ááẠá¡ááŒá¶ááŒá¯á¡ááºáá«áááºá
ááœá²ááŒááºážá
áááºááŒá¬áá°ááẠ.NET Core SDK 3 á¡áá¯ááºáá¯ááºááẠááá¯á¡ááºáááºá ááá¯á·ááŒá±á¬áá·áº ááœá²ááŒááºážá
áááºááŒá¬áááááá¬ááᯠááááºáááºáá®á ááœá²ááŒááºážá
áááºááŒá¬áá°á¡ááœáẠááá¯á¡ááºáá±á¬ ááŸá®ááá¯ááŸá¯áá»á¬ážááᯠááá·áºááœááºážááá·áº Microsoft ááá¯ááŸá±á¬ááºáááºážáá»á¬ážááᯠááá·áºááœááºážááẠááá¯á¡ááºáááºá Linux ááŒáá·áºáá±ááŸá¯á¡áá»áá¯ážáá»áá¯ážá¡ááœáẠMicrosoft repositories áá±á«ááºážááá·áºááŒááºážá
áááºáá±á·áá»áºáááºáá±áá»á¬ááŸáááá·áº PVS-Studio ááᯠááá·áºááœááºážáááºá áááºááẠPVS-Studio repositories ááá¯áááºáž ááá·áºááœááºážááẠááá¯á¡ááºáá«áááºá ááá°áá®áá±á¬ ááŒáá·áºáá±ááŸá¯áá»á¬ážá¡ááœáẠááá¯ááŸá±á¬ááºáá¯á¶áá»á¬áž áá±á«ááºážááá·áºááŒááºážááᯠááá¯ááá¯á¡áá±ážá
ááẠáá±á¬áºááŒáá¬ážáá«áááºá
ááœá²ááŒááºážá
áááºááŒá¬áá°ááẠáá¯ááºáá±á¬ááºááẠááá¯ááºá
ááºáá±á¬á·áá
áºáᯠááá¯á¡ááºáááºá á¡á
ááºážááá¯ááºá
ááºááᯠááŸá¬ááá°ááá¯ááºáá«áááºá
ááœá±á¬ááá¯. áá±á¬áºááŒáá¬ážááá·áº áá¯ááºáá±á¬ááºááŸá¯áá¯á¶á ᶠ(áá±á«ááºážá ááºáá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáá±á·áá¬ááŒááºáž) áá¯ááºáááºážááá¯ááºá áẠááá¯á¡ááºááŒá±á¬ááºáž áá»á±ážáá°ážááŒá¯á ááŸááºáá¬ážáá¬ážáá«á ááá¯á·ááŒá±á¬áá·áº áááºááẠá€áá¯ááºáá±á¬ááºáá»ááºááᯠá ááºážááŒáá·áºááá¯áá«áá áááºááẠáá¯ááºáááºážááá¯ááºá ááºááá¯á¡ááºááŒá±á¬ááºáž "Message" á¡ááœááºááœáẠááœáŸááºááŒááẠááá±á·áá«ááŸáá·áºá
áá±á«ááºážá ááºážááẠáá±á¬ááºážááá¯ááŸá¯áá áºáá¯ááŒá áºáá±á«áºáá¬áá«áá áá»áœááºá¯ááºááá¯á·ááẠááŒá±á¬ááºážáá²áá¬ážáá±á¬ááá¯ááºáá»á¬ážá á¬áááºážááᯠááœá²ááŒááºážá áááºááŒá¬áááºáá¬ááá¯áááºá ááá¯á·ááá¯ááºáá«á áá»áœááºá¯ááºááá¯á·ááẠááá¯ááºá¡á¬ážáá¯á¶ážááᯠááá¯ááºážááŒá¬ážá áááºááŒá¬áá«áááºá ááœá²ááŒááºážá áááºááŒá¬ááŒá®ážáá±á¬ááºá ááŸááºáááºážáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á·ááá¯á¡ááºááá·áºáá¯á¶á á¶ááá¯á· ááŒá±á¬ááºážááẠááá¯á¡ááºáááºá
ááᯠááá·áºáá»ááºá áááŸá±á·ááœáẠá¡áá¯ááºá á¡ááºáááá¯áá®áááºááᯠáá¬ážááŸáááŒááºážááŒáá·áº áááºááẠáá¬ááºááœáŸááºážáá±ážááŒááºážááá¯á· áááºááœá¬ážááá¯ááºáááºá áá®ááá¯áá¯ááºááá¯á·á ááá¯ááºááá¯ááŒá±á¬ááºážááááºá .gitlab-ci.yml ááá¯á·ááá¯áẠáááŸááá»áŸáẠáááºáá®ážáá«á áááºážááá¯áááºáá®ážáááºá áááºáááºáááºáááá±á¬áá»ááºáá¡áááºááá¯ááŸáááºáááºááá¯á¡ááºáááºá CI/CD á áá áºááá·áºááœááºážáá«á.
á¡áᯠáá¬ááºááœáŸááºážáá±ážááá¯á· á¡áááºááá·áºááŒá
áºáá±áá«ááŒá®á ááœá²ááŒááºážá
áááºááŒá¬áááááá¬ááᯠáááºáááºááŒá®áž ááá¯ááºá
ááºááᯠááá·áºááœááºážááá·áº áá¯ááºááᯠáŠážá
áœá¬áá±ážááŒáá«á
áá¯á·á
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
áááºáááºááŒááºážááŸáá·áº á¡áááºááœááºážááŒááºážáá»á¬ážááẠá¡ááŒá¬ážáá±á¬ script áá»á¬ážá¡á¬ážáá¯á¶ážááŸá±á·ááœáẠááŒá áºááááºááŒá áºáá±á¬ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠá¡áá°ážáá¶ááááºááᯠá¡áá¯á¶ážááŒá¯áá«áááºá before_script. áá®á¡ááá¯ááºážáá±ážááᯠáááºážáááºážááŸááºážááŒáá«áá á±á
ááœá²ááŒááºážá áááºááŒá¬á ááºááᯠááá·áºááœááºážááẠááŒááºáááºáá±áááº-
- 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 repositories ááŸáá·áº ááœá²ááŒááºážá áááºááŒá¬áá° áá±á«ááºážááá·áºááŒááºáž-
- 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 áááºáá±á·áá»áºáá»á¬ážááᯠáá±á«ááºážáá¯ááºáá¯ááºááááº)á
ááá¯ááºá ááºá¡áá»ááºá¡áááºáá«ááŸááá±á¬ áááºáááºážáá»ááºááŒá±á¬ááºážááœá²áá»ááºáá»á¬ážááᯠááŸáááºááŒááºážááŒáá·áº áááºáááºááŸááºááá¯ááºáá«áááºá setting ááá¯, and after - on CI/CD.
ááœáá·áºáá¬áá±á¬áááºážááá¯ážááœááºá á¡áá¬ááá¯ááŸá¬áá«á variables ááá¯á áá¬áááºááŸáááá¯ááºááá¯ááŸáááºáá«á Expand ááŸáá·áº variable áá»á¬ážááá¯ááá·áºáá«á ááááºááẠá€áá²á·ááá¯á· ááŒá
áºááá·áºáááº-
ááᯠáááºááẠááœá²ááŒááºážá
áááºááŒá¬ááŒááºážááá¯á· áááºááœá¬ážááá¯ááºáááºá ááááŠážá
áœá¬á ááŒá®ážááŒáá·áºá
á¯á¶áá±á¬ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯á¡ááœáẠscript ááá¯ááá·áºááŒáá«á
áá¯á·á á¡áá¶áá±á¬áºáá®ááá¯á· -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
Return áá¯ááºáá»á¬ážááẠbit mask ááááá¬áááœááºá¡áá¯ááºáá¯ááºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ááááºá¡ááŒá
Ạááááá±ážáá»ááºáá»á¬ážááᯠáá¯ááºááŒááºáá²á·áá»áŸáẠááŒááºáá±ážáá¯ááºááẠ8 ááŸáá·áº áá®áá»áŸáááºááŒá
áºáááºá á¡áááºá ááá¯ááºá
ááºáááºáááºážááẠáá
áºáá¡ááœááºáž áá¯ááºáá¯á¶ážáá«áá ááŒááºáá±ážáá¯ááºááẠ4 ááŸáá·áº áá®áá»áŸáááºááŒá
áºáááºá ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯á¡ááœááºáž á¡ááŸá¬ážá¡ááœááºážáá»á¬áž ááœá±á·ááŸááá«áá ááá¯ááºá
ááºáááºáááºážááẠáá
áºáá¡ááœááºáž áááºáááºážáá¯ááºáááºááŒá
áºááŒá®ážá áá¯ááºááŒááºáá±ážáááºá áááºááá¯ážááŸá
áºáá¯á
áá¯á¶ážááᯠáá±ážáá±ážáááº- áá¶áá«ááºáá»á¬ážááᯠáá±á«ááºážááá·áºáᬠáá±á¬ááºáá¯á¶ážááŒááºáá¯ááºááᯠááá°áá« - 8+4=12á ááá¯á·ááŒá±á¬áá·áº áááºááá¯ááºáᬠbit áá»á¬ážááᯠá
á
áºáá±ážááŒááºážááŒáá·áºá ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯á¡ááœááºáž á¡áá»áá¯ážáá»áá¯ážáá±á¬ ááŒááºáááºáá»á¬ážááá¯ááºáᬠá¡áá»ááºá¡áááºáá»á¬ážááᯠááá°ááá¯ááºáááºá á
á¬ááœááºá
á¬áááºážá "pvs-studio-dotnet (Linux / macOS) Return Codes" á¡ááá¯ááºážááœáẠReturn codes áá»á¬ážááᯠá¡áá±ážá
áááºáá±á¬áºááŒáá¬ážáá«áááºá
á€ááá á¹á ááœááºá 8 áá±á«áºáá¬ááá·áº ááŒááºáá±ážáá¯ááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠáá»áœááºá¯ááºááá¯á· á áááºáááºá á¬ážáá«áááºá
- exit_code=$((($exit_code & 8)/8))
ááŒááºáá¯ááºááœáẠáá»áœááºá¯ááºááá¯á·á áááºáááºá á¬ážááá·áº áá¶áá«ááºáá áºáá áºáá«ááŸááá±á¬á¡áá«á ááá¯á·ááá¯ááºáá«á áá»áœááºá¯ááºááá¯á·ááẠ1 ááá¯áááŸááááºááŒá áºáááºá
áá±á«ááºážá ááºážááẠáá±á¬ááºážááá¯áá»áẠááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠááá·áºááẠá¡áá»áááºáá±á¬ááºáá«ááŒá®á áá«ááá¯ááá¯ááºáááºá áá¬ááºááœáŸááºážá¡ááœáẠáá±áá¬áá áºáᯠááŒááºáááºááá¯ááºáá¡á±á¬ááºá áá±á«ááºážá ááºážááẠáá±á¬ááºážááá¯ááŸá¯ ááŒá áºáá±á«áºáá¬ááŸáᬠáááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠááá¯á¡ááºáá«áááºá á€áá¯á¶áááº-
merge:
script:
only:
- merge_requests
áá¬ááºááœáŸááºážááá¯ááºááá¯áẠáááºááœá¬ážááŒáá¡á±á¬ááºá virtual machine á áá¬ááŸááááá²á·á¡áá»ááºáá²á· áááºááá¯ááºáá²á·ááááºá áá°áááºáž/áá¬á áá¬. áá®áá±á¬á· áá°á·ááᯠáááºážáááºážáá±á¬áẠáá°áá®ááŒáá¡á±á¬ááºá
- git fetch origin
ááᯠáá»áœááºá¯ááºááá¯á·ááẠá¡ááá¯ááºážá¡áááºáá»á¬ážááŒá¬áž ááŒá¬ážáá¬ážáá»ááºááᯠáááŸáááŒá®áž ááááºááᯠááááºážáááºážáá«á TXT ááá¯ááº-
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
áááºááŸá¬ $CI_COMMIT_SHA - áá±á¬ááºáá¯á¶ážáááááááºá hash á
ááá¯á·áá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠá¡áá¶ááá¯á¡áá¯á¶ážááŒá¯á ááá¯ááºáá»á¬ážá á¬áááºážááᯠááá¯ááºážááŒá¬ážá áááºááŒá¬á ááŒá¯áá«áááºá -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
áá±á«ááºážá ááºážááẠáá±á¬ááºážááá¯áá»ááºááᯠá á áºáá±ážáááºá¡ááœáẠááŒá®ážááŒáá·áºá á¯á¶áá±á¬ script ááẠá€áá²á·ááá¯á· ááŒá áºáááº-
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
áá»ááºáá¬á¡á¬ážáá¯á¶ážá scripts á¡á¬ážáá¯á¶ážááᯠáá¯ááºáá±á¬ááºááŒá®ážáá²á· áá±á¬ááºááŸá¬ log conversion ááá·áºááá¯á·áá²áá»ááºáá±á¬á·áááºá áá¶ááááºááᯠáá¯á¶ážáá«áááºá after_script ááŸáá·áº á¡áá¯á¶ážáááºááŸá¯ plog- converter:
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
ááá¯ááºáá²ááá¯á· á¡á¬ážáá¯á¶ážááᯠááá·áºááŒá®ážáááºááŸáá·áº ááá áºááŸáááºáá«á á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠáá¯ááºáá±á¬ááºáá«á. á¡á¬ážáá¯á¶ážááŸááºáááºááŒá±á¬ááºážáááááºá ááœá¬ážáá«á CI/CD -> ááá¯ááºááá¯ááºážáá»á¬áž -> ááŒá±áž. á¡áá¯á¶ážááœáẠá¡á±á¬ááºáá«ááá¯á·ááŸáááá·áºáá±á¬ virtual machine window áá áºáá¯ááœáá·áºáá¬áá«áááºá
ááœáŸ á¡áá¯ááºá¡á±á¬ááºááŒááºáá²á·áááºá - á¡á±á¬ááºááŒááºá á¡áá¬áᬠá¡áááºááŒá±áá«á
á±á ááᯠáááºáá¯ááºáá±á¬ááºáá²á·ááá·áºá¡áá¬ááᯠá
ááºážáááºááá¯ááºááŒá®ááŒá
áºáááºá
á¡áá¯ááºá¥ááá¬
á¡áá¯ááºá¥ááá¬áá áºáá¯á¡ááœááºá ááá¯ážááŸááºážáá±á¬ááá±á¬áá»ááºáá áºáá¯ááᯠáááºáá®ážááŒáá«á áá¯á· áá¬á áá¬) ááá¯ááºáá»á¬ážá áœá¬áá«áááºáá«áááºá áááºážáá±á¬ááºá á¡ááŒá¬ážáá¬áááœá²áá áºáá¯ááœáẠáá»áœááºá¯ááºááá¯á·ááẠááá¯ááºáá áºáá¯áááºážááᯠááŒá±á¬ááºážáá²ááŒá®áž áá±á«ááºážá ááºážááẠáá±á¬ááºážááá¯ááŸá¯ááᯠááŒá¯áá¯ááºáá«áááºá
ááá á¹á ááŸá áºáá¯ááᯠáá¯á¶ážáááºááŒáá·áºáá¡á±á¬ááº- ááŒá¯ááŒááºáá¬ážáá±á¬ááá¯ááºááœáẠá¡ááŸá¬ážá¡ááœááºážáá áºáá¯áá«ááŸáááá·áºá¡áá«ááŸáá·áº áááºážááẠáááŒá áºáá±á«áºááá·áºá¡áá«á ááááŠážá áœá¬ error áá áºáá¯ááŸáá·áºá¥ááá¬áá áºáá¯á
áá¬á
áá¬áá¬áááœá²ááœáẠááá¯ááºáá
áºáá¯ááŸáááẠááá¯ááŒáá«á
áá¯á· Program.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 ááá¯á¡áá¯á¶ážááŒá¯áá±áá«á á á áºáá±ážááẠstatic Analyzer ááá¯ááá·áºááœááºážááŒáá·áºáá«á ááá¯á·á¡ááŒááºá á€á¡áá¬áááºá¡áá±á¬áºáá±ážááá¯ážááŸááºážáá«áááºá
áááºá·áá²á·á¡á¬áá¯á¶á á°ážá áá¯ááºááŸá¯ááá¯áá»á±ážáá°ážáááºáá«áááºá
á€áá±á¬ááºážáá«ážááᯠá¡ááºá¹áááááºá
áá¬ážááŒá±á¬ ááááááºááŸáá·áº áá»áŸáá±ááá¯áá«áá áá¬áá¬ááŒááºááá·áºááº- Nikolay Mironov ááᯠá¡áá¯á¶ážááŒá¯áá«á
source: www.habr.com