์๋ ํ์ธ์, ํ๋ธ ๋ฅด!
์ค๋์ ๊ทธ ํ์ฉ๋ฒ ์ค ํ๋๋ฅผ ๊ณต์ ํด๋ณผ๊น ํฉ๋๋ค.
์๊ฐ
DevOps์ ๊ฐ์ ์ฝ์ด๋ ๋ ์ด์ IT ์ปค๋ฎค๋ํฐ์ ์๋ก์ด ๊ฒ์ด ์๋๋๋ค. ๋ง์ ์ฌ๋๋ค์๊ฒ "DevOps ์ํ"์ด๋ผ๋ ๋ฌธ๊ตฌ๋ ์ผ์ข ์ ๋ง๋ฒ ๋ฒํผ๊ณผ ์ฐ๊ด๋์ด ์์ต๋๋ค. ํด๋ฆญํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๊ฐ ์๋์ผ๋ก ๋ฐฐํฌ ๋ฐ ํ ์คํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ ํ๋ฉ๋๋ค(๋ชจ๋ ๊ฒ์ด ์ค์ ๋ก๋ ๋ ๋ณต์กํ์ง๋ง ์ฐ๋ฆฌ๋ ๋ชจ๋ ํ๋ก์ธ์ค์์ ์ถ์ํํ๊ณ ์์ต๋๋ค).
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๊ด๋ฆฌ์๊ฐ ํด๋ฆญ ํ ๋ฒ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ์ ์๋๋ก ์ด๋ฐ ๋ง๋ฒ์ ๋ฒํผ์ ๋ง๋ค์ด ๋ฌ๋ผ๋ ์ฃผ๋ฌธ์ ๋ฐ์์ต๋๋ค. ์ด ์์ ์๋ ์ธ์คํดํธ ๋ฉ์ ์ ์ฉ ๋ด ์์ฑ๋ถํฐ ๋ณ๋์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ๊น์ง ๋ค์ํ ์ ํ์ ๊ตฌํ์ด ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ด ๋ชจ๋ ๋ชฉํ๋ ๋์ผํฉ๋๋ค. ์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ต๋ํ ํฌ๋ช ํ๊ณ ํธ๋ฆฌํ๊ฒ ์์ํ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์ ํจ์ค.
ํ์คํฌ
ํน์ ๋ฒ์ ์ ์ ํ๋ ๋ง์ดํฌ๋ก์๋น์ค์ ๋น๋ ๋ฐ/๋๋ ๋ฐฐํฌ๋ฅผ ์์ํ๋ ํธ๋ฆฌํ Jenkins ์์ ์ ๋ง๋ญ๋๋ค.
์ ๋ ฅ ๋ฐ์ดํฐ
์ฐ๋ฆฌ๋ ๋ค์ํ ๋ง์ดํฌ๋ก์๋น์ค์ ์์ค ์ฝ๋๋ฅผ ํฌํจํ๋ ์ฌ๋ฌ ์ ์ฅ์๋ฅผ ๋ณด์ ํ๊ณ ์์ต๋๋ค.
๋งค๊ฐ๋ณ์ ์ ์
๋ค์ ๋งค๊ฐ๋ณ์๊ฐ ์์ ์ ๋ํ ์ ๋ ฅ์ผ๋ก ์์ ๋์ด์ผ ํฉ๋๋ค.
- ์์ ์ ์คํํ ๋ ๋น๋ํ๊ณ ๋ฐฐํฌํ๋ ค๋ ๋ง์ดํฌ๋ก์๋น์ค ์ฝ๋๊ฐ ํฌํจ๋ ์ ์ฅ์์ URL์ ๋๋ค.
- ๋น๋๊ฐ ๋ฐ์ํ ์ปค๋ฐ์ ID์ ๋๋ค.
๊ทธ๋๋ก
์ด ์์ ์ ์ํํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋ฌธ์์ด ์ ํ์ ๋งค๊ฐ๋ณ์ ๋ ๊ฐ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค.
์ด ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ๋ฆฌํฌ์งํ ๋ฆฌ ๊ฒฝ๋ก์ ์ปค๋ฐ ID๋ฅผ ์๋์ผ๋ก ์ ๋ ฅํด์ผ ํ๋๋ฐ ์ด๋ ์์ ํ ํธ๋ฆฌํ์ง๋ ์์ต๋๋ค.
์๋ ๊ทธ๋๋ก
์ด์ ๋ค๋ฅธ ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํด ๋ชจ๋ ์ฅ์ ์ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค.
Choice ๋งค๊ฐ๋ณ์ ์ ํ์ผ๋ก ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ฅผ ์์ฑํ๊ณ , ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ Active Choices Reactive Reference ๋งค๊ฐ๋ณ์๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. Choice ์ ํ์ ๋งค๊ฐ๋ณ์์์ Choices ํ๋์ ๋ง์ดํฌ๋ก์๋น์ค ์ฝ๋๊ฐ ์ ์ฅ๋ ๋ฆฌํฌ์งํ ๋ฆฌ ์ด๋ฆ์ ์๋์ผ๋ก ์ถ๊ฐํฉ๋๋ค.
๋ ์๊ฐ ์ด ๊ธฐ์ฌ๋ฅผ ์ข์ํ๋ค๋ฉด ๋ค์ ๊ธฐ์ฌ์์๋ ์ฝ๋๋ฅผ ํตํ ์ค๋ช (์ฝ๋๋ก ๊ตฌ์ฑ)์ ์ฌ์ฉํ์ฌ Jenkins์์ ์์ ์ ๊ตฌ์ฑํ๋ ํ๋ก์ธ์ค๋ฅผ ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์๋์ผ๋ก ์ ์ฅ์ ์ด๋ฆ์ ์ ๋ ฅํ๊ณ ๋งค๊ฐ๋ณ์๋ฅผ ์์ฑํ ํ์๊ฐ ์์ผ๋ฉฐ ๋ชจ๋ ๊ฒ์ด ์๋์ผ๋ก ๋ฐ์ํฉ๋๋ค(์ฐ๋ฆฌ ์ฝ๋๋ SCM์์ ์ ์ฅ์ ๋ชฉ๋ก์ ์์ ํ๊ณ ์ด ๋ชฉ๋ก์ ์ฌ์ฉํ์ฌ ๋งค๊ฐ๋ณ์๋ฅผ ์์ฑํฉ๋๋ค).
๊ฐ ์ ์ฅ์์๋ ์์ฒด ์ปค๋ฐ ๋ชฉ๋ก์ด ์์ผ๋ฏ๋ก ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๊ฐ ์ทจํ๋ ๊ฐ(test1 ๋๋ test2)์ ๋ฐ๋ผ ๋์ ์ผ๋ก ์ฑ์์ง๋๋ค.
ํ์ฑ ์ ํ ๋ฐ์ ์ฐธ์กฐ ๋งค๊ฐ๋ณ์ ๋ค์ ํ๋๋ฅผ ์ฑ์์ผ ํฉ๋๋ค.
- ์ฑํจ โ ๋งค๊ฐ๋ณ์ ์ด๋ฆ.
- ์คํฌ๋ฆฝํธ โ ์ฐธ์กฐ ๋งค๊ฐ๋ณ์ ํ๋์ ๋งค๊ฐ๋ณ์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ๋ ์ฝ๋์ ๋๋ค(์ด ๊ฒฝ์ฐ test1๊ณผ test2 ์ค ํ๋๋ฅผ ์ ํํ ๋).
- ์ํ ์ค๋ช โ ๋งค๊ฐ๋ณ์์ ๋ํ ๊ฐ๋ตํ ์ค๋ช .
- ์ ํ ์ ํ โ ์คํฌ๋ฆฝํธ์ ์ํด ๋ฐํ๋ ๊ฐ์ฒด ์ ํ(์ด ๊ฒฝ์ฐ html ์ฝ๋๊ฐ ๋ฐํ๋ฉ๋๋ค).
- ์ฐธ์กฐ๋ ๋งค๊ฐ๋ณ์ โ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ, ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์คํฌ๋ฆฝํธ ์น์ ์ ์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค.
์ด ๋งค๊ฐ๋ณ์์์ ๊ฐ์ฅ ์ค์ํ ํ๋๋ฅผ ์ง์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ์ ํํ ์ ์๋ ๋ ๊ฐ์ง ์ ํ์ ๊ตฌํ์ด ์ ๊ณต๋ฉ๋๋ค. 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 ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ ํํ ๊ฒฝ์ฐ:
test2 ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ ํํ ๊ฒฝ์ฐ:
๋งค๋ฒ URL์ ๋ณต์ฌํ๊ณ ํ์ํ ์ปค๋ฐ ID๋ฅผ ์ฐพ๋ ๊ฒ๋ณด๋ค ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ์๊ฐ ์์ ๊ณผ ์ํธ ์์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ ํธ๋ฆฌํ๋ค๋ ๋ฐ ๋์ํ์ญ์์ค.
PS ์ด ๋ฌธ์์์๋ ์ด์ ๋ธ๋ฆฌ์ ๋ ๋ง์ ๋ค์ํ ๋งค๊ฐ๋ณ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด ํ์์์๋ ์ค์ ๋ก ์ฌ์ฉ๋์ง ์์ ์ ์๋ ๋งค์ฐ ๊ฐ๋จํ ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ฌธ์์ ๋ชฉ์ ์ ๋๊ตฌ ์๋ ๋ฐฉ์์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด์ง ์๋ํ๋ ์๋ฃจ์ ์ ์ ๊ณตํ๋ ๊ฒ์ด ์๋๋๋ค.
PSS ์์ ์ด ๊ฒ์ฒ๋ผ ์ด ๊ธฐ์ฌ๊ฐ ๋์์ด ๋์๋ค๋ฉด ๋ค์ ๊ธฐ์ฌ๋ ๋ค์ ๋ด์ฉ์ ๊ดํ ๊ฒ์ ๋๋ค. ์ฝ๋๋ฅผ ํตํ Jenkins ์์ ์ ๋์ ๊ตฌ์ฑ.
์ถ์ฒ : habr.com