GitLab์ ์ข์ํ๊ณ ๋ฒ๊ทธ๋ฅผ ์ซ์ดํ์๋์? ์์ค ์ฝ๋์ ํ์ง์ ํฅ์์ํค๊ณ ์ถ์ผ์ญ๋๊น? ๊ทธ๋ ๋ค๋ฉด ๋น์ ์ ์ฌ๋ฐ๋ฅธ ์ฅ์์ ์์ต๋๋ค. ์ค๋์ PVS-Studio C# ๋ถ์๊ธฐ๋ฅผ ๊ตฌ์ฑํ์ฌ ๋ณํฉ ์์ฒญ์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ชจ๋๋ค ์ ๋์ฝ ๊ธฐ๋ถ์ ๊ฐ๊ณ ํ๋ณตํ ๋
์๋ฅผ ํ์ธ์.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ฐ๋ฆฌ๋ PVS-Studio 7.08์ ์ถ์ํ๋๋ฐ, ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ๋ง์ ์ผ์ ํ์ต๋๋ค.
- Linux ๋ฐ macOS์ฉ C# ๋ถ์๊ธฐ;
- ๋ผ์ด๋์ฉ ํ๋ฌ๊ทธ์ธ;
- ์๋ก์ด ํ์ผ ๋ชฉ๋ก ํ์ธ ๋ชจ๋.
ํ์ผ ๋ชฉ๋ก ํ์ธ ๋ชจ๋
์ด์ ์๋ ํน์ ํ์ผ์ ํ์ธํ๋ ค๋ฉด ํ์ผ ๋ชฉ๋ก์ด ํฌํจ๋ .xml์ ๋ถ์๊ธฐ์ ์ ๋ฌํด์ผ ํ์ต๋๋ค. ํ์ง๋ง ์ด๋ ๊ทธ๋ค์ง ํธ๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์ .txt๋ฅผ ์ ์กํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ์ํ์ ๋งค์ฐ ๋จ์ํ๊ฒ ๋ง๋ญ๋๋ค.
ํน์ ํ์ผ์ ํ์ธํ๋ ค๋ฉด ํ๋๊ทธ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. --sourceํ์ผ (-f) ํ์ผ ๋ชฉ๋ก๊ณผ ํจ๊ป .txt๋ฅผ ์ ์กํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
์ปค๋ฐ ํ์ธ ๋๋ ํ ์์ฒญ ์ค์ ์ ๊ด์ฌ์ด ์๋ ๊ฒฝ์ฐ ์ด ๋ชจ๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์์ ์ ์ํํ ์๋ ์์ต๋๋ค. ์ฐจ์ด์ ์ ๋ถ์ํ ํ์ผ ๋ชฉ๋ก์ ์ป๋ ๋ฐ ์์ผ๋ฉฐ ์ฌ์ฉ ์ค์ธ ์์คํ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
๋ณํฉ ์์ฒญ ํ์ธ ์์น
๊ฒ์ฌ์ ์ฃผ์ ๋ณธ์ง์ ๋ณํฉ ์ค์ ๋ถ์๊ธฐ๊ฐ ๊ฐ์งํ ๋ฌธ์ ๊ฐ ๋ค์ ๋จ๊ณ์ ์ํ์ง ์๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค. ์์ฌ ๋๋ญ๊ฐ์ง. ๋ํ ์ฐ๋ฆฌ๋ ๋งค๋ฒ ์ ์ฒด ํ๋ก์ ํธ๋ฅผ ๋ถ์ํ๊ณ ์ถ์ง ์์ต๋๋ค. ๋ํ ๋ธ๋์น๋ฅผ ๋ณํฉํ๋ฉด ๋ณ๊ฒฝ๋ ํ์ผ ๋ชฉ๋ก์ด ํ์๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ณํฉ ์์ฒญ ํ์ธ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ ์ ๋ถ์๊ธฐ๋ฅผ ๊ตฌํํ๊ธฐ ์ ์ ๋ณํฉ ์์ฒญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฆ, ๋ธ๋์น์ ์๋ ๋ชจ๋ ์ค๋ฅ๊ฐ ๋ณ๊ฒฝ, ๋ง์คํฐ ๋ธ๋์น๋ก ์ด๋ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ถ์์ ์ถ๊ฐํฉ๋๋ค. ์ด์ ๋ค์ด์ด๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ถ์ํ๋ ๋ณํ2 ์ค๋ฅ๊ฐ ์์ผ๋ฉด ๋ณํฉ ์์ฒญ์ ์๋ฝํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฑฐ๋ถํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ C/C++์ ๋ํ ์ปค๋ฐ ๋ฐ ํ ์์ฒญ ๋ถ์์ ๊ด์ฌ์ด ์๋ค๋ฉด ์ด์ ๋ํด ์ฝ์ด๋ณผ ์ ์์ต๋๋ค.
GitLab
๋ณํฉ ์์ฒญ ๋ถ์์ ์์ํ๊ธฐ ์ ์ ํ๋ก์ ํธ๋ฅผ ๋ฑ๋กํ๊ณ ์
๋ก๋ํด์ผ ํฉ๋๋ค. ์ด๋ป๊ฒ ํด์ผํ ์ง ๋ชจ๋ฅด์ ๋ค๋ฉด ์ถ์ฒํด๋๋ ค์
์ฃผ์. ์๋์ ์ค๋ช ๋ ํ๊ฒฝ ์ค์ ๋ฐฉ๋ฒ์ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ ์ค ํ๋์ ๋๋ค. ๋ถ์์ ํ์ํ ํ๊ฒฝ์ ์ค์ ํ๊ณ ๋ถ์๊ธฐ๋ฅผ ์์ํ๋ ๋จ๊ณ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ๋ชฉํ์ ๋๋ค. ์๋ง๋ ๊ทํ์ ๊ฒฝ์ฐ ํ๊ฒฝ ์ค๋น(๋ฆฌํฌ์งํ ๋ฆฌ ์ถ๊ฐ, ๋ถ์๊ธฐ ์ค์น) ๋จ๊ณ์ ๋ถ์ ๋จ๊ณ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๋ ์ต์ ์ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ์ํ ํ๊ฒฝ์ผ๋ก Docker ์ด๋ฏธ์ง๋ฅผ ์ค๋นํ๊ณ ์ฌ์ฉํ๊ฑฐ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ง๊ธ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ์ง ๋ ์ ์ดํดํ๋ ค๋ฉด ๋ค์ ๋ค์ด์ด๊ทธ๋จ์ ์ดํด๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ถ์๊ธฐ๊ฐ ์๋ํ๋ ค๋ฉด .NET Core SDK 3์ด ํ์ํ๋ฏ๋ก ๋ถ์๊ธฐ๋ฅผ ์ค์นํ๊ธฐ ์ ์ ๋ถ์๊ธฐ์ ํ์ํ ์ข
์์ฑ์ ์ค์นํ Microsoft ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๋ค์ํ Linux ๋ฐฐํฌํ์ ์ํ 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
์ค์น์ ํ์ฑํ๋ ๋ค๋ฅธ ๋ชจ๋ ์คํฌ๋ฆฝํธ๋ณด๋ค ๋จผ์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ฏ๋ก ํน์ ๋ผ๋ฒจ์ ์ฌ์ฉํฉ๋๋ค. 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 ์ ์ฅ์ ๋ฐ ๋ถ์๊ธฐ ์ถ๊ฐ:
- 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 โ ๋ง์ง๋ง ์ปค๋ฐ์ ํด์์ ๋๋ค.
๋ค์์ผ๋ก ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ๋ชฉ๋ก ๋ถ์์ ์์ํฉ๋๋ค. -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 ์ ํธ๋ฆฌํฐ ํ๋ก๊ทธ ๋ณํ๊ธฐ:
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 -> ํ์ดํ ๋ผ์ธ -> ๋ฌ๋ฆฌ๋. ๊ฐ์ ๋จธ์ ์ฐฝ์ด ์ด๋ฆฌ๊ณ ๋ง์ง๋ง์๋ ๋ค์์ด ํ์๋ฉ๋๋ค.
๋ดค๋ค ์์
์ฑ๊ณต - ์ฑ๊ณต, ๋ชจ๋ ๊ฒ์ด ๊ด์ฐฎ์ต๋๋ค. ์ด์ ์ํํ ์์
์ ํ
์คํธํ ์ ์์ต๋๋ค.
์์ ์
์์ ์ ์๋ฅผ ๋ค์ด ๊ฐ๋จํ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค( ์์ฌ)์๋ ์ฌ๋ฌ ํ์ผ์ด ํฌํจ๋ฉ๋๋ค. ๊ทธ ํ ๋ค๋ฅธ ๋ธ๋์น์์๋ ํ์ผ ํ๋๋ง ๋ณ๊ฒฝํ๊ณ ๋ณํฉ ์์ฒญ์ ์๋ํฉ๋๋ค.
์์ ๋ ํ์ผ์ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ ์ค๋ฅ๊ฐ ์๋ ์์ ๋๋ค.
๋ง์คํฐ ๋ธ๋์น์ ํ์ผ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ํ๋ก๊ทธ๋จ.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๋ฅผ ์ฌ์ฉํ์ญ์์ค.
์ถ์ฒ : habr.com