Jenkins ์ž‘์—…์—์„œ ๋™์  ๋งค๊ฐœ๋ณ€์ˆ˜ ์ƒ์„ฑ ๋˜๋Š” ์ž‘์—…์„ ์‚ฌ์šฉ์ž ์นœํ™”์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

์•ˆ๋…•ํ•˜์„ธ์š”, ํ•˜๋ธŒ ๋ฅด!

์˜ค๋Š˜์€ ๊ทธ ํ™œ์šฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณต์œ ํ•ด๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ์„ ํƒ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ์  ํ‚จ์Šค ๊ฐ€์žฅ ํ†ต์ผ๋˜๊ณ  ์‚ฌ์šฉ์ž ์นœํ™”์ ์ž…๋‹ˆ๋‹ค.

์†Œ๊ฐœ

DevOps์™€ ๊ฐ™์€ ์•ฝ์–ด๋Š” ๋” ์ด์ƒ IT ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ "DevOps ์ˆ˜ํ–‰"์ด๋ผ๋Š” ๋ฌธ๊ตฌ๋Š” ์ผ์ข…์˜ ๋งˆ๋ฒ• ๋ฒ„ํŠผ๊ณผ ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ฆญํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค(๋ชจ๋“  ๊ฒƒ์ด ์‹ค์ œ๋กœ๋Š” ๋” ๋ณต์žกํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์—์„œ ์ถ”์ƒํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).

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

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ์  ํ‚จ์Šค.


Jenkins ์ž‘์—…์—์„œ ๋™์  ๋งค๊ฐœ๋ณ€์ˆ˜ ์ƒ์„ฑ ๋˜๋Š” ์ž‘์—…์„ ์‚ฌ์šฉ์ž ์นœํ™”์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

ํƒœ์Šคํฌ

ํŠน์ • ๋ฒ„์ „์˜ ์„ ํƒ๋œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ๋นŒ๋“œ ๋ฐ/๋˜๋Š” ๋ฐฐํฌ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ํŽธ๋ฆฌํ•œ Jenkins ์ž‘์—…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Jenkins ์ž‘์—…์—์„œ ๋™์  ๋งค๊ฐœ๋ณ€์ˆ˜ ์ƒ์„ฑ ๋˜๋Š” ์ž‘์—…์„ ์‚ฌ์šฉ์ž ์นœํ™”์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

์ž…๋ ฅ ๋ฐ์ดํ„ฐ

์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์—ฌ๋Ÿฌ ์ €์žฅ์†Œ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ ์ •์˜

๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ž‘์—…์— ๋Œ€ํ•œ ์ž…๋ ฅ์œผ๋กœ ์ˆ˜์‹ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ ๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•˜๋ ค๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ์ €์žฅ์†Œ์˜ URL์ž…๋‹ˆ๋‹ค.
  2. ๋นŒ๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ปค๋ฐ‹์˜ ID์ž…๋‹ˆ๋‹ค.

๊ทธ๋Œ€๋กœ

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๋ฌธ์ž์—ด ์œ ํ˜•์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‘ ๊ฐœ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Jenkins ์ž‘์—…์—์„œ ๋™์  ๋งค๊ฐœ๋ณ€์ˆ˜ ์ƒ์„ฑ ๋˜๋Š” ์ž‘์—…์„ ์‚ฌ์šฉ์ž ์นœํ™”์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ฒฝ๋กœ์™€ ์ปค๋ฐ‹ ID๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋Š” ์™„์ „ํžˆ ํŽธ๋ฆฌํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Jenkins ์ž‘์—…์—์„œ ๋™์  ๋งค๊ฐœ๋ณ€์ˆ˜ ์ƒ์„ฑ ๋˜๋Š” ์ž‘์—…์„ ์‚ฌ์šฉ์ž ์นœํ™”์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

์žˆ๋Š” ๊ทธ๋Œ€๋กœ

์ด์ œ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“  ์žฅ์ ์„ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
Choice ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” Active Choices Reactive Reference ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Choice ์œ ํ˜•์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ Choices ํ•„๋“œ์— ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ด๋ฆ„์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Jenkins ์ž‘์—…์—์„œ ๋™์  ๋งค๊ฐœ๋ณ€์ˆ˜ ์ƒ์„ฑ ๋˜๋Š” ์ž‘์—…์„ ์‚ฌ์šฉ์ž ์นœํ™”์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

