ืืืืืื GitLab ืืฉืื ืืื ืืืืื? ืจืืฆื ืืฉืคืจ ืืช ืืืืืช ืงืื ืืืงืืจ ืฉืื? ืื ืืืขืชื ืืืงืื ืื ืืื. ืืืื ื ืกืคืจ ืืื ืืืฆื ืืืืืืจ ืืช ืื ืชื PVS-Studio C# ืืืืืงืช ืืงืฉืืช ืืืืื. ืฉืืืื ืื ืืฆื ืจืื ืฉื ืื ืงืจื ืืงืจืืื ืืื ื ืืืืื.
ืืื, ืืืฆืื ื ืืช PVS-Studio 7.08, ืฉืื ืขืฉืื ื ืืจืื ืืืจืื
- ืื ืชื C# ืขืืืจ ืืื ืืงืก ื-macOS;
- ืชืืกืฃ ืขืืืจ Rider;
- ืืฆื ืืืืงืช ืจืฉืืืช ืงืืฆืื ืืืฉื.
ืืฆื ืืืืงืช ืจืฉืืืช ืงืืฆืื
ืืขืืจ, ืขื ืื ืช ืืืืืง ืงืืฆืื ืืกืืืืื, ืืื ืฆืืจื ืืืขืืืจ .xml ืขื ืจืฉืืืช ืงืืฆืื ืื ืชื. ืืื ืืืืืื ืฉืื ืื ืืืื ื ืื, ืืืกืคื ื ืืช ืืืืืืช ืืืขืืืจ .txt, ืื ืฉืืืคื ืืช ืืืืื ืืคืฉืืืื ืืืื.
ืขื ืื ืช ืืืืืง ืงืืฆืื ืกืคืฆืืคืืื, ืขืืื ืืฆืืื ืืช ืืืื --ืงืืฆื ืืืงืืจ (-f) ืืืขืืจ .txt ืขื ืจืฉืืื ืฉื ืงืืฆืื. ืื ื ืจืื ืืื ืื:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
ืื ืืชื ืืขืื ืืื ืืืืืืจ commit checking ืื pull requests, ืืชื ืืืื ืื ืืขืฉืืช ืืืช ืืืืฆืขืืช ืืฆื ืื. ืืืืื ืืืื ืืงืืืช ืจืฉืืื ืฉื ืงืืฆืื ืื ืืชืื ืืชืืื ืืืืื ืืขืจืืืช ืืชื ืืฉืชืืฉ.
ืขืงืจืื ืืืืงืช ืืงืฉืช ืืืืื
ืืืืืช ืืขืืงืจืืช ืฉื ืืืืืงื ืืื ืืืืืื ืฉืืขืืืช ืฉืืืื ืขื ืืื ืืื ืชื ืืืืื ืืืืืื ืื ืืืคืื ืืชืื ืื ืขื ืฃ. ืื ืื ื ืื ืื ืจืืฆืื ืื ืชื ืืช ืื ืืคืจืืืงื ืืื ืคืขื. ืืชืจื ืืื, ืืขืช ืืืืื ืกื ืืคืื, ืืฉ ืื ื ืจืฉืืื ืฉื ืงืืฆืื ืฉืืฉืชื ื. ืืื, ืื ื ืืฆืืข ืืืืกืืฃ ืืืืงืช ืืงืฉืช ืืืืื.
ืื ื ืจืืืช ืืงืฉืช ืืืืื ืืคื ื ืืืฉืื ืื ืชื ืกืืื:
ืืืืืจ, ืื ืืฉืืืืืช ืฉืืื ืืกื ืืฃ ืฉืื ืืืื, ืืขืืืจ ืืกื ืืฃ ืืืืกืืจ. ืืืืืื ืฉืื ืืืื ื ืจืืฆืื ืืช ืื, ืื ื ืืืกืืคืื ื ืืชืื, ืืขืืฉืื ืืชืจืฉืื ื ืจืื ืื:
ืื ืื ื ืื ืชืืื ืฉืื ืืืื 2 ืืื ืืื ืฉืืืืืช, ืื ื ืืงืืืื ืืช ืืงืฉืช ืืืืืื, ืืืจืช ืื ื ืืืืื ืืืชื.
ืืื, ืื ืืชื ืืขืื ืืื ืื ืชื commits ื-pull requests ืขืืืจ C/C++, ืื ืืชื ืืืื ืืงืจืื ืขื ืื
GitLab
ืืคื ื ืฉืชืชืืื ืื ืชื ืืงืฉืืช ืืืืื, ืขืืื ืืืืจืฉื ืืืืขืืืช ืืช ืืคืจืืืงื ืฉืื. ืื ืืชื ืื ืืืืข ืืื ืืขืฉืืช ืืช ืื, ืื ืื ื ืืฆืืข
ืฉืื ืื. ืฉืืืช ืืงืืช ืืกืืืื ืืืชืืืจืช ืืืื ืืื ืืืช ืืืคืฉืจืืืช. ืืืืจื ืืื ืืืฆืื ืืช ืืฉืืืื ืืืืืจืช ืืกืืืื ืืืจืืฉื ืื ืืชืื ืืืืฉืงืช ืื ืชื. ืืืื ืืืงืจื ืฉืื ืืืื ืืืคืืืืื ืืืชืจ ืืืคืจืื ืืื ืฉืืื ืืื ืช ืืกืืืื (ืืืกืคืช ืืืืจืื, ืืชืงื ืช ืื ืชื) ืื ืืชืื: ืืืฉื, ืืื ืช ืชืืื ืืช Docker ืขื ืืกืืืื ืืืจืืฉื ืืฉืืืืฉ ืืื, ืื ืฉืืื ืืืจืช.
ืืื ืืืืื ืืื ืืืชืจ ืื ืืงืจื ืขืืฉืื, ืื ื ืืฆืืข ืืืกืชืื ืขื ืืืืืืจืื ืืืื:
ืืื ืชื ืืืจืฉ .NET Core SDK 3 ืืคืขืืื, ืืืื ืืคื ื ืืชืงื ืช ืื ืชื ืืฉ ืืืืกืืฃ ืืช ืืืืจื Microsoft ืฉืืื ืืืชืงื ื ืืชืืืช ืื ืืจืฉืช ืื ืชื. ืืืกืคืช ืืืืจื ืืืงืจืืกืืคื ืขืืืจ ืืคืฆืืช ืืื ืืงืก ืฉืื ืืช
ืืื ืืืชืงืื ืืช PVS-Studio ืืจื ืื ืื ืืืืืืืช, ืชืฆืืจื ืืืืกืืฃ ืื ืืช ืืืืจื ื-PVS-Studio. ืืืกืคืช ืืืืจืื ืขืืืจ ืืคืฆืืช ืฉืื ืืช ืืชืืืจืช ืืืชืจ ืคืืจืื ื
ืืื ืชื ืืืจืฉ ืืคืชื ืจืืฉืืื ืืื ืืคืขืื. ืืชื ืืืื ืืงืื ืจืืฉืืื ื ืืกืืื ื
ืฉืื ืื. ืฉืืื ืื ืฉืืืคื ืืคืขืืื ืืืชืืืจ (ื ืืชืื ืืงืฉืืช ืืืืื) ืืืืื ืจืืฉืืื Enterprise. ืืื, ืื ืืชื ืจืืฆื ืื ืกืืช ืืช ืืืคื ืืคืขืืื ืืื, ืื ืชืฉืื ืืฆืืื ืืฉืื "ืืืืขื" ืฉืืชื ืฆืจืื ืจืืฉืืื Enterprise.
ืื ืืชืจืืฉืช ืืงืฉืช ืืืืื, ืื ืื ืื ื ืฆืจืืืื ืจืง ืื ืชื ืืช ืจืฉืืืช ืืงืืฆืื ืฉืืฉืชื ื, ืืืจืช ืื ืื ื ืื ืชืืื ืืช ืื ืืงืืฆืื. ืืืืจ ืื ืืชืื, ืขืืื ื ืืืืืจ ืืช ืืืืื ืื ืืคืืจืื ืฉืื ื ืฆืจืืืื.
ืืขืช, ืืฉืืืืืจืืชื ืืขืืืื ืื ืื ืขืื ืื, ืืชื ืืืื ืืขืืืจ ืืืชืืืช ืชืกืจืื. ืืื ืืขืฉืืช ืืืช, ืขืืื ืืฉื ืืช ืืช ืืงืืืฅ .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
ืืืืืื ืฉืืืชืงื ื ืืืืคืขืื ืืืืืื ืืืชืจืืฉ ืืคื ื ืื ืฉืืจ ืืกืงืจืืคืืื, ืื ื ืืฉืชืืฉืื ืืชืืืืช ืืืืืืช ืืคื ื_ืกืงืจืืคื. ืืจืฉื ืื ืืืกืืืจ ืืขื ืืช ืืคืจืืื ื ืืื.
ืืชืืื ื ืื ืืืชืงื ืช ืื ืชื:
- 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.
ืืืืื ืฉื ืคืชื, ืืฆื ืืช ืืคืจืื ืืฉืชื ืื, ืืืฅ ืขื ืืืคืชืืจ ืืฆื ืืืื ืึฐืึทืจึฐืึดืื ืืืืืกืืฃ ืืฉืชื ืื. ืืชืืฆืื ืืืืจื ืืืืจืืืช ืื:
ืขืืฉืื ืืชื ืืืื ืืขืืืจ ืื ืืชืื. ืจืืฉืืช, ืืืื ื ืืกืืฃ ืกืงืจืืคื ืื ืืชืื ืืื. ืื ืืืื -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 - Hash ืฉื ื-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 ืืฉืืืืฉืืืช ืืืืจ-plog:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
ืฉืืจืืช
ืืื, ืื ืืชื ืจืืฆื ืืขืืื ืืฆืืจื ื ืืื ืขื ืืืืืช .json ืืืืคื ืืงืืื ืื-IDE, ืื ืื ื ืืฆืืข ืฉืื ื
ืืืขืื ื ืืืืช, ืื ื ืื .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 -> ืฆืื ืืจืืช -> ืจืืฆื. ืืืคืชื ืืืื ืืืื ื ืืืจืืืืืืช, ืฉืืกืืคื ืืืืจืื ืืืืืช ืืืืจืื ืืืืื:
ืจืื ืืืื ืืฆืืื - ืืฆืืื, ืืื ืืกืืจ. ืขืืฉืื ืืชื ืืืื ืืืืืง ืื ืขืฉืืช.
ืืืืืืืช ืืขืืืื
ืืืืืื ืืขืืืื, ืืืื ื ืืฆืืจ ืคืจืืืงื ืคืฉืื (ื ืื) ืฉืืืื ืืกืคืจ ืงืืฆืื. ืืืืจ ืืื, ืืกื ืืฃ ืืืจ ื ืฉื ื ืจืง ืงืืืฅ ืืื ืื ื ืกื ืืืฆืข ืืงืฉืช ืืืืื.
ืืื ื ืืื ืฉื ื ืืงืจืื: ืืืฉืจ ืืงืืืฅ ืฉืฉืื ื ืืืื ืฉืืืื ืืืชื ืื. ืจืืฉืืช, ืืืืื ืขื ืฉืืืื.
ื ื ืื ืฉืืฉ ืงืืืฅ ืืกื ืืฃ ืืืืกืืจ 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, ื ืกื ืืืืืืข ืื ืชื ืกืืื ืืื ืืืืืง. ืืชืจ ืขื ืื, ืื ื ืขืฉื ืืฆืืจื ืคืฉืืื ืืืื.
ืชืืื ืขื ืชืฉืืืช ืืื ืฉืื.
ืื ืืชื ืจืืฆื ืืฉืชืฃ ืืืืจ ืื ืขื ืงืื ืืืืจ ืื ืืืืช, ืื ื ืืฉืชืืฉ ืืงืืฉืืจ ืืชืจืืื: ื ืืงืืืื ืืืจืื ืื.
ืืงืืจ: www.habr.com