(๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

๋˜๋Š” ์‰ฌ์šด ์ฝ”๋”ฉ์˜ ํ•˜๋ฃจ ์ €๋…์— ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์•„๋ฆ„๋‹ค์šด ๋ฐฐ์ง€๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•

์•„๋งˆ๋„ ์–ด๋Š ์‹œ์ ์—์„œ ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์• ์™„ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๋Š” ์ƒํƒœ, ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€, nuget์˜ ํŒจํ‚ค์ง€ ๋ฒ„์ „์ด ์žˆ๋Š” ์•„๋ฆ„๋‹ค์šด ๋ฐฐ์ง€์— ๋Œ€ํ•œ ๊ฐ€๋ ค์›€์ฆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๊ฐ€๋ ค์›€์ฆ์œผ๋กœ ์ธํ•ด ์ด ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„๋กœ, ๋‚˜๋Š” ๋‚ด ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜์—์„œ ์ด ์•„๋ฆ„๋‹ค์›€์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

(๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

์ด ๋ฌธ์„œ์—์„œ๋Š” GitLab์˜ .Net Core ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ง€์†์ ์ธ ํ†ตํ•ฉ ๋ฐ ์ œ๊ณต์˜ ๊ธฐ๋ณธ ์„ค์ •, GitLab Pages์— ๋ฌธ์„œ ๊ฒŒ์‹œ, ๋นŒ๋“œ๋œ ํŒจํ‚ค์ง€๋ฅผ Azure DevOps์˜ ํ”„๋ผ์ด๋น— ํ”ผ๋“œ๋กœ ํ‘ธ์‹œํ•˜๋Š” ๊ณผ์ •์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

VS Code๋Š” ํ™•์žฅ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. GitLab ์›Œํฌํ”Œ๋กœ์šฐ (๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ง์ ‘ ์„ค์ • ํŒŒ์ผ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด).

๊ฐ„๋‹จํ•œ ์†Œ๊ฐœ

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 ํŽ˜์ด์ง€์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜์ž!

๊ตฌ์„ฑ ์ˆ˜์ง‘

๊ณ„์ • ์ค€๋น„

  1. ์—์„œ ๊ณ„์ • ๋งŒ๋“ค๊ธฐ Microsoft Azure

  2. ์šฐ๋ฆฌ๋Š”์— ์ „๋‹ฌํ•œ๋‹ค. ์• ์ € ๋ฐ๋ธŒ์˜ต์Šค

  3. ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค

    1. ์ด๋ฆ„ - ์•„๋ฌด๊ฑฐ๋‚˜
    2. ๊ฐ€์‹œ์„ฑ - ๋ชจ๋‘
      (๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

  4. ๋งŒ๋“ค๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—์„œ ํ”„๋กœ์ ํŠธ ์„ค์ •์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์™ผ์ชฝ ๋ชฉ๋ก์˜ ํ•˜๋‹จ ๋งํฌ -> ๊ฐœ์š” -> Azure DevOps Services ๋ธ”๋ก).
    (๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

  5. Atrifacts๋กœ ์ด๋™ํ•˜์—ฌ ํ”ผ๋“œ ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    1. ์†Œ์Šค ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.
    2. ๊ฐ€์‹œ์„ฑ ์„ ํƒ
    3. ์ฒดํฌ ํ•ด์ œ ๊ณตํ†ต ๊ณต๊ฐœ ์†Œ์Šค์˜ ํŒจํ‚ค์ง€ ํฌํ•จ, ์†Œ์Šค๊ฐ€ ๋คํ”„ ๋„ˆ๊ฒŸ ํด๋ก ์œผ๋กœ ๋ฐ”๋€Œ์ง€ ์•Š๋„๋ก
      (๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

  6. ํ”ผ๋“œ์— ์—ฐ๊ฒฐ์„ ํด๋ฆญํ•˜๊ณ , Visual Studio๋ฅผ ์„ ํƒํ•˜๊ณ , Machine Setup ๋ธ”๋ก์—์„œ ์†Œ์Šค๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
    (๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

  7. ๊ณ„์ • ์„ค์ •์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๊ฐœ์ธ ์•ก์„ธ์Šค ํ† ํฐ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.
    (๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

  8. ์ƒˆ ์•ก์„ธ์Šค ํ† ํฐ ๋งŒ๋“ค๊ธฐ

    1. ์ด๋ฆ„ - ์ž„์˜
    2. ์กฐ์ง - ํ˜„์žฌ
    3. ์ตœ๋Œ€ 1๋…„ ๋™์•ˆ ์œ ํšจ
    4. ๋ฒ”์œ„ - ํŒจํ‚ค์ง•/์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ
      (๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

  9. ์ƒ์„ฑ๋œ ํ† ํฐ ๋ณต์‚ฌ - ๋ชจ๋‹ฌ ์ฐฝ์ด ๋‹ซํžŒ ํ›„์—๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  10. GitLab์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์„ค์ •์œผ๋กœ ์ด๋™ํ•˜์—ฌ CI/CD ์„ค์ •์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    (๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

  11. Variables ๋ธ”๋ก์„ ํ™•์žฅํ•˜๊ณ  ์ƒˆ ๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

    1. ์ด๋ฆ„ - ๊ณต๋ฐฑ ์—†์Œ(๋ช…๋ น ์…ธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
    2. ๊ฐ’ - ๋‹จ๋ฝ 9์˜ ์•ก์„ธ์Šค ํ† ํฐ
    3. ๋งˆ์Šคํฌ ๋ณ€์ˆ˜ ์„ ํƒ
      (๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์ „ ๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ํ”„๋ ˆ์ž„์›Œํฌ ์ค€๋น„

๊ธฐ๋ณธ์ ์œผ๋กœ GitLab์˜ CI/CD ๊ตฌ์„ฑ์€ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. .gitlab-ci.yml ์ €์žฅ์†Œ์˜ ๋ฃจํŠธ์—์„œ. ์ €์žฅ์†Œ ์„ค์ •์—์„œ ์ด ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž„์˜์˜ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ™•์žฅ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ํŒŒ์ผ์—๋Š” ๋‹ค์Œ ํ˜•์‹์˜ ๊ตฌ์„ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. YAML. ์„ค๋ช…์„œ์—๋Š” ๊ตฌ์„ฑ์˜ ์ตœ์ƒ์œ„ ์ˆ˜์ค€๊ณผ ๊ฐ ์ค‘์ฒฉ ์ˆ˜์ค€์— ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค๊ฐ€ ์ž์„ธํžˆ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๋„์ปค ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” Docker Hub์˜ .Net Core ์ด๋ฏธ์ง€ ํŽ˜์ด์ง€. ์— GitHub์˜ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ๋Œ€ํ•ด ์„ ํƒํ•  ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๊ฐ€์ด๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. .Net Core 3.1์ด ์žˆ๋Š” ์ด๋ฏธ์ง€๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋นŒ๋“œํ•˜๊ธฐ์— ์ ํ•ฉํ•˜๋ฏ€๋กœ ๊ตฌ์„ฑ์— ์ฒซ ๋ฒˆ์งธ ์ค„์„ ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

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

๋‹น์—ฐํžˆ ๋ช…๋ น์„ ๋‹ค์†Œ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์•ฝ๊ฐ„์˜ ๋‰˜์•™์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์šฐ๋ฆฌ๋Š” ๋””๋ฒ„๊ทธ ๋นŒ๋“œ๊ฐ€ ์•„๋‹Œ ๋ฆด๋ฆฌ์Šค ๋นŒ๋“œ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ๊ฐ ๋ช…๋ น์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. -c Release
  2. ํ…Œ์ŠคํŠธํ•  ๋•Œ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ปค๋ฒ„๋ฆฌ์ง€ ๋ถ„์„๊ธฐ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    1. ๋ชจ๋“  ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํŒจํ‚ค์ง€ ์ถ”๊ฐ€ coverlet.msbuild: dotnet add package coverlet.msbuild ํ”„๋กœ์ ํŠธ ํด๋”์—์„œ
    2. ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋ช…๋ น์— ์ถ”๊ฐ€ /p:CollectCoverage=true
    3. ์ ์šฉ ๋ฒ”์œ„ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ž‘์—… ๊ตฌ์„ฑ์— ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(์•„๋ž˜ ์ฐธ์กฐ).
  3. ์ฝ”๋“œ๋ฅผ 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+%)/

์—ฌ๊ธฐ์—์„œ ์šฐ๋ฆฌ๋Š” ์ด ํšŒ์„  ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ์žˆ๋Š” ํšŒ์„ ์—์„œ ํ†ต๊ณ„๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ๋ฐ ์„ค๋ช…์„œ ๊ฒŒ์‹œ

๋‘ ์ž‘์—… ๋ชจ๋‘ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์— ๋Œ€ํ•ด ์˜ˆ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๋ฆฝ ๋ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์„ ์ „ ์„ธ๊ณ„์™€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ํŒจํ‚ค์ง€ ์†Œ์Šค์— ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

  1. ํ”„๋กœ์ ํŠธ์— ๋„ˆ๊ฒŸ ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์—†๋Š” ๊ฒฝ์šฐ(nuget.config), ์ƒˆ ํ•ญ๋ชฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. dotnet new nugetconfig

    ๋ฌด์—‡์„ ์œ„ํ•ด: ์ด๋ฏธ์ง€์— ์ „์—ญ(์‚ฌ์šฉ์ž ๋ฐ ์‹œ์Šคํ…œ) ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ƒˆ ๋กœ์ปฌ ๊ตฌ์„ฑ์„ ๋งŒ๋“ค๊ณ  ์ž‘์—…ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  2. ๋กœ์ปฌ ๊ตฌ์„ฑ์— ์ƒˆ ํŒจํ‚ค์ง€ ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. nuget sources add -name <name> -source <url> -username <organization> -password <gitlab variable> -configfile nuget.config -StorePasswordInClearText
    1. name - ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋กœ์ปฌ ์†Œ์Šค ์ด๋ฆ„
    2. url - "๊ณ„์ • ์ค€๋น„" ๋‹จ๊ณ„์˜ ์†Œ์Šค URL, 6ํŽ˜์ด์ง€
    3. organization - Azure DevOps์˜ ์กฐ์ง ์ด๋ฆ„
    4. gitlab variable - GitLab์— ์ถ”๊ฐ€๋œ ์•ก์„ธ์Šค ํ† ํฐ์ด ์žˆ๋Š” ๋ณ€์ˆ˜์˜ ์ด๋ฆ„("๊ณ„์ • ์ค€๋น„", 11ํŽ˜์ด์ง€). ๋‹น์—ฐํžˆ ํ˜•์‹์œผ๋กœ $variableName
    5. -StorePasswordInClearText - ์•ก์„ธ์Šค ๊ฑฐ๋ถ€ ์˜ค๋ฅ˜๋ฅผ ์šฐํšŒํ•˜๋Š” ํ•ดํ‚น(์ด ๋ ˆ์ดํฌ๋ฅผ ๋ฐŸ์€ ๊ฑด ๋‚ด๊ฐ€ ์ฒ˜์Œ์ด ์•„๋‹ˆ์•ผ)
    6. ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -verbosity detailed
  3. ํŒจํ‚ค์ง€๋ฅผ ์†Œ์Šค๋กœ ๋ณด๋‚ด๊ธฐ: nuget push -source <name> -skipduplicate -apikey <key> *.nupkg
    1. ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ๋ณด๋‚ด๋ฏ€๋กœ *.nupkg.
    2. name - ์œ„์˜ ๋‹จ๊ณ„์—์„œ.
    3. key - ๋ชจ๋“  ๋ผ์ธ. Azure DevOps์˜ ํ”ผ๋“œ์— ์—ฐ๊ฒฐ ์ฐฝ์—์„œ ์˜ˆ์ œ๋Š” ํ•ญ์ƒ ๋ผ์ธ์ž…๋‹ˆ๋‹ค. az.
    4. -skipduplicate - ์ด ํ‚ค ์—†์ด ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋ณด๋‚ด๋ ค๊ณ  ํ•˜๋ฉด ์†Œ์Šค์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 409 Conflict; ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ „์†ก์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

์ด์ œ ๋ฌธ์„œ ์ž‘์„ฑ์„ ์„ค์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ๋จผ์ € ์ €์žฅ์†Œ์˜ ๋งˆ์Šคํ„ฐ ๋ถ„๊ธฐ์—์„œ docfx ํ”„๋กœ์ ํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋ฃจํŠธ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค. docfx init ๋ฌธ์„œ ์ž‘์„ฑ์„ ์œ„ํ•œ ์ฃผ์š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋Œ€ํ™”์‹์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œ ํ”„๋กœ์ ํŠธ ์„ค์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช… ์—ฌ๊ธฐ์—.
    1. ๊ตฌ์„ฑํ•  ๋•Œ ์ถœ๋ ฅ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ..public - GitLab์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฃจํŠธ์— ์žˆ๋Š” ๊ณต์šฉ ํด๋”์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํŽ˜์ด์ง€์˜ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ค‘์ฒฉ๋œ ํด๋”์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ๋กœ์˜ ์ƒ์œ„ ์ˆ˜์ค€์— ์ถœ๋ ฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ GitLab์— ํ‘ธ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  3. ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ์— ์ž‘์—… ์ถ”๊ฐ€ pages (GitLab ํŽ˜์ด์ง€์˜ ์‚ฌ์ดํŠธ ๊ฒŒ์‹œ ์ž‘์—…์— ๋Œ€ํ•œ ์˜ˆ์•ฝ์–ด):
    1. ์Šคํฌ๋ฆฝํŠธ:
      1. nuget install docfx.console -version 2.51.0 - docfx ์„ค์น˜ ํŒจํ‚ค์ง€ ์„ค์น˜ ๊ฒฝ๋กœ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„์ „์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค.
      2. .docfx.console.2.51.0toolsdocfx.exe .docfx_projectdocfx.json - ๋ฌธ์„œ ์ˆ˜์ง‘
    2. ๋…ธ๋“œ ์•„ํ‹ฐํŒฉํŠธ:

pages:
  # snip
  artifacts:
    paths:
      - public

docfx์— ๋Œ€ํ•œ ์„œ์ •์  ์—ฌ๋‹ด

์ด์ „์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•  ๋•Œ ์„ค๋ช…์„œ์˜ ์ฝ”๋“œ ์†Œ์Šค๋ฅผ ์†”๋ฃจ์…˜ ํŒŒ์ผ๋กœ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋„ ์ƒ์„ฑ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด ๊ฐ’์„ ๋…ธ๋“œ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. metadata.src:

{
  "metadata": [
    {
      "src": [
        {
          "src": "../",
          "files": [
            "**/*.csproj"
          ],
          "exclude":[
            "*.tests*/**"
          ]
        }
      ],
      // --- snip ---
    },
    // --- snip ---
  ],
  // --- snip ---
}

  1. metadata.src.src: "../" - ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ ๋ ˆ๋ฒจ ์œ„๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. docfx.json, ์™œ๋ƒํ•˜๋ฉด ํŒจํ„ด์—์„œ๋Š” ๋””๋ ‰ํ† ๋ฆฌ ํŠธ๋ฆฌ ๊ฒ€์ƒ‰์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. metadata.src.files: ["**/*.csproj"] - ๊ธ€๋กœ๋ฒŒ ํŒจํ„ด, ๋ชจ๋“  ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋ชจ๋“  C# ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
  3. 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์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

ํ”Œ๋žซํผ์˜ ๋ฌธ์„œ์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ์žˆ๋Š” ๋ฐฐ์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Shields.io - ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋งŒ์˜ ๋ฐฐ์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

![ะŸั€ะธะผะตั€ ั Shields.io](https://img.shields.io/badge/custom-badge-blue)

(๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

Azure DevOps Artifacts๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์‹  ๋ฒ„์ „์˜ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋ฐฐ์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด Azure DevOps ์‚ฌ์ดํŠธ์˜ ์†Œ์Šค์—์„œ ์„ ํƒํ•œ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋ฐฐ์ง€ ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•˜๊ณ  ๋งˆํฌ๋‹ค์šด ๋งˆํฌ์—…์„ ๋ณต์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

(๊ฑฐ์˜) ์™„์ „ ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ GitLab์˜ CI/CD ๊ฐ€์ด๋“œ

์•„๋ฆ„๋‹ค์›€์„ ๋”ํ•˜๋‹ค

๊ณตํ†ต ๊ตฌ์„ฑ ์กฐ๊ฐ ๊ฐ•์กฐ ํ‘œ์‹œ

๊ตฌ์„ฑ์„ ์ž‘์„ฑํ•˜๊ณ  ์„ค๋ช…์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋™์•ˆ 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๋Š” ์ด ๊ฐ€์ด๋“œ๋ฅผ ์ฝ์€ ํ›„ ๋ณด์ด๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ด‘๋ฒ”์œ„ํ•˜๊ณ  ๋‹ค๋ฉด์ ์ž…๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์ž˜๋ชป ๋์–ด.. ๊ฑฐ๊ธฐ์—๋„ ์ž๋™ DevOps๋Š”ํ—ˆ์šฉ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€, ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง

์ด์ œ ๊ณ„ํš์€ Pulumi๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค์Œ ๋ฌธ์„œ์—์„œ ๋‹ค๋ฃฐ ๋Œ€์ƒ ํ™˜๊ฒฝ์„ ์ž๋™์œผ๋กœ ๊ฒฐ์ •ํ•˜์—ฌ Azure์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€