๋…์ž๊ฐ€ ์ด ๊ธฐ์‚ฌ๋ฅผ ์ข‹์•„ํ•œ๋‹ค๋ฉด ๋‹ค์Œ ๊ธฐ์‚ฌ์—์„œ๋Š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•œ ์„ค๋ช…(์ฝ”๋“œ๋กœ ๊ตฌ์„ฑ)์„ ์‚ฌ์šฉํ•˜์—ฌ Jenkins์—์„œ ์ž‘์—…์„ ๊ตฌ์„ฑํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ์ €์žฅ์†Œ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๋ชจ๋“  ๊ฒƒ์ด ์ž๋™์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(์šฐ๋ฆฌ ์ฝ”๋“œ๋Š” SCM์—์„œ ์ €์žฅ์†Œ ๋ชฉ๋ก์„ ์ˆ˜์‹ ํ•˜๊ณ  ์ด ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค).

๊ฐ ์ €์žฅ์†Œ์—๋Š” ์ž์ฒด ์ปค๋ฐ‹ ๋ชฉ๋ก์ด ์žˆ์œผ๋ฏ€๋กœ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ทจํ•˜๋Š” ๊ฐ’(test1 ๋˜๋Š” test2)์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.

ํ™œ์„ฑ ์„ ํƒ ๋ฐ˜์‘ ์ฐธ์กฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹ค์Œ ํ•„๋“œ๋ฅผ ์ฑ„์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์„ฑํ•จ โ€“ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„.
  2. ์Šคํฌ๋ฆฝํŠธ โ€“ ์ฐธ์กฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•„๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋  ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค(์ด ๊ฒฝ์šฐ test1๊ณผ test2 ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ๋•Œ).
  3. ์ƒํ’ˆ ์„ค๋ช… โ€“ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช….
  4. ์„ ํƒ ์œ ํ˜• โ€“ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ๋ฐ˜ํ™˜๋œ ๊ฐœ์ฒด ์œ ํ˜•(์ด ๊ฒฝ์šฐ html ์ฝ”๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค).
  5. ์ฐธ์กฐ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ โ€“ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„, ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์Šคํฌ๋ฆฝํŠธ ์„น์…˜์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Jenkins ์ž‘์—…์—์„œ ๋™์  ๋งค๊ฐœ๋ณ€์ˆ˜ ์ƒ์„ฑ ๋˜๋Š” ์ž‘์—…์„ ์‚ฌ์šฉ์ž ์นœํ™”์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

์ด ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•„๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๊ตฌํ˜„์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. Groovy ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ์Šคํฌ๋ฆฝํ‹€๋Ÿฌ ์Šคํฌ๋ฆฝํŠธ.
์šฐ๋ฆฌ๋Š” ์ฒซ ๋ฒˆ์งธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Scriptler๋Š” ์ด์ „์— ์ž‘์„ฑํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋‹ค์‹œ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์ง€ ์•Š๊ณ ๋„ ๋‹ค๋ฅธ ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์„ ํƒํ•œ ์ €์žฅ์†Œ์—์„œ ๋ชจ๋“  ์ปค๋ฐ‹์„ ๊ฐ€์ ธ์˜ค๋Š” Groovy ์ฝ”๋“œ:

AUTH = "ะปะพะณะธะฝ ะธ ะฟะฐั€ะพะปัŒ ะฒ Base64"                           
GIT_URL = "url ะดะพ ะฒะฐัˆะตะน SCM (https://bitbucket.org/)"                       
PROJECT_NAME = "ะธะผั ะฟั€ะพะตะบั‚ะฝะพะน ะพะฑะปะฐัั‚ะธ, ะณะดะต ะฝะฐั…ะพะดัั‚ัั ั€ะตะฟะพะทะธั‚ะพั€ะธะธ"

