์ฐ๋ฆฌ ๊ฐ๋ฐ ํ ์ค ํ ํ์ ํ์ฅ์ด ์ ๋ ์ปจํ ์ด๋ํ๋ ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํด ๋ฌ๋ผ๊ณ ์์ฒญํ์ ๋ ๋ชจ๋ ๊ฒ์ด ์์๋์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๊ฒ์ํ๋ค. ์ฝ 20๋ถ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํธ ์์ฒญ์ด ์ ์๋์์ต๋๋ค. ๊ฑฐ๊ธฐ์ ๊ผญ ํ์ํ ํญ๋ชฉ์ด ์ถ๊ฐ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋๋ ๊ฐฑ์ ํ๋ค. ๋ช ์๊ฐ์ด ๋ ์ง๋๋ฉด... ์, ๋ค์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ธฐ ์์ํ๋์ง ์ง์ํ ์ ์์ ๊ฒ์ ๋๋ค...
๋๋ ๊ฝค ๊ฒ์ผ๋ฅด๋ค๋ ๊ฒ์ ์ธ์ ํด์ผ ํฉ๋๋ค. (์ด์ ์ ์ด๊ฒ์ ์ธ์ ํ์ง ์์๋์? ์๋์?) ํ ๋ฆฌ๋๊ฐ ๋ชจ๋ CI/CD๊ฐ ์๋ Jenkins์ ์ก์ธ์คํ ์ ์๋ค๋ ์ฌ์ค์ ๊ณ ๋ คํ์ฌ ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ์ต๋๋ค. ๊ทธ๊ฐ ์ํ๋ ๋งํผ! ๋๋ ๋๋ด์ ๊ธฐ์ตํ์ต๋๋ค. ์ฌ๋์๊ฒ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ฃผ๋ฉด ํ๋ฃจ ๋์ ๋จน์ ๊ฒ์ ๋๋ค. ์ฌ๋์๊ฒ Fed๋ฅผ ๋ถ๋ฅด๋ฉด ๊ทธ๋ ํ์ Fed๋ฅผ ๋ฐ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ค ์ง์ฅ์์ ์ฅ๋์ ์น๋ค, ์ฑ๊ณต์ ์ผ๋ก ๊ตฌ์ถ๋ ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํฌํจ๋ ์ปจํ ์ด๋๋ฅผ Kuber์ ๋ฐฐํฌํ๊ณ ๋ชจ๋ ๊ฐ์ ์ปจํ ์ด๋๋ก ์ ์กํ ์ ์์ต๋๋ค. ENV (๊ณผ๊ฑฐ์ ์์ด ๊ต์ฌ์๋ ๋ฌธํํ์์๋ ๋์ ํ ์๋ฒ์ง๋ ์ด์ ์ด ๋ฌธ์ฅ์ ์ฝ์ ํ ๊ด์๋์ด์์ ์๊ฐ๋ฝ์ ๋๋ฆฌ๋ฉฐ ๋๋ฅผ ๋งค์ฐ ํ์ ์๊ฒ ๋ฐ๋ผ๋ณด๊ณค ํ์ต๋๋ค).
๊ทธ๋์ ์ด ๋ ธํธ์์๋ ์ ๊ฐ ์ด๋ป๊ฒ ๋ฐฐ์ ๋์ง ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค.
- ์์ ์์ฒด ๋๋ ๋ค๋ฅธ ์์ ์์ Jenkins์ ์์ ์ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
- Jenkins ์์ด์ ํธ๊ฐ ์ค์น๋ ๋ ธ๋์์ ํด๋ผ์ฐ๋ ์ฝ์(Cloud Shell)์ ์ฐ๊ฒฐํฉ๋๋ค.
- Google Kubernetes Engine์ ์ํฌ๋ก๋๋ฅผ ๋ฐฐํฌํฉ๋๋ค.
์ฌ์ค ์ ๋ ๋ฌผ๋ก ๋ค์ ์์งํ์ง ๋ชปํ ํธ์
๋๋ค. ๊ทํ๋ Google ํด๋ผ์ฐ๋์ ์ธํ๋ผ์ ์ ์ด๋ ์ผ๋ถ๋ฅผ ๋ณด์ ํ๊ณ ์์ผ๋ฏ๋ก ํด๋น ์ฌ์ฉ์์ด๋ฉฐ ๋ฌผ๋ก GCP ๊ณ์ ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ํ์ง๋ง ์ด ๋ฉ๋ชจ์ ๋ด์ฉ์ ๊ทธ๊ฒ ์๋๋๋ค.
์ด๊ฒ์ ๋์ ๋ค์ ์นํธ ์ํธ์ ๋๋ค. ๋๋ ํ ๊ฐ์ง ๊ฒฝ์ฐ์๋ง ๊ทธ๋ฌํ ๋ฉ๋ชจ๋ฅผ ์์ฑํ๊ณ ์ถ์ต๋๋ค. ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์ฒ์์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ชฐ๋๊ณ ์๋ฃจ์ ์ด ๊ธฐ์ฑํ์ผ๋ก ๊ฒ์๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋ถ๋ถ์ ์ผ๋ก ๊ฒ์ํ์ฌ ๊ฒฐ๊ตญ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๊ทธ๋์ ๋์ค์ ๋ด๊ฐ ์ด๋ป๊ฒ ํ๋์ง ์์ด๋ฒ๋ ธ์ ๋ ๋ชจ๋ ๊ฒ์ ๋ค์ ๊ตฌ๊ธ๋งํด์ ๋ชจ์์ ์ ๋ฆฌํ ํ์ ์์ด ์ค์ค๋ก ๊ทธ๋ฐ ์นํธ ์ํธ๋ฅผ ์์ฑํฉ๋๋ค.
๋ถ์ธ ์ฑ๋ช : 1. ๋ฉ๋ชจ๋ ์ญํ ์ ๋ํด "๋ ์์ ์ ์ํด" ์์ฑ๋์์ต๋๋ค. ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ ์ ์ฉ๋์ง ์์ต๋๋ค. ๋๊ธ์์ "์ด๋ ๊ฒ ํ๋ฉด ๋ ์ข์์ ํ ๋ฐ"๋ผ๋ ์ต์ ์ ์ฝ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
2. ๋ ธํธ์ ์ ์ฉ๋ ๋ถ๋ถ์ด ์๊ธ์ผ๋ก ๊ฐ์ฃผ๋๋ค๋ฉด ์ด์ ๋ ธํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด ๋ ธํธ๋ ์ฝํ ์๊ธ ์ฉ์ก์ ๋๋ค.
Jenkins์์ ์์ ์ค์ ์ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธ
๊ทํ์ ์ง๋ฌธ์ด ์์๋ฉ๋๋ค. ๋์ ์์ ์ ๋ฐ์ดํธ๊ฐ ๊ทธ๊ฒ๊ณผ ์ด๋ค ๊ด๋ จ์ด ์์ต๋๊น? ๋ฌธ์์ด ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์๋์ผ๋ก ์ ๋ ฅํ๋ฉด ๋ฉ๋๋ค!
์ ๋ ์ ๋ง ๊ฒ์ผ๋ฆ ๋๋ค. ๊ทธ๋ค์ด ๋ถํํ๋ ๊ฒ์ด ๋ง์์ ๋ค์ง ์์ต๋๋ค. Misha, ๋ฐฐํฌ๊ฐ ์ค๋จ๋๊ณ ๋ชจ๋ ๊ฒ์ด ์ฌ๋ผ์ก์ต๋๋ค! ์ดํด๋ณด๊ธฐ ์์ํ๋๋ฐ ์ผ๋ถ ์์ ์์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ์คํ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋๋ ๋ชจ๋ ์ผ์ ๊ฐ๋ฅํ ํ ํจ์จ์ ์ผ๋ก ์ํํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๋์ ์ ํํ ๊ฐ ๋ชฉ๋ก์ ์ ๊ณตํ์ฌ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ๋ ฅํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค๋ฉด ์ ํ ํญ๋ชฉ์ ๊ตฌ์ฑํฉ๋๋ค.
๊ณํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. Jenkins์์ ์์ ์ ์์ฑํฉ๋๋ค. ์์ ์ ์์ํ๊ธฐ ์ ์ ๋ชฉ๋ก์์ ๋ฒ์ ์ ์ ํํ๊ณ ๋ค์์ ํตํด ์ปจํ ์ด๋์ ์ ๋ฌ๋๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค. ENV, ๊ทธ๋ฐ ๋ค์ ์ปจํ ์ด๋๋ฅผ ์์งํ์ฌ Container Registry์ ํธ์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฑฐ๊ธฐ์์ ์ปจํ ์ด๋๋ ๋ค์๊ณผ ๊ฐ์ด Cuber์์ ์์๋ฉ๋๋ค. ์์ ๋ ์์ ์ ์ง์ ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Jenkins์์ ์์ ์ ์์ฑํ๊ณ ์ค์ ํ๋ ํ๋ก์ธ์ค๋ ๊ณ ๋ คํ์ง ์์ ๊ฒ์ ๋๋ค. ์ด๋ ์ฃผ์ ์์ ๋ฒ์ด๋ฉ๋๋ค. ์์ ์ด ์ค๋น๋์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค. ๋ฒ์ ์ด ํฌํจ๋ ์ ๋ฐ์ดํธ๋ ๋ชฉ๋ก์ ๊ตฌํํ๋ ค๋ฉด ๋ ๊ฐ์ง๊ฐ ํ์ํฉ๋๋ค. ์ฆ, ์ฌ์ ์ ์ ํจํ ๋ฒ์ ๋ฒํธ๊ฐ ์๋ ๊ธฐ์กด ์์ค ๋ชฉ๋ก๊ณผ ๋ค์๊ณผ ๊ฐ์ ๋ณ์๊ฐ ํ์ํฉ๋๋ค. ์ ํ ๋งค๊ฐ๋ณ์ ์์ ์์. ์ด ์์์๋ ๋ณ์ ์ด๋ฆ์ ์ง์ ํ๊ฒ ์ต๋๋ค. BUILD_VERSION, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ํด ์์ธํ ๋ค๋ฃจ์ง ์์ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์์ค ๋ชฉ๋ก์ ์์ธํ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
์ต์ ์ด ๊ทธ๋ฆฌ ๋ง์ง ์์ต๋๋ค. ์ฆ์ ๋ ๊ฐ์ง๊ฐ ๋ ์ฌ๋์ต๋๋ค.
- Jenkins๊ฐ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ์๊ฒฉ ์ก์ธ์ค API๋ฅผ ์ฌ์ฉํ์ธ์.
- ์๊ฒฉ ์ ์ฅ์ ํด๋์ ์ฝํ ์ธ ๋ฅผ ์์ฒญํฉ๋๋ค(์ด ๊ฒฝ์ฐ JFrog Artifactory์ด๋ฉฐ ์ค์ํ์ง ์์ต๋๋ค).
์ ํจ์ค ์๊ฒฉ ์ก์ธ์ค API
ํ๋ฆฝ๋ ์ฐ์ํ ์ ํต์ ๋ฐ๋ฅด๋ฉด, ๊ธด ์ค๋ช
์ ํผํ๊ณ ์ถ์ต๋๋ค.
๋๋ ์ฒซ ๋ฒ์งธ ๋จ๋ฝ์ ์ผ๋ถ๋ง ๋ฌด๋ฃ๋ก ๋ฒ์ญํ๋๋ก ํ์ฉํ๊ฒ ์ต๋๋ค.
Jenkins๋ ํด๋น ๊ธฐ๋ฅ์ ๋ํ ์๊ฒฉ ๊ธฐ๊ณ ํ๋ ๊ฐ๋ฅ ์ก์ธ์ค๋ฅผ ์ํ API๋ฅผ ์ ๊ณตํฉ๋๋ค. <โฆ> ์๊ฒฉ ์ก์ธ์ค๋ REST์ ์ ์ฌํ ์คํ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค. ์ฆ, ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ํ ๋จ์ผ ์ง์ ์ ์ด ์๊ณ ๋์ '.../api/", ์ด๋ "..."๋ API ๊ธฐ๋ฅ์ด ์ ์ฉ๋๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํฉ๋๋ค.
์ฆ, ํ์ฌ ์ด์ผ๊ธฐํ๊ณ ์๋ ๋ฐฐํฌ ์์
์ด ๋ค์ ์์น์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build
, ์ด ์์
์ ๋ํ API ํํ๋์ ๋ค์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/
๋ค์์ผ๋ก, ์ถ๋ ฅ์ ์ด๋ค ํ์์ผ๋ก ๋ฐ์์ง ์ ํํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ API๋ ํํฐ๋ง๋ง ํ์ฉํ๋ฏ๋ก XML์ ์ค์ ์ ๋๊ฒ ์ต๋๋ค.
๋ชจ๋ ์์ ์คํ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด์ ๋ธ๋ฆฌ ์ด๋ฆ(์ด๋ฆ ํ์ํ๊ธฐ) ๋ฐ ๊ทธ ๊ฒฐ๊ณผ(๊ฒฐ๊ณผ):
http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]
๊ทธ๊ฒ์ ๋ฐํ์ก๋ค?
์ด์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ์คํ๋ง ํํฐ๋งํด ๋ณด๊ฒ ์ต๋๋ค. ์ฑ๊ณต. ๋ ผ์ฆ์ ํ์ฉํด๋ณด์ &๋ค์ด์ค์ง ๋ชปํ๊ฒ ํ๋ค ๋งค๊ฐ๋ณ์๋ก ๋ค์๊ณผ ๊ฐ์ง ์์ ๊ฐ์ ๊ฒฝ๋ก๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ฑ๊ณต. ์ ์. ์ด์ค ๋ถ์ ์ ์ง์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ด์ฌ์ด ์๋ ๋ชจ๋ ๊ฒ์ ์ ์ธํฉ๋๋ค.
http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result!='SUCCESS']
์ฑ๊ณต ๋ชฉ๋ก ์คํฌ๋ฆฐ์ท
๊ธ์, ์ฌ๋ฏธ๋ก ํํฐ๊ฐ ์ฐ๋ฆฌ๋ฅผ ์์ด์ง ์์๋์ง ํ์ธํ๊ณ (ํํฐ๋ ๊ฑฐ์ง๋ง์ ํ์ง ์์ต๋๋ค!) "์คํจํ" ๋ชฉ๋ก์ ํ์ํด ๋ณด๊ฒ ์ต๋๋ค.
http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result='SUCCESS']
์คํจํ ๋ชฉ๋ก์ ์คํฌ๋ฆฐ์ท
์๊ฒฉ ์๋ฒ์ ์๋ ํด๋์ ๋ฒ์ ๋ชฉ๋ก
๋ฒ์ ๋ชฉ๋ก์ ์ป๋ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. Jenkins API์ ์ก์ธ์คํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ง์์ ๋ญ๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ฑ๊ณต์ ์ผ๋ก ๋น๋๋๋ฉด ํด๋น ์์ฉ ํ๋ก๊ทธ๋จ์ด ํจํค์ง๋์ด ์ ์ฅ์์ ์ ์ ํ ํด๋์ ๋ฐฐ์น๋์์์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฅ์๋ ์์ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ฒ์ ์ ๊ธฐ๋ณธ ์ ์ฅ์์ ๋๋ค. ์ข๋ค. ๊ทธ๋ผ, ๊ทธ์๊ฒ ์ด๋ค ๋ฒ์ ์ด ์ ์ฅ๋์ด ์๋์ง ๋ฌผ์ด๋ด ์๋ค. ์๊ฒฉ ํด๋๋ฅผ ์ปฌ๋งํ๊ณ , grepํ๊ณ , awkํ๊ฒ ์ต๋๋ค. ๋๊ตฌ๋ ์ง oneliner์ ๊ด์ฌ์ด ์๋ค๋ฉด ์คํฌ์ผ๋ฌ ์๋์ ์์ต๋๋ค.
ํ ์ค ๋ช
๋ น
๋ ๊ฐ์ง ์ฌํญ์ ์ ์ํ์ญ์์ค. ํค๋์ ์ฐ๊ฒฐ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ฉฐ ํด๋์ ๋ชจ๋ ๋ฒ์ ์ด ํ์ํ์ง ์์ผ๋ฉฐ ํ ๋ฌ ์ด๋ด์ ์์ฑ๋ ๋ฒ์ ๋ง ์ ํํฉ๋๋ค. ํ์ค๊ณผ ํ์์ ๋ง๊ฒ ๋ช
๋ น์ ํธ์งํ์ญ์์ค.
curl -H "X-JFrog-Art-Api:VeryLongAPIKey" -s http://arts.myre.po/artifactory/awesomeapp/ | sed 's/a href=//' | grep "$(date +%b)-$(date +%Y)|$(date +%b --date='-1 month')-$(date +%Y)" | awk '{print $1}' | grep -oP '>K[^/]+' )
Jenkins์์ ์์ ๋ฐ ์์ ๊ตฌ์ฑ ํ์ผ ์ค์
๋ฒ์ ๋ชฉ๋ก์ ์ถ์ฒ๋ฅผ ์์๋์ต๋๋ค. ์ด์ ๊ฒฐ๊ณผ ๋ชฉ๋ก์ ์์ ์ ํตํฉํด ๋ณด๊ฒ ์ต๋๋ค. ๋์๊ฒ ์์ด ํ์คํ ํด๊ฒฐ์ฑ ์ ์ ํ๋ฆฌ์ผ์ด์ ๋น๋ ์์ ์ ๋จ๊ณ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด์์ต๋๋ค. ๊ฒฐ๊ณผ๊ฐ "์ฑ๊ณต"์ธ ๊ฒฝ์ฐ ์คํ๋ ๋จ๊ณ์ ๋๋ค.
์กฐ๋ฆฝ ์์ ์ค์ ์ ์ด๊ณ ๋งจ ์๋๋ก ์คํฌ๋กคํ์ญ์์ค. ๋ฒํผ์ ํด๋ฆญํ์ธ์: ๋น๋ ๋จ๊ณ ์ถ๊ฐ -> ์กฐ๊ฑด๋ถ ๋จ๊ณ(๋จ์ผ). ๋จ๊ณ ์ค์ ์์ ์กฐ๊ฑด์ ์ ํํ์ธ์. ํ์ฌ ๋น๋ ์ํ, ๊ฐ์ ์ค์ ์ฑ๊ณต, ์ฑ๊ณตํ ๊ฒฝ์ฐ ์ํํ ์์ ์ ๋ช ๋ น ์คํ.
์ด์ ์ฌ๋ฏธ์๋ ๋ถ๋ถ์
๋๋ค. Jenkins๋ ์์
๊ตฌ์ฑ์ ํ์ผ์ ์ ์ฅํฉ๋๋ค. XML ํ์์
๋๋ค. ๊ธธ์ ๋ฐ๋ผ http://ะฟััั-ะดะพ-ะทะฐะดะฐะฝะธั/config.xml
๋ฐ๋ผ์ ๊ตฌ์ฑ ํ์ผ์ ๋ค์ด๋ก๋ํ๊ณ ํ์์ ๋ฐ๋ผ ํธ์งํ ํ ์๋ ์์น์ ๋ค์ ๋ฃ์ ์ ์์ต๋๋ค.
๋ฒ์ ๋ชฉ๋ก์ ๋ํ ๋งค๊ฐ๋ณ์๋ฅผ ์์ฑํ๊ธฐ๋ก ์์์ ๋์ํ๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์. BUILD_VERSION?
๊ตฌ์ฑ ํ์ผ์ ๋ค์ด๋ก๋ํ๊ณ ๊ทธ ๋ด์ฉ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋งค๊ฐ๋ณ์๊ฐ ์ ์๋ฆฌ์ ์๊ณ ์ํ๋ ์ ํ์ธ์ง ํ์ธํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์คํฌ์ผ๋ฌ ์๋ ์คํฌ๋ฆฐ์ท.
config.xml ์กฐ๊ฐ์ ๋์ผํ๊ฒ ํ์๋์ด์ผ ํฉ๋๋ค. Choices ์์์ ๋ด์ฉ์ด ์์ง ๋๋ฝ๋ ๊ฒ์ ์ ์ธํ๊ณ
ํ์คํฉ๋๊น? ์ด์ ๋น๋๊ฐ ์ฑ๊ณตํ๋ฉด ์คํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
์คํฌ๋ฆฝํธ๋ ๋ฒ์ ๋ชฉ๋ก์ ์์ ํ๊ณ , ๊ตฌ์ฑ ํ์ผ์ ๋ค์ด๋ก๋ํ๊ณ , ํ์ํ ์์น์ ๋ฒ์ ๋ชฉ๋ก์ ์์ฑํ ๋ค์ ๋ค์ ๋ฃ์ต๋๋ค. ์. ์ข์์. ๋ฒ์ ๋ชฉ๋ก์ด ์ด๋ฏธ ์๋ ๊ณณ์ XML๋ก ๋ฒ์ ๋ชฉ๋ก์ ์์ฑํฉ๋๋ค(ํฅํ ์คํฌ๋ฆฝํธ๋ฅผ ์ฒ์ ์์ํ ํ ์์ฑ ์์ ). ๋๋ ์ธ์์ ์์ง๋ ์ ๊ท์์ ์ด๊ด์ ์ผ๋ก ์ข์ํ๋ ์ฌ๋๋ค์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋๋ ๊ทธ๋ค์๊ฒ ์ํ์ง ์์ต๋๋ค. ์ค์นํด์ฃผ์ธ์
์คํฌ์ผ๋ฌ ์๋์๋ ์์ ์ํ์ค๋ฅผ ์ ์ฒด์ ์ผ๋ก ์ํํ๋ ์ฝ๋๋ฅผ ์ ์ํฉ๋๋ค.
์๊ฒฉ ์๋ฒ์ ํด๋์ ์๋ ๋ฒ์ ๋ชฉ๋ก์ ๊ตฌ์ฑ์ ์๋๋ค.
#!/bin/bash
############## ะกะบะฐัะธะฒะฐะตะผ ะบะพะฝัะธะณ
curl -X GET -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml -o appConfig.xml
############## ะฃะดะฐะปัะตะผ ะธ ะทะฐะฝะพะฒะพ ัะพะทะดะฐะตะผ xml-ัะปะตะผะตะฝั ะดะปั ัะฟะธัะบะฐ ะฒะตััะธะน
xmlstarlet ed --inplace -d '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' appConfig.xml
xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]' --type elem -n a appConfig.xml
xmlstarlet ed --inplace --insert '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a' --type attr -n class -v string-array appConfig.xml
############## ะงะธัะฐะตะผ ะฒ ะผะฐััะธะฒ ัะฟะธัะพะบ ะฒะตััะธะน ะธะท ัะตะฟะพะทะธัะพัะธั
readarray -t vers < <( curl -H "X-JFrog-Art-Api:Api:VeryLongAPIKey" -s http://arts.myre.po/artifactory/awesomeapp/ | sed 's/a href=//' | grep "$(date +%b)-$(date +%Y)|$(date +%b --date='-1 month')-$(date +%Y)" | awk '{print $1}' | grep -oP '>K[^/]+' )
############## ะะธัะตะผ ะผะฐััะธะฒ ัะปะตะผะตะฝั ะทะฐ ัะปะตะผะตะฝัะพะผ ะฒ ะบะพะฝัะธะณ
printf '%sn' "${vers[@]}" | sort -r |
while IFS= read -r line
do
xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' --type elem -n string -v "$line" appConfig.xml
done
############## ะะปะฐะดะตะผ ะบะพะฝัะธะณ ะฒะทะฐะด
curl -X POST -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml --data-binary @appConfig.xml
############## ะัะธะฒะพะดะธะผ ัะฐะฑะพัะตะต ะผะตััะพ ะฒ ะฟะพััะดะพะบ
rm -f appConfig.xml
Jenkins์์ ๋ฒ์ ์ ์ป๋ ์ต์ ์ ์ ํธํ๊ณ ๋๋งํผ ๊ฒ์ผ๋ฅธ ๊ฒฝ์ฐ ์คํฌ์ผ๋ฌ ์๋์ ๋์ผํ ์ฝ๋๊ฐ ์์ง๋ง Jenkins์ ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Jenkins์ ๋ฒ์ ๋ชฉ๋ก์ ๊ตฌ์ฑ์ ์์ฑํฉ๋๋ค.
์ด๊ฒ๋ง ๊ธฐ์ตํ์ธ์. ๋ด ์ด์
๋ธ๋ฆฌ ์ด๋ฆ์ ์ฝ๋ก ์ผ๋ก ๊ตฌ๋ถ๋ ์ํ์ค ๋ฒํธ์ ๋ฒ์ ๋ฒํธ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๋ฐ๋ผ์ awk๋ ๋ถํ์ํ ๋ถ๋ถ์ ์๋ผ๋
๋๋ค. ์์ ์ ํ์์ ๋ง๊ฒ ์ด ํ์ ๋ณ๊ฒฝํ์ญ์์ค.
#!/bin/bash
############## ะกะบะฐัะธะฒะฐะตะผ ะบะพะฝัะธะณ
curl -X GET -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml -o appConfig.xml
############## ะฃะดะฐะปัะตะผ ะธ ะทะฐะฝะพะฒะพ ัะพะทะดะฐะตะผ xml-ัะปะตะผะตะฝั ะดะปั ัะฟะธัะบะฐ ะฒะตััะธะน
xmlstarlet ed --inplace -d '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' appConfig.xml
xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]' --type elem -n a appConfig.xml
xmlstarlet ed --inplace --insert '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a' --type attr -n class -v string-array appConfig.xml
############## ะะธัะตะผ ะฒ ัะฐะนะป ัะฟะธัะพะบ ะฒะตััะธะน ะธะท Jenkins
curl -g -X GET -u username:apiKey 'http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result!=%22SUCCESS%22]&pretty=true' -o builds.xml
############## ะงะธัะฐะตะผ ะฒ ะผะฐััะธะฒ ัะฟะธัะพะบ ะฒะตััะธะน ะธะท XML
readarray vers < <(xmlstarlet sel -t -v "freeStyleProject/allBuild/displayName" builds.xml | awk -F":" '{print $2}')
############## ะะธัะตะผ ะผะฐััะธะฒ ัะปะตะผะตะฝั ะทะฐ ัะปะตะผะตะฝัะพะผ ะฒ ะบะพะฝัะธะณ
printf '%sn' "${vers[@]}" | sort -r |
while IFS= read -r line
do
xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' --type elem -n string -v "$line" appConfig.xml
done
############## ะะปะฐะดะตะผ ะบะพะฝัะธะณ ะฒะทะฐะด
curl -X POST -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml --data-binary @appConfig.xml
############## ะัะธะฒะพะดะธะผ ัะฐะฑะพัะตะต ะผะตััะพ ะฒ ะฟะพััะดะพะบ
rm -f appConfig.xml
์ด๋ก ์ ์ผ๋ก ์ ์์ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ํ ์คํธํ๋ค๋ฉด ๋ฐฐํฌ ์์ ์ ๋ฒ์ ์ด ํฌํจ๋ ๋๋กญ๋ค์ด ๋ชฉ๋ก์ด ์ด๋ฏธ ์์ด์ผ ํฉ๋๋ค. ์คํฌ์ผ๋ฌ ์๋ ์คํฌ๋ฆฐ์ท๊ณผ ๊ฐ์ต๋๋ค.
์ฌ๋ฐ๋ฅด๊ฒ ์๋ฃ๋ ๋ฒ์ ๋ชฉ๋ก
๋ชจ๋ ๊ฒ์ด ์๋ํ๋ค๋ฉด ์คํฌ๋ฆฝํธ๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ ๋ฃ์ผ์ญ์์ค. ์ ๋ช ๋ น ์คํ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฅํฉ๋๋ค.
Cloud Shell์ ์ฐ๊ฒฐ
์ปจํ ์ด๋์ ์์ง๊ฐ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณต ๋๊ตฌ ๋ฐ ๊ตฌ์ฑ ๊ด๋ฆฌ์๋ก Ansible์ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ ์ปจํ ์ด๋๋ฅผ ๊ตฌ์ถํ ๋ ์ผ๋์ ๋์ด์ผ ํ ์ธ ๊ฐ์ง ์ต์ ์ Docker์ Docker๋ฅผ ์ค์นํ๊ฑฐ๋, โโAnsible์ ์คํํ๋ ๋จธ์ ์ Docker๋ฅผ ์ค์นํ๊ฑฐ๋, โโํด๋ผ์ฐ๋ ์ฝ์์์ ์ปจํ ์ด๋๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๊ธฐ์ฌ์์ Jenkins์ฉ ํ๋ฌ๊ทธ์ธ์ ๋ํด ์นจ๋ฌต์ ์ ์งํ๊ธฐ๋ก ๋์ํ์ต๋๋ค. ๊ธฐ์ตํ๋ค?
์ ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฒฐ์ ํ์ต๋๋ค. "์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ" ์ปจํ ์ด๋๋ฅผ ํด๋ผ์ฐ๋ ์ฝ์์ ์์งํ ์ ์์ผ๋ฏ๋ก ๊ตณ์ด ๊ท์ฐฎ๊ฒ ํ ์ด์ ๊ฐ ์์๊น์? ๊นจ๋ํ๊ฒ ์ ์งํ์ธ์, ๊ทธ๋ ์ฃ ? ํด๋ผ์ฐ๋ ์ฝ์์์ Jenkins ์ปจํ ์ด๋๋ฅผ ์์งํ ๋ค์ ๊ฑฐ๊ธฐ์์ ํ๋ธ๋ก ์คํํ๊ณ ์ถ์ต๋๋ค. ๋ํ Google์ ์ธํ๋ผ ๋ด์ ๋งค์ฐ ํ๋ถํ ์ฑ๋์ ๋ณด์ ํ๊ณ ์์ด ๋ฐฐํฌ ์๋์ ์ ์ตํ ์ํฅ์ ๋ฏธ์น ๊ฒ์ ๋๋ค.
ํด๋ผ์ฐ๋ ์ฝ์์ ์ฐ๊ฒฐํ๋ ค๋ฉด ๋ค์ ๋ ๊ฐ์ง๊ฐ ํ์ํฉ๋๋ค. ์งํด๋ผ์ฐ๋ ๋ฐ ์ก์ธ์ค ๊ถํ Google ํด๋ผ์ฐ๋ API ์ด์ ๋์ผํ ์ฐ๊ฒฐ์ด ์ด๋ฃจ์ด์ง VM ์ธ์คํด์ค์ ๊ฒฝ์ฐ.
Google Cloud๊ฐ ์๋ ์ฐ๊ฒฐ์ ๊ณํํ๊ณ ์๋ ๋ถ๋ค์ ์ํด
Google์ ์๋น์ค์์ ๋ํํ ์ธ์ฆ์ ๋นํ์ฑํํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ํ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด *nix๋ฅผ ์คํ ์ค์ด๊ณ ์ฝ์ ์์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ ์ปคํผ ๋จธ์ ์์๋ ์ฝ์์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
์ด ๋ ธํธ์ ํ ๋ด์์ ์ด ๋ฌธ์ ๋ฅผ ๋ ์์ธํ ๋ค๋ฃจ์ด์ผ ํ ํ์๊ฐ ์๋ค๋ฉด ์๊ฒฌ์ ์ ์ด์ฃผ์ธ์. ์ถฉ๋ถํ ํ๋ฅผ ์ป์ผ๋ฉด ์ด ์ฃผ์ ์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ์์ฑํ๊ฒ ์ต๋๋ค.
๊ถํ์ ๋ถ์ฌํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์น ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ๋๋ค.
- ์ดํ์ ํด๋ผ์ฐ๋ ์ฝ์์ ์ฐ๊ฒฐํ VM ์ธ์คํด์ค๋ฅผ ์ค์งํฉ๋๋ค.
- ์ธ์คํด์ค ์ธ๋ถ์ ๋ณด๋ฅผ ์ด๊ณ ํด๋ฆญํ์ธ์. ์์ .
- ํ์ด์ง ๋งจ ์๋์์ ์ธ์คํด์ค ์ก์ธ์ค ๋ฒ์๋ฅผ ์ ํํฉ๋๋ค. ๋ชจ๋ Cloud API์ ๋ํ ์ ์ฒด ์ก์ธ์ค ๊ถํ.
์คํฌ๋ฆฐ ์ท
- ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฅํ๊ณ ์ธ์คํด์ค๋ฅผ ์์ํฉ๋๋ค.
VM ๋ก๋๊ฐ ์๋ฃ๋๋ฉด SSH๋ฅผ ํตํด VM์ ์ฐ๊ฒฐํ๊ณ ์ค๋ฅ ์์ด ์ฐ๊ฒฐ๋๋์ง ํ์ธํฉ๋๋ค. ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ญ์์ค.
gcloud alpha cloud-shell ssh
์ฑ๊ณต์ ์ธ ์ฐ๊ฒฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค
GKE์ ๋ฐฐํฌ
์ฐ๋ฆฌ๋ IaC(Infrastucture as a Code)๋ก ์์ ํ ์ ํํ๊ธฐ ์ํด ๊ฐ๋ฅํ ๋ชจ๋ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด๊ณ ์์ผ๋ฏ๋ก docker ํ์ผ์ Git์ ์ ์ฅ๋ฉ๋๋ค. ์ด๊ฒ์ ํํธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฟ ๋ฒ๋คํฐ์ค์์์ ๋ฐฐํฌ๋ ์ด ์์ ์์๋ง ์ฌ์ฉ๋๋ yaml ํ์ผ๋ก ์ค๋ช ๋๋ฉฐ, ๊ทธ ์์ฒด๋ ์ฝ๋์ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ๋ฐ๋ํธ์์ ์จ ๊ฒ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ณํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฐ๋ฆฌ๋ ๋ณ์์ ๊ฐ์ ์ทจํฉ๋๋ค BUILD_VERSION ๊ทธ๋ฆฌ๊ณ ์ ํ์ ์ผ๋ก ์ ๋ฌ๋ ๋ณ์์ ๊ฐ ENV.
- Git์์ dockerfile์ ๋ค์ด๋ก๋ํฉ๋๋ค.
- ๋ฐฐํฌ์ฉ yaml์ ์์ฑํฉ๋๋ค.
- scp๋ฅผ ํตํด ์ด ๋ ํ์ผ์ ๋ชจ๋ ํด๋ผ์ฐ๋ ์ฝ์์ ์ ๋ก๋ํฉ๋๋ค.
- ๊ฑฐ๊ธฐ์ ์ปจํ ์ด๋๋ฅผ ๋น๋ํ๊ณ ์ปจํ ์ด๋ ๋ ์ง์คํธ๋ฆฌ์ ํธ์ํฉ๋๋ค.
- ๋ก๋ ๋ฐฐํฌ ํ์ผ์ ํ๋ธ์ ์ ์ฉํฉ๋๋ค.
์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช ํด๋ณด์. ์ผ๋จ ์ฐ๋ฆฌ๊ฐ ์ด์ผ๊ธฐ๋ฅผ ์์ํ์ ENV, ๋ค์ ๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ ๋ฌํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋งค๊ฐ๋ณ์1 ะธ ๋งค๊ฐ๋ณ์2. ๋ฐฐํฌ ์์ ์ ์ถ๊ฐํ๊ณ ๋ค์์ ์ ๋ ฅํฉ๋๋ค. ๋ฌธ์์ด ๋งค๊ฐ๋ณ์.
์คํฌ๋ฆฐ ์ท
๊ฐ๋จํ ๋ฆฌ๋๋ ์ ์ผ๋ก yaml์ ์์ฑํ๊ฒ ์ต๋๋ค. ์์ฝ ํ์ผ๋ก. ๋ฌผ๋ก dockerfile์ ๋ค์์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋งค๊ฐ๋ณ์1 ะธ ๋งค๊ฐ๋ณ์2๋ก๋ ์ด๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ต์ฅํ ์ฑ, ์ง์ ๋ ๋ฒ์ ์ ์ ์ฉํ ์กฐ๋ฆฝ๋ ์ปจํ ์ด๋๋ ๋ค์ ์์น์ ์์ต๋๋ค. ์ปจํ ์ด๋ ๋ ์ง์คํธ๋ฆฌ ๋์ค์ gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION์ด๋์์ $BUILD_VERSION ๋๋กญ๋ค์ด ๋ชฉ๋ก์์ ์ด(๊ฐ) ์ ํ๋์์ต๋๋ค.
ํ ๋ชฉ๋ก
touch deploy.yaml
echo "apiVersion: apps/v1" >> deploy.yaml
echo "kind: Deployment" >> deploy.yaml
echo "metadata:" >> deploy.yaml
echo " name: awesomeapp" >> deploy.yaml
echo "spec:" >> deploy.yaml
echo " replicas: 1" >> deploy.yaml
echo " selector:" >> deploy.yaml
echo " matchLabels:" >> deploy.yaml
echo " run: awesomeapp" >> deploy.yaml
echo " template:" >> deploy.yaml
echo " metadata:" >> deploy.yaml
echo " labels:" >> deploy.yaml
echo " run: awesomeapp" >> deploy.yaml
echo " spec:" >> deploy.yaml
echo " containers:" >> deploy.yaml
echo " - name: awesomeapp" >> deploy.yaml
echo " image: gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION:latest" >> deploy.yaml
echo " env:" >> deploy.yaml
echo " - name: PARAM1" >> deploy.yaml
echo " value: $PARAM1" >> deploy.yaml
echo " - name: PARAM2" >> deploy.yaml
echo " value: $PARAM2" >> deploy.yaml
๋ค์์ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐํ ํ Jenkins ์์ด์ ํธ gcloud ์ํ cloud-shell SSH ๋ํํ ๋ชจ๋๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ฐ๋ ์ฝ์์ ๋ช ๋ น์ ๋ณด๋ ๋๋ค. --๋ช ๋ น.
์ด์ dockerfile์์ ํด๋ผ์ฐ๋ ์ฝ์์ ํ ํด๋๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
gcloud alpha cloud-shell ssh --command="rm -f Dockerfile"
scp๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก ๋ค์ด๋ก๋ํ dockerfile์ ํด๋ผ์ฐ๋ ์ฝ์์ ํ ํด๋์ ๋ฐฐ์นํฉ๋๋ค.
gcloud alpha cloud-shell scp localhost:./Dockerfile cloudshell:~
์ปจํ ์ด๋๋ฅผ ์์งํ๊ณ , ํ๊ทธ๋ฅผ ์ง์ ํ๊ณ , Container Registry์ ํธ์ํฉ๋๋ค.
gcloud alpha cloud-shell ssh --command="docker build -t awesomeapp-$BUILD_VERSION ./ --build-arg BUILD_VERSION=$BUILD_VERSION --no-cache"
gcloud alpha cloud-shell ssh --command="docker tag awesomeapp-$BUILD_VERSION gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION"
gcloud alpha cloud-shell ssh --command="docker push gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION"
๋ฐฐํฌ ํ์ผ์์๋ ๋์ผํ ์์ ์ ์ํํฉ๋๋ค. ์๋ ๋ช ๋ น์ ๋ฐฐํฌ๊ฐ ๋ฐ์ํ๋ ํด๋ฌ์คํฐ์ ๊ฐ์ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค(awsm-ํด๋ฌ์คํฐ) ๋ฐ ํ๋ก์ ํธ ์ด๋ฆ(๋ฉ์ง ํ๋ก์ ํธ), ํด๋ฌ์คํฐ๊ฐ ์๋ ์์น์ ๋๋ค.
gcloud alpha cloud-shell ssh --command="rm -f deploy.yaml"
gcloud alpha cloud-shell scp localhost:./deploy.yaml cloudshell:~
gcloud alpha cloud-shell ssh --command="gcloud container clusters get-credentials awsm-cluster --zone us-central1-c --project awesome-project &&
kubectl apply -f deploy.yaml"
์์ ์ ์คํํ๊ณ ์ฝ์ ์ถ๋ ฅ์ ์ด๊ณ ์ปจํ ์ด๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์กฐ๋ฆฝ๋์๋์ง ํ์ธํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์คํฌ๋ฆฐ ์ท
๊ทธ๋ฆฌ๊ณ ์กฐ๋ฆฝ๋ ์ปจํ ์ด๋์ ์ฑ๊ณต์ ์ธ ๋ฐฐํฌ
์คํฌ๋ฆฐ ์ท
์ผ๋ถ๋ฌ ์ค์ ์ ๋ฌด์ํ์ด์ ์ ๊ตฌ. ํ ๊ฐ์ง ๊ฐ๋จํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ผ๋จ ์ค์ ํ๋ฉด ์์ ๋ ์ง์ ๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ์ด ์ด๋ฆ์ผ๋ก ๋ฐฐํฌ๋ฅผ ์ํํ๋ ํ์์ ๊ด๊ณ์์ด ๊ณ์ ์๋ํฉ๋๋ค. ๊ธ์, ์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ ์ญ์ฌ์ ๋ฒ์๋ฅผ ์กฐ๊ธ ๋์ด์๋ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก ๋์
์์ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์๋ฃํ ์๋ ์์์ง๋ง Jenkins์ muuulion์ฉ ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ํ์ง๋ง ์ด๋ค ์ด์ ์์์ธ์ง ๋๋ ํ๋ฌ๊ทธ์ธ์ ์ข์ํ์ง ์์ต๋๋ค. ๊ธ์, ๋ ์ ํํ๊ฒ๋ ๋๋ ์ ๋ง ๋๋ฌธ์ ๊ทธ๋ค์๊ฒ ์์งํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ ์ ๋ฅผ ์ํด ์๋ก์ด ์ฃผ์ ๋ฅผ ์ ํํ๋ ๊ฒ์ ์ข์ํฉ๋๋ค. ์์ ํ
์คํธ๋ ๋งจ ์ฒ์์ ์ค๋ช
ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด์ ์ป์ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํฉ๋๋ค. ๊ทธ์ ๊ฐ์ด ๋ฐ๋ธ์ต์ค์์ ์ ํ ๋ฌด์์ด ๋๋๊ฐ ์๋ ์ฌ๋๋ค๊ณผ ๊ณต์ ํ์ธ์. ๋ด ์ฐ๊ตฌ ๊ฒฐ๊ณผ๊ฐ ์ ์ด๋ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋๋ค๋ฉด ๋๋ ๊ธฐ๋ปํ ๊ฒ์
๋๋ค.
์ถ์ฒ : habr.com