๋๋ ์ฌ์ด ์ฝ๋ฉ์ ํ๋ฃจ ์ ๋ ์ ํ๋ก์ ํธ์ ๋ํ ์๋ฆ๋ค์ด ๋ฐฐ์ง๋ฅผ ์ป๋ ๋ฐฉ๋ฒ
์๋ง๋ ์ด๋ ์์ ์์ ์ ์ด๋ ํ๋์ ์ ์ ํ๋ก์ ํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ ๊ฐ๋ฐ์๋ ์ํ, ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง, nuget์ ํจํค์ง ๋ฒ์ ์ด ์๋ ์๋ฆ๋ค์ด ๋ฐฐ์ง์ ๋ํ ๊ฐ๋ ค์์ฆ์ ๊ฐ์ง๊ณ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ๋ ค์์ฆ์ผ๋ก ์ธํด ์ด ๊ธฐ์ฌ๋ฅผ ์์ฑํ๊ฒ ๋์์ต๋๋ค. ๊ทธ๊ฒ์ ์์ฑํ๊ธฐ ์ํ ์ค๋น๋ก, ๋๋ ๋ด ํ๋ก์ ํธ ์ค ํ๋์์ ์ด ์๋ฆ๋ค์์ ์ป์์ต๋๋ค.
์ด ๋ฌธ์์์๋ GitLab์ .Net Core ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋ก์ ํธ์ ๋ํ ์ง์์ ์ธ ํตํฉ ๋ฐ ์ ๊ณต์ ๊ธฐ๋ณธ ์ค์ , GitLab Pages์ ๋ฌธ์ ๊ฒ์, ๋น๋๋ ํจํค์ง๋ฅผ Azure DevOps์ ํ๋ผ์ด๋น ํผ๋๋ก ํธ์ํ๋ ๊ณผ์ ์ ์๋ดํฉ๋๋ค.
VS Code๋ ํ์ฅ ๊ธฐ๋ฅ์ด ์๋ ๊ฐ๋ฐ ํ๊ฒฝ์ผ๋ก ์ฌ์ฉ๋์์ต๋๋ค.
๊ฐ๋จํ ์๊ฐ
CD-๋ฐฉ๊ธ ๋ฐ์์ ๋ ๋ชจ๋ ๊ฒ์ด ์ด๋ฏธ ํด๋ผ์ด์ธํธ์ ๋จ์ด์ก์ต๋๊น?
CI / CD ๋ ๋ฌด์์ด๋ฉฐ ์ ํ์ํ์ง Google์์ ์ฝ๊ฒ ์ฐพ์ ์ ์์ต๋๋ค. GitLab์์ ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ์ ๋ํ ์ ์ฒด ๋ฌธ์ ์ฐพ๊ธฐ
- ๊ฐ๋ฐ์๋ ์ ์ฅ์์ ์ปค๋ฐ์ ๋ณด๋ด๊ณ , ์ฌ์ดํธ๋ฅผ ํตํด ๋ณํฉ ์์ฒญ์ ๋ง๋ค๊ณ , ๋๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ช ์์ ๋๋ ์์์ ์ผ๋ก ํ์ดํ๋ผ์ธ์ ์์ํฉ๋๋ค.,
- ๋ชจ๋ ์์ ์ ๊ตฌ์ฑ์์ ์ ํ๋๋ฉฐ ํด๋น ์กฐ๊ฑด์ ์ฃผ์ด์ง ์ปจํ ์คํธ์์ ์์ํ ์ ์์ต๋๋ค.
- ์์ ์ ๋จ๊ณ์ ๋ฐ๋ผ ๊ตฌ์ฑ๋๋ฉฐ,
- ๋จ๊ณ๊ฐ ์ฐจ๋ก๋ก ์คํ๋ฉ๋๋ค. ํํ์ ์ด ๋จ๊ณ์ ๋ชจ๋ ์์ ์ด ์๋ฃ๋๊ณ
- ๋จ๊ณ๊ฐ ์คํจํ๋ฉด(์ฆ, ๋จ๊ณ์ ์์ ์ค ํ๋ ์ด์์ด ์คํจํ๋ฉด) ํ์ดํ๋ผ์ธ์ด ์ค์ง๋ฉ๋๋ค(๊ฑฐ์ ์ธ์ ๋),
- ๋ชจ๋ ๋จ๊ณ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ฉด ํ์ดํ๋ผ์ธ์ด ์ฑ๊ณตํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๋ค์์ ๊ฐ์ต๋๋ค:
- ํ์ดํ๋ผ์ธ - ์ฝ๋๋ฅผ ๋น๋, ํ ์คํธ, ํจํค์งํ๊ณ ์์ฑ๋ ๋น๋๋ฅผ ํด๋ผ์ฐ๋ ์๋น์ค์ ๋ฐฐํฌํ ์ ์๋ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ ์ผ๋ จ์ ์์
- ๋จ๊ณ (๋จ๊ณ) โ ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ ๋จ์, 1๊ฐ ์ด์์ ์์ ํฌํจ,
- ์ผ (์ผ)๋ ํ์ดํ๋ผ์ธ์ ์์ ๋จ์์ ๋๋ค. ์คํฌ๋ฆฝํธ(ํ์), ์์ ์กฐ๊ฑด, ์ํฐํฉํธ ๊ฒ์/์บ์ฑ ์ค์ ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
๋ฐ๋ผ์ CI/CD๋ฅผ ์ค์ ํ ๋ ์์ ์ ์ฝ๋ ๋ฐ ์ํฐํฉํธ๋ฅผ ๋น๋, ํ ์คํธ ๋ฐ ๊ฒ์ํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์์ ์ ๊ตฌํํ๋ ์ผ๋ จ์ ์์ ์ ๋ง๋๋ ๊ฒ์ผ๋ก ๊ท๊ฒฐ๋ฉ๋๋ค.
์์ํ๊ธฐ ์ ์: ์?
- ์ Gitlab์ธ๊ฐ?
ํซ ํ๋ก์ ํธ๋ฅผ ์ํ ๊ฐ์ธ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ผ ํ ๋ ๊นํ๋ธ์์ ๋์ ๋ฐ๊ณ ์์ฌ์ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฆฌํฌ์งํ ๋ฆฌ๋ ๋ฌด๋ฃ๊ฐ ๋์์ง๋ง ์ง๊ธ๊น์ง๋ GitHub๋ก ์ด๋ํ ์ด์ ๊ฐ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
- Azure DevOps ํ์ดํ๋ผ์ธ์ด ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ค์ ์ด ๊ธฐ๋ณธ์ด๊ธฐ ๋๋ฌธ์ ๋ช ๋ น์ค์ ๋ํ ์ง์๋ ํ์ํ์ง ์์ต๋๋ค. ์ธ๋ถ git ๊ณต๊ธ์์์ ํตํฉ - ๋ช ๋ฒ์ ํด๋ฆญ๋ง์ผ๋ก SSH ํค๋ฅผ ๊ฐ์ ธ์ ์ปค๋ฐ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ๋ณด๋ผ ์ ์์ต๋๋ค. ํ์ดํ๋ผ์ธ์ ํ ํ๋ฆฟ์ด ์๋๋๋ผ๋ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
์์ ์์น: ๊ฐ์ง๊ณ ์๋ ๊ฒ๊ณผ ์ํ๋ ๊ฒ
์ฐ๋ฆฌ๋ :
- GitLab์ ์ ์ฅ์.
์ฐ๋ฆฌ๋ ์ํฉ๋๋ค:
- ๊ฐ ๋ณํฉ ์์ฒญ์ ๋ํ ์๋ ์กฐ๋ฆฝ ๋ฐ ํ ์คํธ
- ์ปค๋ฐ ๋ฉ์์ง์ ํน์ ์ค์ด ์๋ ๊ฒฝ์ฐ ๊ฐ ๋ณํฉ ์์ฒญ์ ๋ํ ํจํค์ง๋ฅผ ๋น๋ํ๊ณ ๋ง์คํฐ๋ก ํธ์ํฉ๋๋ค.
- ๋น๋๋ ํจํค์ง๋ฅผ Azure DevOps์ ๋น๊ณต๊ฐ ํผ๋๋ก ์ ์ก,
- GitLab ํ์ด์ง์์ ๋ฌธ์ ๋ฐ ๊ฒ์์ ์กฐ๋ฆฝ,
- ๋ฐฐ์ง!11
์ค๋ช ๋ ์๊ตฌ ์ฌํญ์ ์ ๊ธฐ์ ์ผ๋ก ๋ค์ ํ์ดํ๋ผ์ธ ๋ชจ๋ธ์ ์ํฉ๋๋ค.
- 1๋จ๊ณ - ์กฐ๋ฆฝ
- ์ฝ๋๋ฅผ ์์งํ๊ณ ์ถ๋ ฅ ํ์ผ์ ์ํฐํฉํธ๋ก ๊ฒ์ํฉ๋๋ค.
- 2๋จ๊ณ - ํ
์คํธ
- ๋น๋ ๋จ๊ณ์์ ์ํฐํฉํธ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ํ ์คํธ๋ฅผ ์คํํ๊ณ , ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ฐ์ดํฐ๋ฅผ ์์งํฉ๋๋ค.
- 3๋จ๊ณ - ์ ์ถ
- ์์ 1 - nuget ํจํค์ง๋ฅผ ๋น๋ํ๊ณ Azure DevOps๋ก ๋ณด๋ ๋๋ค.
- ์์ 2 - ์์ค ์ฝ๋์ xmldoc์์ ์ฌ์ดํธ๋ฅผ ์์งํ๊ณ GitLab ํ์ด์ง์ ๊ฒ์ํฉ๋๋ค.
์์ํ์!
๊ตฌ์ฑ ์์ง
๊ณ์ ์ค๋น
-
์์ ๊ณ์ ๋ง๋ค๊ธฐ
Microsoft Azure -
์ฐ๋ฆฌ๋์ ์ ๋ฌํ๋ค.
์ ์ ๋ฐ๋ธ์ต์ค -
์ฐ๋ฆฌ๋ ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ๋ง๋ญ๋๋ค
- ์ด๋ฆ - ์๋ฌด๊ฑฐ๋
- ๊ฐ์์ฑ - ๋ชจ๋
-
๋ง๋ค๊ธฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํ๋ก์ ํธ๊ฐ ์์ฑ๋๊ณ ํด๋น ํ์ด์ง๋ก ๋ฆฌ๋๋ ์ ๋ฉ๋๋ค. ์ด ํ์ด์ง์์ ํ๋ก์ ํธ ์ค์ ์ผ๋ก ์ด๋ํ์ฌ ๋ถํ์ํ ๊ธฐ๋ฅ์ ๋นํ์ฑํํ ์ ์์ต๋๋ค(์ผ์ชฝ ๋ชฉ๋ก์ ํ๋จ ๋งํฌ -> ๊ฐ์ -> Azure DevOps Services ๋ธ๋ก).
-
Atrifacts๋ก ์ด๋ํ์ฌ ํผ๋ ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
- ์์ค ์ด๋ฆ์ ์ ๋ ฅํ์ธ์.
- ๊ฐ์์ฑ ์ ํ
- ์ฒดํฌ ํด์ ๊ณตํต ๊ณต๊ฐ ์์ค์ ํจํค์ง ํฌํจ, ์์ค๊ฐ ๋คํ ๋๊ฒ ํด๋ก ์ผ๋ก ๋ฐ๋์ง ์๋๋ก
-
ํผ๋์ ์ฐ๊ฒฐ์ ํด๋ฆญํ๊ณ , Visual Studio๋ฅผ ์ ํํ๊ณ , Machine Setup ๋ธ๋ก์์ ์์ค๋ฅผ ๋ณต์ฌํฉ๋๋ค.
-
๊ณ์ ์ค์ ์ผ๋ก ์ด๋ํ์ฌ ๊ฐ์ธ ์ก์ธ์ค ํ ํฐ์ ์ ํํ์ญ์์ค.
-
์ ์ก์ธ์ค ํ ํฐ ๋ง๋ค๊ธฐ
- ์ด๋ฆ - ์์
- ์กฐ์ง - ํ์ฌ
- ์ต๋ 1๋ ๋์ ์ ํจ
- ๋ฒ์ - ํจํค์ง/์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ
-
์์ฑ๋ ํ ํฐ ๋ณต์ฌ - ๋ชจ๋ฌ ์ฐฝ์ด ๋ซํ ํ์๋ ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-
GitLab์ ๋ฆฌํฌ์งํ ๋ฆฌ ์ค์ ์ผ๋ก ์ด๋ํ์ฌ CI/CD ์ค์ ์ ์ ํํฉ๋๋ค.
-
Variables ๋ธ๋ก์ ํ์ฅํ๊ณ ์ ๋ธ๋ก์ ์ถ๊ฐํ์ญ์์ค.
- ์ด๋ฆ - ๊ณต๋ฐฑ ์์(๋ช ๋ น ์ ธ์์ ์ฌ์ฉ ๊ฐ๋ฅ)
- ๊ฐ - ๋จ๋ฝ 9์ ์ก์ธ์ค ํ ํฐ
- ๋ง์คํฌ ๋ณ์ ์ ํ
์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ ๊ตฌ์ฑ์ด ์๋ฃ๋ฉ๋๋ค.
๊ตฌ์ฑ ํ๋ ์์ํฌ ์ค๋น
๊ธฐ๋ณธ์ ์ผ๋ก GitLab์ CI/CD ๊ตฌ์ฑ์ ํ์ผ์ ์ฌ์ฉํฉ๋๋ค. .gitlab-ci.yml
์ ์ฅ์์ ๋ฃจํธ์์. ์ ์ฅ์ ์ค์ ์์ ์ด ํ์ผ์ ๋ํ ์์์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ ์ ์์ง๋ง ์ด ๊ฒฝ์ฐ์๋ ํ์ํ์ง ์์ต๋๋ค.
ํ์ฅ์์ ๋ณผ ์ ์๋ฏ์ด ํ์ผ์๋ ๋ค์ ํ์์ ๊ตฌ์ฑ์ด ํฌํจ๋์ด ์์ต๋๋ค. YAML
. ์ค๋ช
์์๋ ๊ตฌ์ฑ์ ์ต์์ ์์ค๊ณผ ๊ฐ ์ค์ฒฉ ์์ค์ ํฌํจํ ์ ์๋ ํค๊ฐ ์์ธํ ์ค๋ช
๋์ด ์์ต๋๋ค.
๋จผ์ ์์
์ ์ํํ ๊ตฌ์ฑ ํ์ผ์ ๋์ปค ์ด๋ฏธ์ง์ ๋ํ ๋งํฌ๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋
image: mcr.microsoft.com/dotnet/core/sdk:3.1
์ด์ ํ์ดํ๋ผ์ธ์ด Microsoft ์ด๋ฏธ์ง ๋ฆฌํฌ์งํ ๋ฆฌ์์ ์์๋๋ฉด ์ง์ ๋ ์ด๋ฏธ์ง๊ฐ ๋ค์ด๋ก๋๋๊ณ ์ฌ๊ธฐ์์ ๊ตฌ์ฑ์ ๋ชจ๋ ์์ ์ด ์คํ๋ฉ๋๋ค.
๋ค์ ๋จ๊ณ๋ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค ๋จ๊ณ'์์ค. ๊ธฐ๋ณธ์ ์ผ๋ก GitLab์ 5๋จ๊ณ๋ฅผ ์ ์ํฉ๋๋ค.
.pre
- ๋ชจ๋ ๋จ๊ณ๊น์ง ์ํ,.post
- ๋ชจ๋ ๋จ๊ณ๊ฐ ๋๋ ํ ์ํ,build
- ๋จผ์ ํ.pre
๋จ๊ณ,test
- ๋ ๋ฒ์งธ ๋จ๊ณ,deploy
- ์ธ ๋ฒ์งธ ๋จ๊ณ.
๊ทธ๋ฌ๋ ๋ช ์์ ์ผ๋ก ์ ์ธํ๋ ๊ฒ์ ๋ฐฉํดํ๋ ๊ฒ์ ์์ต๋๋ค. ๋จ๊ณ๊ฐ ๋์ด๋๋ ์์๋ ์ํ๋๋ ์์์ ์ํฅ์ ์ค๋๋ค. ์์ ์ฑ์ ์ํด ๊ตฌ์ฑ์ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
stages:
- build
- test
- deploy
๋๋ฒ๊น
์ ๊ฒฝ์ฐ ์์
์ด ์คํ๋๋ ํ๊ฒฝ์ ๋ํ ์ ๋ณด๋ฅผ ์ป๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ค์์ ์ฌ์ฉํ์ฌ ๊ฐ ์์
์ ์ ์คํ๋ ์ ์ญ ๋ช
๋ น ์งํฉ์ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. before_script
:
before_script:
- $PSVersionTable.PSVersion
- dotnet --version
- nuget help | select-string Version
์ปค๋ฐ์ด ์ ์ก๋ ๋ ํ์ดํ๋ผ์ธ์ด ์์๋๋๋ก ์์ ์ ํ๋ ์ด์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ง๊ธ์ ์์ฐ์ ์ํด ๋น ์์ ์ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
dummy job:
script:
- echo ok
์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์์ํ๊ณ ๋ชจ๋ ๊ฒ์ด ์ ์์ด๋ผ๋ ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ์ปค๋ฐํ๊ณ ํธ์ํ๊ณ ์ฌ์ดํธ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค ... ๊ทธ๋ฆฌ๊ณ ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค- bash: .PSVersion: command not found
. ๋ญ์ผ?
๋ชจ๋ ๊ฒ์ด ๋
ผ๋ฆฌ์ ์
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌ๋(์์
์คํฌ๋ฆฝํธ ์คํ์ ๋ด๋นํ๊ณ GitLab์์ ์ ๊ณต)๋ ๋ค์์ ์ฌ์ฉํฉ๋๋ค. bash
๋ช
๋ น์ ์คํํฉ๋๋ค. ์คํ ์ค์ธ ํ์ดํ๋ผ์ธ ์คํ๊ธฐ์ ์์ด์ผ ํ๋ ํ๊ทธ๋ฅผ ์์
์ค๋ช
์ ๋ช
์์ ์ผ๋ก ์ง์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
dummy job on windows:
script:
- echo ok
tags:
- windows
์์ฒญ๋! ์ด์ ํ์ดํ๋ผ์ธ์ด ์คํ ์ค์ ๋๋ค.
ํ์๋ ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ ์ธ์ฌํ ๋
์๋ ์์
์ด ๋จ๊ณ์์ ์๋ฃ๋์์์ ์ ์ ์์ต๋๋ค. test
, ์ฐ๋ฆฌ๋ ๋ฌด๋๋ฅผ ์ง์ ํ์ง ์์์ง๋ง. ๋น์ ์ด ์ง์ํ ์ ์๋ฏ์ด test
๊ธฐ๋ณธ ๋จ๊ณ์
๋๋ค.
์์์ ์ค๋ช ํ ๋ชจ๋ ์์ ์ ์ถ๊ฐํ์ฌ ๊ตฌ์ฑ ๊ณจ๊ฒฉ์ ๊ณ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
build job:
script:
- echo "building..."
tags:
- windows
stage: build
test and cover job:
script:
- echo "running tests and coverage analysis..."
tags:
- windows
stage: test
pack and deploy job:
script:
- echo "packing and pushing to nuget..."
tags:
- windows
stage: deploy
pages:
script:
- echo "creating docs..."
tags:
- windows
stage: deploy
ํน๋ณํ ๊ธฐ๋ฅ์ ์ด์ง๋ ์์ง๋ง ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฌ๋ฐ๋ฅธ ํ์ดํ๋ผ์ธ์ด ์์ต๋๋ค.
ํธ๋ฆฌ๊ฑฐ ์ค์
์ด๋ค ์์ ์๋ ํธ๋ฆฌ๊ฑฐ ํํฐ๊ฐ ์ง์ ๋์ง ์์๊ธฐ ๋๋ฌธ์ ํ์ดํ๋ผ์ธ์ ์ถฉ๋ถํ ์ปค๋ฐ์ด ์ ์ฅ์์ ํธ์๋ ๋๋ง๋ค ์คํ๋ฉ๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ํ๋ ๋์์ด ์๋๋ฏ๋ก ์์ ์ ๋ํ ํธ๋ฆฌ๊ฑฐ ํํฐ๋ฅผ ์ค์ ํฉ๋๋ค.
ํํฐ๋ ๋ ๊ฐ์ง ํ์์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. only/except
ํธ๋ฆฌ๊ฑฐ๋ณ๋ก ํํฐ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค(merge_request
, ์๋ฅผ ๋ค์ด - ํ ์์ฒญ์ด ์์ฑ๋ ๋๋ง๋ค ์คํ๋ ์์
์ ์ค์ ํ๊ณ ์ปค๋ฐ์ด ๋ณํฉ ์์ฒญ์ ์์ค์ธ ๋ธ๋์น๋ก ์ ์ก๋ ๋๋ง๋ค) ๋ฐ ๋ธ๋์น ์ด๋ฆ(์ ๊ท ํํ์ ์ฌ์ฉ ํฌํจ)์ ์ค์ ํฉ๋๋ค. rules
์ผ๋ จ์ ์กฐ๊ฑด์ ์ฌ์ฉ์ ์ง์ ํ๊ณ ์ ํ์ ์ผ๋ก ์ด์ ์์
์ ์ฑ๊ณต์ ๋ฐ๋ผ ์์
์คํ ์กฐ๊ฑด์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค(when
GitLab CI/CD์์
๋ณํฉ ์์ฒญ์ ๋ํ ์ด์ ๋ธ๋ฆฌ ๋ฐ ํ ์คํธ, Azure DevOps์ ๋ํ ํจํค์ง ๋ฐ ์ ์ก - ๋ณํฉ ์์ฒญ ๋ฐ ๋ง์คํฐ์ ๋ํ ํธ์, ๋ฌธ์ ์์ฑ - ๋ง์คํฐ์ ๋ํ ํธ์์ ๋ํ ์ผ๋ จ์ ์๊ตฌ ์ฌํญ์ ์๊ธฐํด ๋ด ์๋ค.
๋จผ์ ๋ณํฉ ์์ฒญ ์์๋ง ์คํ๋๋ ๊ท์น์ ์ถ๊ฐํ์ฌ ์ฝ๋ ๋น๋ ์์ ์ ์ค์ ํด ๋ณด๊ฒ ์ต๋๋ค.
build job:
# snip
only:
- merge_request
์ด์ ๋ณํฉ ์์ฒญ์์ ์คํํ๊ณ ๋ง์คํฐ์ ์ปค๋ฐ์ ์ถ๊ฐํ๋๋ก ํจํค์ง ์์ ์ ์ค์ ํด ๋ณด๊ฒ ์ต๋๋ค.
pack and deploy job:
# snip
only:
- merge_request
- master
๋ณด์๋ค์ํผ ๋ชจ๋ ๊ฒ์ด ๊ฐ๋จํ๊ณ ๊ฐ๋จํฉ๋๋ค.
๋ณํฉ ์์ฒญ์ด ํน์ ๋์ ๋๋ ์์ค ๋ธ๋์น๋ก ์์ฑ๋ ๊ฒฝ์ฐ์๋ง ์์ ์ด ์คํ๋๋๋ก ์ค์ ํ ์๋ ์์ต๋๋ค.
rules:
- if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"
์กฐ๊ฑด ํ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. rules
๊ท์น๊ณผ ์๋ฆฝํ ์ ์์ only/except
.
์ํฐํฉํธ ์ ์ฅ ๊ตฌ์ฑ
์์
์ค build job
ํ์ ์์
์์ ์ฌ์ฌ์ฉํ ์ ์๋ ๋น๋ ์ํฐํฉํธ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๋ค์ ์์
์์ ์ ์ฅํ๊ณ ์ฌ์ฌ์ฉํด์ผ ํ๋ ํ์ผ์ธ ์์
๊ตฌ์ฑ์ ๋ํ ๊ฒฝ๋ก๋ฅผ ํค์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. artifacts
build job:
# snip
artifacts:
paths:
- path/to/build/artifacts
- another/path
- MyCoolLib.*/bin/Release/*
๊ฒฝ๋ก๋ ์์ผ๋์นด๋๋ฅผ ์ง์ํ๋ฏ๋ก ํ์คํ ๋ ์ฝ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
์์ ์ด ์ํฐํฉํธ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ๊ฐ ํ์ ์์ ์ ํด๋น ์ํฐํฉํธ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์๋ ์์ ์์ ์์ง๋ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฃจํธ์ ๊ด๋ จ๋ ๋์ผํ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๋ฐฐ์น๋ฉ๋๋ค. ์ํฐํฉํธ๋ ์ฌ์ดํธ์์ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.
์ด์ ๊ตฌ์ฑ ํ๋ ์์ํฌ๊ฐ ์ค๋น(๋ฐ ํ ์คํธ)๋์์ผ๋ฏ๋ก ์์ ์ ๋ํ ์คํฌ๋ฆฝํธ๋ฅผ ์ค์ ๋ก ์์ฑํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํฉ๋๋ค
์๋ง๋ ์์ฃผ ๋จผ ์๋ ์๋ ๋ช ๋ น์ค์์ ํ๋ก์ ํธ(.net ํ๋ก์ ํธ ํฌํจ)๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ด ๊ณ ํต์ค๋ฌ์ ์ ๊ฒ์ ๋๋ค. ์ด์ 3๊ฐ ํ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๋น๋, ํ ์คํธ ๋ฐ ๊ฒ์ํ ์ ์์ต๋๋ค.
dotnet build
dotnet test
dotnet pack
๋น์ฐํ ๋ช ๋ น์ ๋ค์ ๋ณต์กํ๊ฒ ๋ง๋๋ ์ฝ๊ฐ์ ๋์์ค๊ฐ ์์ต๋๋ค.
- ์ฐ๋ฆฌ๋ ๋๋ฒ๊ทธ ๋น๋๊ฐ ์๋ ๋ฆด๋ฆฌ์ค ๋น๋๋ฅผ ์ํ๋ฏ๋ก ๊ฐ ๋ช
๋ น์ ์ถ๊ฐํฉ๋๋ค.
-c Release
- ํ
์คํธํ ๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ฐ์ดํฐ๋ฅผ ์์งํด์ผ ํ๋ฏ๋ก ํ
์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ปค๋ฒ๋ฆฌ์ง ๋ถ์๊ธฐ๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค.
- ๋ชจ๋ ํ
์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจํค์ง ์ถ๊ฐ
coverlet.msbuild
:dotnet add package coverlet.msbuild
ํ๋ก์ ํธ ํด๋์์ - ํ
์คํธ ์คํ ๋ช
๋ น์ ์ถ๊ฐ
/p:CollectCoverage=true
- ์ ์ฉ ๋ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ํ ์คํธ ์์ ๊ตฌ์ฑ์ ํค๋ฅผ ์ถ๊ฐํฉ๋๋ค(์๋ ์ฐธ์กฐ).
- ๋ชจ๋ ํ
์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจํค์ง ์ถ๊ฐ
- ์ฝ๋๋ฅผ nuget ํจํค์ง๋ก ์์ถํ ๋ ํจํค์ง์ ์ถ๋ ฅ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ค์ ํฉ๋๋ค.
-o .
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ฐ์ดํฐ ์์ง
ํ ์คํธ๋ฅผ ์คํํ ํ Coverlet์ ์คํ ํต๊ณ๋ฅผ ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค.
Calculating coverage result...
Generating report 'C:Usersxxxsourcereposmy-projectmyProject.testscoverage.json'
+-------------+--------+--------+--------+
| Module | Line | Branch | Method |
+-------------+--------+--------+--------+
| project 1 | 83,24% | 66,66% | 92,1% |
+-------------+--------+--------+--------+
| project 2 | 87,5% | 50% | 100% |
+-------------+--------+--------+--------+
| project 3 | 100% | 83,33% | 100% |
+-------------+--------+--------+--------+
+---------+--------+--------+--------+
| | Line | Branch | Method |
+---------+--------+--------+--------+
| Total | 84,27% | 65,76% | 92,94% |
+---------+--------+--------+--------+
| Average | 90,24% | 66,66% | 97,36% |
+---------+--------+--------+--------+
GitLab์ ์ฌ์ฉํ๋ฉด ์ ๊ท์์ ์ง์ ํ์ฌ ํต๊ณ๋ฅผ ์ป์ ์ ์์ผ๋ฉฐ ๋ฐฐ์ง ํํ๋ก ์ป์ ์ ์์ต๋๋ค. ์ ๊ท์์ ์์
์ค์ ์์ ํค๋ก ์ง์ ๋ฉ๋๋ค. coverage
; ์์๋ ์บก์ฒ ๊ทธ๋ฃน์ด ํฌํจ๋์ด์ผ ํ๋ฉฐ ํด๋น ๊ฐ์ ๋ฐฐ์ง์ ์ ๋ฌ๋ฉ๋๋ค.
test and cover job:
# snip
coverage: /|s*Totals*|s*(d+[,.]d+%)/
์ฌ๊ธฐ์์ ์ฐ๋ฆฌ๋ ์ด ํ์ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ์๋ ํ์ ์์ ํต๊ณ๋ฅผ ์ป์ต๋๋ค.
ํจํค์ง ๋ฐ ์ค๋ช ์ ๊ฒ์
๋ ์์ ๋ชจ๋ ํ์ดํ๋ผ์ธ์ ๋ง์ง๋ง ๋จ๊ณ์ ๋ํด ์์ ๋์ด ์์ต๋๋ค. ์กฐ๋ฆฝ ๋ฐ ํ ์คํธ๊ฐ ํต๊ณผ๋์์ผ๋ฏ๋ก ๊ฐ๋ฐ์ ์ ์ธ๊ณ์ ๊ณต์ ํ ์ ์์ต๋๋ค.
๋จผ์ ํจํค์ง ์์ค์ ๊ฒ์ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
-
ํ๋ก์ ํธ์ ๋๊ฒ ๊ตฌ์ฑ ํ์ผ์ด ์๋ ๊ฒฝ์ฐ(
nuget.config
), ์ ํญ๋ชฉ์ ๋ง๋ญ๋๋ค.dotnet new nugetconfig
๋ฌด์์ ์ํด: ์ด๋ฏธ์ง์ ์ ์ญ(์ฌ์ฉ์ ๋ฐ ์์คํ ) ๊ตฌ์ฑ์ ๋ํ ์ฐ๊ธฐ ๊ถํ์ด ์์ ์ ์์ต๋๋ค. ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ์ง ์์ผ๋ ค๋ฉด ์ ๋ก์ปฌ ๊ตฌ์ฑ์ ๋ง๋ค๊ณ ์์ ํ๋ฉด ๋ฉ๋๋ค.
- ๋ก์ปฌ ๊ตฌ์ฑ์ ์ ํจํค์ง ์์ค๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
nuget sources add -name <name> -source <url> -username <organization> -password <gitlab variable> -configfile nuget.config -StorePasswordInClearText
name
- ์ค์ํ์ง ์์ ๋ก์ปฌ ์์ค ์ด๋ฆurl
- "๊ณ์ ์ค๋น" ๋จ๊ณ์ ์์ค URL, 6ํ์ด์งorganization
- Azure DevOps์ ์กฐ์ง ์ด๋ฆgitlab variable
- GitLab์ ์ถ๊ฐ๋ ์ก์ธ์ค ํ ํฐ์ด ์๋ ๋ณ์์ ์ด๋ฆ("๊ณ์ ์ค๋น", 11ํ์ด์ง). ๋น์ฐํ ํ์์ผ๋ก$variableName
-StorePasswordInClearText
- ์ก์ธ์ค ๊ฑฐ๋ถ ์ค๋ฅ๋ฅผ ์ฐํํ๋ ํดํน(์ด ๋ ์ดํฌ๋ฅผ ๋ฐ์ ๊ฑด ๋ด๊ฐ ์ฒ์์ด ์๋์ผ )- ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ ์ถ๊ฐํ๋ ๊ฒ์ด ์ ์ฉํ ์ ์์ต๋๋ค.
-verbosity detailed
- ํจํค์ง๋ฅผ ์์ค๋ก ๋ณด๋ด๊ธฐ:
nuget push -source <name> -skipduplicate -apikey <key> *.nupkg
- ํ์ฌ ๋๋ ํ ๋ฆฌ์์ ๋ชจ๋ ํจํค์ง๋ฅผ ๋ณด๋ด๋ฏ๋ก
*.nupkg
. name
- ์์ ๋จ๊ณ์์.key
- ๋ชจ๋ ๋ผ์ธ. Azure DevOps์ ํผ๋์ ์ฐ๊ฒฐ ์ฐฝ์์ ์์ ๋ ํญ์ ๋ผ์ธ์ ๋๋ค.az
.-skipduplicate
- ์ด ํค ์์ด ์ด๋ฏธ ์กด์ฌํ๋ ํจํค์ง๋ฅผ ๋ณด๋ด๋ ค๊ณ ํ๋ฉด ์์ค์์ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.409 Conflict
; ํค๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ก์ ๊ฑด๋๋๋๋ค.
- ํ์ฌ ๋๋ ํ ๋ฆฌ์์ ๋ชจ๋ ํจํค์ง๋ฅผ ๋ณด๋ด๋ฏ๋ก
์ด์ ๋ฌธ์ ์์ฑ์ ์ค์ ํด ๋ณด๊ฒ ์ต๋๋ค.
- ๋จผ์ ์ ์ฅ์์ ๋ง์คํฐ ๋ถ๊ธฐ์์ docfx ํ๋ก์ ํธ๋ฅผ ์ด๊ธฐํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๋ฃจํธ์์ ๋ช
๋ น์ ์คํํ์ญ์์ค.
docfx init
๋ฌธ์ ์์ฑ์ ์ํ ์ฃผ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ํ์์ผ๋ก ์ค์ ํฉ๋๋ค. ์ต์ ํ๋ก์ ํธ ์ค์ ์ ๋ํ ์์ธํ ์ค๋ช์ฌ๊ธฐ์ .- ๊ตฌ์ฑํ ๋ ์ถ๋ ฅ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
..public
- GitLab์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฃจํธ์ ์๋ ๊ณต์ฉ ํด๋์ ์ฝํ ์ธ ๋ฅผ ํ์ด์ง์ ์์ค๋ก ์ฌ์ฉํฉ๋๋ค. ์๋ํ๋ฉด ํ๋ก์ ํธ๋ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ค์ฒฉ๋ ํด๋์ ์์นํฉ๋๋ค. ๊ฒฝ๋ก์ ์์ ์์ค์ ์ถ๋ ฅ์ ์ถ๊ฐํฉ๋๋ค.
- ๊ตฌ์ฑํ ๋ ์ถ๋ ฅ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋ณ๊ฒฝ ์ฌํญ์ GitLab์ ํธ์ํ๊ฒ ์ต๋๋ค.
- ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ์ ์์
์ถ๊ฐ
pages
(GitLab ํ์ด์ง์ ์ฌ์ดํธ ๊ฒ์ ์์ ์ ๋ํ ์์ฝ์ด):- ์คํฌ๋ฆฝํธ:
nuget install docfx.console -version 2.51.0
- docfx ์ค์น ํจํค์ง ์ค์น ๊ฒฝ๋ก๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธํ๊ธฐ ์ํด ๋ฒ์ ์ด ์ง์ ๋ฉ๋๋ค..docfx.console.2.51.0toolsdocfx.exe .docfx_projectdocfx.json
- ๋ฌธ์ ์์ง
- ๋ ธ๋ ์ํฐํฉํธ:
- ์คํฌ๋ฆฝํธ:
pages:
# snip
artifacts:
paths:
- public
docfx์ ๋ํ ์์ ์ ์ฌ๋ด
์ด์ ์๋ ํ๋ก์ ํธ๋ฅผ ์ค์ ํ ๋ ์ค๋ช
์์ ์ฝ๋ ์์ค๋ฅผ ์๋ฃจ์
ํ์ผ๋ก ์ง์ ํ์ต๋๋ค. ๊ฐ์ฅ ํฐ ๋จ์ ์ ํ
์คํธ ํ๋ก์ ํธ์ ๋ํ ๋ฌธ์๋ ์์ฑ๋๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ ์ด ๊ฐ์ ๋
ธ๋์ ์ค์ ํ ์ ์์ต๋๋ค. metadata.src
:
{
"metadata": [
{
"src": [
{
"src": "../",
"files": [
"**/*.csproj"
],
"exclude":[
"*.tests*/**"
]
}
],
// --- snip ---
},
// --- snip ---
],
// --- snip ---
}
metadata.src.src: "../"
- ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ๋ ๋ฒจ ์๋ก ์ด๋ํฉ๋๋ค.docfx.json
, ์๋ํ๋ฉด ํจํด์์๋ ๋๋ ํ ๋ฆฌ ํธ๋ฆฌ ๊ฒ์์ด ์๋ํ์ง ์์ต๋๋ค.metadata.src.files: ["**/*.csproj"]
- ๊ธ๋ก๋ฒ ํจํด, ๋ชจ๋ ๋๋ ํฐ๋ฆฌ์์ ๋ชจ๋ C# ํ๋ก์ ํธ๋ฅผ ์์งํฉ๋๋ค.metadata.src.exclude: ["*.tests*/**"]
- ์ ์ญ ํจํด, ๋ค์์ด ์๋ ํด๋์์ ๋ชจ๋ ํญ๋ชฉ ์ ์ธ.tests
์ด๋ฆ์ผ๋ก
์๊ณ
์ด๋ฌํ ๊ฐ๋จํ ๊ตฌ์ฑ์ ์ฝ๋๊ฐ ์์ฑ๋๊ณ ํ ์คํธ๊ฐ ํต๊ณผํ๋์ง ํ์ธํ๊ณ , ์ ํจํค์ง๋ฅผ ์์ฑํ๊ณ , ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ๊ณ , ์๋ฆ๋ต๊ฒ ๋์ ์ฆ๊ฒ๊ฒ ํ ์ ์๋ ์ปคํผ ๋ช ์๊ณผ XNUMX๋ถ์ด๋ฉด ๋ง๋ค ์ ์์ต๋๋ค ๊ฐ ๋ณํฉ ์์ฒญ๊ณผ ํจ๊ป ํ๋ก์ ํธ์ README์ ์๋ ๋ฐฐ์ง๋ฅผ ๋ง์คํฐ์ ๋ณด๋ ๋๋ค.
์ต์ข .gitlab-ci.yml
image: mcr.microsoft.com/dotnet/core/sdk:3.1
before_script:
- $PSVersionTable.PSVersion
- dotnet --version
- nuget help | select-string Version
stages:
- build
- test
- deploy
build job:
stage: build
script:
- dotnet build -c Release
tags:
- windows
only:
- merge_requests
- master
artifacts:
paths:
- your/path/to/binaries
test and cover job:
stage: test
tags:
- windows
script:
- dotnet test -c Release /p:CollectCoverage=true
coverage: /|s*Totals*|s*(d+[,.]d+%)/
only:
- merge_requests
- master
pack and deploy job:
stage: deploy
tags:
- windows
script:
- dotnet pack -c Release -o .
- dotnet new nugetconfig
- nuget sources add -name feedName -source https://pkgs.dev.azure.com/your-organization/_packaging/your-feed/nuget/v3/index.json -username your-organization -password $nugetFeedToken -configfile nuget.config -StorePasswordInClearText
- nuget push -source feedName -skipduplicate -apikey az *.nupkg
only:
- master
pages:
tags:
- windows
stage: deploy
script:
- nuget install docfx.console -version 2.51.0
- $env:path = "$env:path;$($(get-location).Path)"
- .docfx.console.2.51.0toolsdocfx.exe .docfxdocfx.json
artifacts:
paths:
- public
only:
- master
๋ฐฐ์ง์ ๋ํด ๋งํ๋ฉด
๊ทธ๋ค๋ก ์ธํด ๊ฒฐ๊ตญ ๋ชจ๋ ๊ฒ์ด ์์๋์์ต๋๋ค!
ํ์ดํ๋ผ์ธ ์ํ ๋ฐ ์ฝ๋ ์ ์ฉ ๋ฒ์๊ฐ ์๋ ๋ฐฐ์ง๋ Gtntral ํ์ดํ๋ผ์ธ ๋ธ๋ก์ CI/CD ์ค์ ์ ์๋ GitLab์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ๋ซํผ์ ๋ฌธ์์ ๋ํ ๋งํฌ๊ฐ ์๋ ๋ฐฐ์ง๋ฅผ ๋ง๋ค์์ต๋๋ค.
![ะัะธะผะตั ั Shields.io](https://img.shields.io/badge/custom-badge-blue)
Azure DevOps Artifacts๋ฅผ ์ฌ์ฉํ๋ฉด ์ต์ ๋ฒ์ ์ ํจํค์ง์ ๋ํ ๋ฐฐ์ง๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด Azure DevOps ์ฌ์ดํธ์ ์์ค์์ ์ ํํ ํจํค์ง์ ๋ํ ๋ฐฐ์ง ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํ๊ณ ๋งํฌ๋ค์ด ๋งํฌ์ ์ ๋ณต์ฌํด์ผ ํฉ๋๋ค.
์๋ฆ๋ค์์ ๋ํ๋ค
๊ณตํต ๊ตฌ์ฑ ์กฐ๊ฐ ๊ฐ์กฐ ํ์
๊ตฌ์ฑ์ ์์ฑํ๊ณ ์ค๋ช ์๋ฅผ ๊ฒ์ํ๋ ๋์ YAML์ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ธ ํ๋๊ทธ๋จผํธ ์ฌ์ฌ์ฉ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
์์
์ค์ ์์ ๋ณผ ์ ์๋ฏ์ด ๋ชจ๋ ํ๊ทธ๊ฐ ํ์ํฉ๋๋ค. windows
๋ฌ๋์์ ๋ณํฉ ์์ฒญ์ด ๋ง์คํฐ/์์ฑ์ ์ ์ก๋ ๋ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค(๋ฌธ์ ์ ์ธ). ์ฌ์ฌ์ฉํ ํ๋๊ทธ๋จผํธ์ ๋ค์์ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
.common_tags: &common_tags
tags:
- windows
.common_only: &common_only
only:
- merge_requests
- master
์ด์ ์์ ์ค๋ช ์์ ์ด์ ์ ์ ์ธ๋ ์กฐ๊ฐ์ ์ฝ์ ํ ์ ์์ต๋๋ค.
build job:
<<: *common_tags
<<: *common_only
ํ๋๊ทธ๋จผํธ ์ด๋ฆ์ ์์ ์ผ๋ก ํด์๋์ง ์๋๋ก ์ ์ผ๋ก ์์ํด์ผ ํฉ๋๋ค.
ํจํค์ง ๋ฒ์ ๊ด๋ฆฌ
ํจํค์ง๋ฅผ ์์ฑํ ๋ ์ปดํ์ผ๋ฌ๋ ๋ช ๋ น์ค ์ค์์น๋ฅผ ํ์ธํ๊ณ ์ค์์น๊ฐ ์๋ ๊ฒฝ์ฐ ํ๋ก์ ํธ ํ์ผ์ ํ์ธํฉ๋๋ค. ๋ฒ์ ๋ ธ๋๋ฅผ ์ฐพ์ผ๋ฉด ํด๋น ๊ฐ์ ๋น๋ ์ค์ธ ํจํค์ง์ ๋ฒ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ์ ๋ฒ์ ์ผ๋ก ํจํค์ง๋ฅผ ๋น๋ํ๋ ค๋ฉด ํ๋ก์ ํธ ํ์ผ์์ ํจํค์ง๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ๋ช ๋ น์ค ์ธ์๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค.
์์๋ฆฌ์คํธ๋ฅผ ํ๋ ๋ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ๋ฒ์ ์ ๋ณด์กฐ ์ซ์ ๋ ๊ฐ๋ ํจํค์ง์ ์ฐ๋์ ๋น๋ ๋ ์ง๋ก ๋๊ณ ์ํํ ๋ฒ์ ์ ์ถ๊ฐํฉ๋๋ค. ๋ฌผ๋ก ์ด ๋ฐ์ดํฐ๋ฅผ ํ๋ก์ ํธ ํ์ผ์ ์ถ๊ฐํ๊ณ ๊ฐ ์ ์ถ ์ ์ ํ์ธํ ์ ์์ง๋ง ํ์ดํ๋ผ์ธ์์ ์ํํ์ฌ ์ปจํ ์คํธ์์ ํจํค์ง ๋ฒ์ ์ ์์งํ๊ณ ๋ช ๋ น์ค ์ธ์๋ฅผ ํตํด ์ ๋ฌํ ์๋ ์์ต๋๋ค.
์ปค๋ฐ ๋ฉ์์ง์ ๋ค์๊ณผ ๊ฐ์ ์ค์ด ํฌํจ๋์ด ์๋ค๋ฉด ๋์ํฉ์๋ค. release (v./ver./version) <version number> (rev./revision <revision>)?
๊ทธ๋ฐ ๋ค์ ์ด ์ค์์ ํจํค์ง ๋ฒ์ ์ ๊ฐ์ ธ์ ํ์ฌ ๋ ์ง๋ก ๋ณด์ํ๊ณ ๋ช
๋ น์ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค. dotnet pack
. ์ค์ด ์์ผ๋ฉด ๋จ์ํ ํจํค์ง๋ฅผ ์์งํ์ง ์์ต๋๋ค.
๋ค์ ์คํฌ๋ฆฝํธ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
# ัะตะณัะปััะฝะพะต ะฒััะฐะถะตะฝะธะต ะดะปั ะฟะพะธัะบะฐ ัััะพะบะธ ั ะฒะตััะธะตะน
$rx = "releases+(v.?|ver.?|version)s*(?<maj>d+)(?<min>.d+)?(?<rel>.d+)?s*((rev.?|revision)?s+(?<rev>[a-zA-Z0-9-_]+))?"
# ะธัะตะผ ัััะพะบั ะฒ ัะพะพะฑัะตะฝะธะธ ะบะพะผะผะธัะฐ, ะฟะตัะตะดะฐะฒะฐะตะผะพะผ ะฒ ะพะดะฝะพะน ะธะท ะฟัะตะดะพะฟัะตะดะตะปัะตะผัั
GitLab'ะพะผ ะฟะตัะตะผะตะฝะฝัั
$found = $env:CI_COMMIT_MESSAGE -match $rx
# ัะพะฒะฟะฐะดะตะฝะธะน ะฝะตั - ะฒัั
ะพะดะธะผ
if (!$found) { Write-Output "no release info found, aborting"; exit }
# ะธะทะฒะปะตะบะฐะตะผ ะผะฐะถะพัะฝัั ะธ ะผะธะฝะพัะฝัั ะฒะตััะธะธ
$maj = $matches['maj']
$min = $matches['min']
# ะตัะปะธ ัััะพะบะฐ ัะพะดะตัะถะธั ะฝะพะผะตั ัะตะปะธะทะฐ - ะธัะฟะพะปัะทัะตะผ ะตะณะพ, ะธะฝะฐัะต - ัะตะบััะธะน ะณะพะด
if ($matches.ContainsKey('rel')) { $rel = $matches['rel'] } else { $rel = ".$(get-date -format "yyyy")" }
# ะฒ ะบะฐัะตััะฒะต ะฝะพะผะตัะฐ ัะฑะพัะบะธ - ัะตะบััะธะต ะผะตััั ะธ ะดะตะฝั
$bld = $(get-date -format "MMdd")
# ะตัะปะธ ะตััั ะดะฐะฝะฝัะต ะฟะพ ะฟัะตัะตะปะธะทะฝะพะน ะฒะตััะธะธ - ะฒะบะปััะฐะตะผ ะธั
ะฒ ะฒะตััะธั
if ($matches.ContainsKey('rev')) { $rev = "-$($matches['rev'])" } else { $rev = '' }
# ัะพะฑะธัะฐะตะผ ะตะดะธะฝัั ัััะพะบั ะฒะตััะธะธ
$version = "$maj$min$rel.$bld$rev"
# ัะพะฑะธัะฐะตะผ ะฟะฐะบะตัั
dotnet pack -c Release -o . /p:Version=$version
์์
์ ์คํฌ๋ฆฝํธ ์ถ๊ฐ pack and deploy job
์ปค๋ฐ ๋ฉ์์ง์ ์ฃผ์ด์ง ๋ฌธ์์ด์ด ์๋ ๊ฒฝ์ฐ ํจํค์ง ์ด์
๋ธ๋ฆฌ๋ฅผ ์๊ฒฉํ๊ฒ ๊ด์ฐฐํฉ๋๋ค.
์ ์ฒด๋ก
์ฝ XNUMX๋ถ ๋๋ XNUMX์๊ฐ ๋์ ๊ตฌ์ฑ์ ์์ฑํ๊ณ , ๋ก์ปฌ powershell์์ ๋๋ฒ๊น ํ๊ณ , ์๋ง๋ ๋ช ๋ฒ์ ์คํ ์คํจ๋ฅผ ๊ฒช์ ํ ์ผ์์ ์ธ ์์ ์ ์๋ํํ๊ธฐ ์ํ ๊ฐ๋จํ ๊ตฌ์ฑ์ ์ป์์ต๋๋ค.
๋ฌผ๋ก GitLab CI/CD๋ ์ด ๊ฐ์ด๋๋ฅผ ์ฝ์ ํ ๋ณด์ด๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๊ด๋ฒ์ํ๊ณ ๋ค๋ฉด์ ์
๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์๋์ผ๋ก ๊ฐ์ง, ๋น๋, ํ ์คํธ, ๋ฐฐํฌ ๋ฐ ๋ชจ๋ํฐ๋ง
์ด์ ๊ณํ์ Pulumi๋ฅผ ์ฌ์ฉํ๊ณ ๋ค์ ๋ฌธ์์์ ๋ค๋ฃฐ ๋์ ํ๊ฒฝ์ ์๋์ผ๋ก ๊ฒฐ์ ํ์ฌ Azure์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ธฐ ์ํ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋๋ค.
์ถ์ฒ : habr.com