def htmlBuild() {
    html = """
            <html>
            <head>
            <meta charset="windows-1251">
            <style type="text/css">
            div.grayTable {
            text-align: left;
            border-collapse: collapse;
            }
            .divTable.grayTable .divTableCell, .divTable.grayTable .divTableHead {
            padding: 0px 3px;
            }
            .divTable.grayTable .divTableBody .divTableCell {
            font-size: 13px;
            }
            </style>
            </head>
            <body>
        """

    def commitOptions = ""
    getCommitsForMicroservice(MICROSERVICE_NAME).each {
        commitOptions += "<option style='font-style: italic' value='COMMIT=${it.getKey()}'>${it}</option>"
    }
    html += """<p style="display: inline-block;">
        <select id="commit_id" size="1" name="value">
            ${commitOptions}
        </select></p></div>"""

    html += """
            </div>
            </div>
            </div>
            </body>
            </html>
         """
    return html
}

def getCommitsForMicroservice(microserviceRepo) {
    def commits = [:]
    def endpoint = GIT_URL + "/rest/api/1.0/projects/${PROJECT_NAME}/repos/${microserviceRepo}/commits"
    def conn = new URL(endpoint).openConnection()
    conn.setRequestProperty("Authorization", "Basic ${AUTH}")
    def response = new groovy.json.JsonSlurper().parseText(conn.content.text)
    response.values.each {
        commits.put(it.displayId, it.message)
    }
    return commits
}

return htmlBuild()

์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ  ์ด ์ฝ”๋“œ๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์ด๋ฆ„(MICROSERVICE_NAME)์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๊ณ  ๋‹ค์Œ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋น„ํŠธ ๋ฒ„์ผ“ (๋ฐฉ๋ฒ• getCommitsForMicroservice) API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๋ชจ๋“  ์ปค๋ฐ‹์˜ ID์™€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด ์ฝ”๋“œ๋Š” ํŽ˜์ด์ง€์— ํ‘œ์‹œ๋  html์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ Jenkins์—์„œ๋Š” Bitbucket์—์„œ ์ˆ˜์‹ ํ•œ ๋ชจ๋“  ๊ฐ’์„ ๋ชฉ๋ก์— ๋ž˜ํ•‘ํ•˜๊ณ  ์„ ํƒ ํ•ญ๋ชฉ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ์•„๋ฆ„๋‹ค์šด ํŽ˜์ด์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ.

test1 ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์„ ํƒํ•œ ๊ฒฝ์šฐ:

Jenkins ์ž‘์—…์—์„œ ๋™์  ๋งค๊ฐœ๋ณ€์ˆ˜ ์ƒ์„ฑ ๋˜๋Š” ์ž‘์—…์„ ์‚ฌ์šฉ์ž ์นœํ™”์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

test2 ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์„ ํƒํ•œ ๊ฒฝ์šฐ:

Jenkins ์ž‘์—…์—์„œ ๋™์  ๋งค๊ฐœ๋ณ€์ˆ˜ ์ƒ์„ฑ ๋˜๋Š” ์ž‘์—…์„ ์‚ฌ์šฉ์ž ์นœํ™”์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

๋งค๋ฒˆ URL์„ ๋ณต์‚ฌํ•˜๊ณ  ํ•„์š”ํ•œ ์ปค๋ฐ‹ ID๋ฅผ ์ฐพ๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์—…๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์‹ญ์‹œ์˜ค.

PS ์ด ๋ฌธ์„œ์—์„œ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋” ๋งŽ์€ ๋‹ค์–‘ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ˜•์‹์—์„œ๋Š” ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฌธ์„œ์˜ ๋ชฉ์ ์€ ๋„๊ตฌ ์ž‘๋™ ๋ฐฉ์‹์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด์ง€ ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

PSS ์•ž์„œ ์“ด ๊ฒƒ์ฒ˜๋Ÿผ ์ด ๊ธฐ์‚ฌ๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๋‹ค์Œ ๊ธฐ์‚ฌ๋Š” ๋‹ค์Œ ๋‚ด์šฉ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ํ†ตํ•œ Jenkins ์ž‘์—…์˜ ๋™์  ๊ตฌ์„ฑ.

์ถœ์ฒ˜ : habr.com

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