2022. 9. 3. 00:45ใSystem ์์ ์ค/DevOps
์ด ๋ด์ฉ์ ์ธํ๋ฐ - Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ ๋ด์ฉ ์
๋๋ค.
ํด๋น ๋ด์ฉ์ Code ๋ด์ฉ์ ์ด ๊ณณ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
๐ ๋ชฉ์ฐจ
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - ์๋ํ ๋๊ตฌ์ ์ฌ์ฉ
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Jenkins + Infrastructure as Code ์์ ์ฐ๋
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Jenkins + Ansible + Kubernetes ์์ ์ฐ๋
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Advenced Jenkins ์ฌ์ฉ โ - Pipeline
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Advenced Jenkins ์ฌ์ฉ โก - SonarQube
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - Advenced Jenkins ์ฌ์ฉ โข - Multi Nodes
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - ์์ฉ ํด๋ผ์ฐ๋ ํ๊ฒฝ์ ๋ฐฐํฌํ๊ธฐ
โ [DevOps] Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ - ๋ถ๋ก
๐ ์๋ํ ๋๊ตฌ์ ์ฌ์ฉ
๐ฝ Jenkins๋ฅผ ์ด์ฉํ CI / CD ์ฌ์ฉ
๐ฆ CI / CD๋ฅผ ์ํ Git, Maven ์ค์
Manage Jenkins -> Jenkins Plugins -> available -> github
์ต์ด github Plugin์ด ์ค์น ๋์ด ์๋์ง ํ์ธ์ ํด์ผ ํด์.
์ค์น๊ฐ ๋์ด ์์ง ์๋ค๋ฉด ์ค์น๋ฅผ ํด์ผ ํฉ๋๋ค.
์ฃผ๋ํ๋์ ์์ ๊ฐ์ด ์ค์น๊ฐ ๋์ด ์์ด์.
Manage Jenkins -> Global Tool Configuration -> git
Jenkins ๊ด๋ฆฌ์์ Global Tool Configuration์ ๋ค์ด๊ฐ๋ฉด ์๋์ ๊ฐ์ด Git์ ๋ํ ์ค์ ๋ถ๋ถ์ด ์์ด์.
์์ ๊ทธ๋ฆผ์์ ์ด๋ฆ์ Git ๊ด๋ จํ์ฌ ์ด๋ฆ์ ์์ ๋กญ๊ฒ ์ง์ ํด ์ฃผ๋ฉด ๋๊ณ , Path to Git executable์๋ git ๊ด๋ จ ๋ช
๋ น์ด๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋์.
์ด ๊ณณ์ git์ ๋ฃ์๋ค๋ ๊ฒ์ git ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ๋, ๋ช
๋ น์ด ์ ๋์ฌ๊ฐ git์ผ๋ก ์์ํ๊ธฐ ๋๋ฌธ์ด๊ณ , ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋์ง๋ฅผ ํ์ธํ๊ธฐ ์ํด์์์.
์ฃผ๋ํ๋์ Synology NAS์ docker๋ฅผ ์ด์ฉํ์ฌ Ubuntu๋ฅผ ์ค์นํ๊ณ , ๊ทธ ์์ Jenkins๋ฅผ ์ค์นํด ์ฃผ์์ด์.
ํ์ฌ Docker๋ก ๊ธฐ๋๋๊ณ ์๋ Container๋ ์์ ๊ฐ์ด 3๊ฐ๊ฐ ์กด์ฌํ๊ณ ์์ด์.
Jenkins๊ฐ ๊ตฌ๋์ค์ธ Container์ ์ ์ํ๊ธฐ ์ํด Container ID ๊ฐ์ ์์ ๊ฐ์ด ์
๋ ฅํ๊ณ , bash shell์ ์ด์ฉํ๊ฒ ๋ค๊ณ ์ ์ํ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด ์ฃผ์๋๋ ํด๋น Container์ ์ ์ํ ์ ์์์ด์.
Jenkins Container์ git์ด ์ค์น ๋์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด ์์ ๊ฐ์ด ํ์ธ์ ํด ์ฃผ์์ด์.
์ฃผ๋ํ๋์ 2.34.1 Version์ git์ด ์ค์น ๋์ด ์์ด์.
์ด๋ฒ์๋ maven plugin์ ์ค์นํด ๋ณด๋๋ก ํ ๊ฒ์.
์์ ๊ฐ์ด maven Plugin์ ์ฐพ์ ์ค์นํด ์ฃผ๋๋ก ํ ๊ฒ์.
ํด๋น Plugin์ด ์ค์น๊ฐ ์๋ฃ ๋์๋ค๋ฉด Global Tool Configuration์ Maven ์ชฝ์ผ๋ก ์ด๋์ ํด ์ฃผ์ธ์.
Add Maven์ ๋๋ฅด๋ฉด ์์ ๊ฐ์ด Maven์ ์ค์นํ๊ณ , ์ค์ ํ ์ ์๋ ๋ถ๋ถ์ด ๋์์.
Install automatically๋ฅผ ๋๋ฅด๋ฉด Jenkins Server์ maven์ ์๋์ผ๋ก ์ค์นํด ์ค ๊ฑฐ์์.
Jenkins Container์์ ์ค์น ๋์ด ์๋์ง ํ์ธํด ๋ณด๊ธฐ ์ํด ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด ์ฃผ์๋๋ ์ญ์ ์ค์น๊ฐ ๋์ง ์์ ๊ฒ์ ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ ์ต์ ๋ฒ์ ๋ณด๋ค ํ๋จ๊ณ ์๋ Version์ธ 3.8.5 Version์ ์ค์นํด ์ฃผ๋๋ก ํ ๊ฒ์.
๋งจ ๋ฐ์ Apply๋ฅผ ๋๋ฅด๊ณ , save๋ฅผ ๋๋ฅธ ๋ค ํด๋น ํ๋ฉด์ ๋์์ค๋๋ค.
์ด๋ฒ์๋ Meven Project๋ฅผ ๋ง๋ค์ด ์ฃผ๋๋ก ํด๋ณผ๊ฒ์.
Jenkins Main ํ๋ฉด์์ new Item์ ๋๋ฅด๋ฉด ์์ ๊ฐ์ ํ๋ฉด์ ๋ง๋ ์ ์์ด์.
์ฃผ๋ํ๋์ ์์ ๊ฐ์ด Item ์ด๋ฆ์ ์ ์ํด ์ฃผ์์ด์.
์ด์ Maven project๋ฅผ ๋๋ฅธ ๋ค OK๋ฅผ ๋๋ฌ์ฃผ๋ฉด ๋ฉ๋๋ค.
General ๋ถ๋ถ์ ๊ฐ๋จํ maven ๊ด๋ จ Command๋ฅผ ์
๋ ฅํด ์ฃผ์์ด์.
Github๊ณผ Jenkins ์ฐ๋์ ์ํด ํด๋น Project๋ฅผ ์ํ Repository๋ฅผ ๋ง๋ค์ด ์ฃผ์์ด์.
์ด์ ์์ ๊ฐ์ด ์ค๋น๋ Repository๋ฅผ ์ฐ๊ฒฐํด ๋ณด๋๋ก ํ ๊ฑฐ์์.
Jenkins์์๋ ์์ค ์ฝ๋ ๊ด๋ฆฌ์ ์์ ๊ฐ์ด Github Repository ์ฃผ์๋ฅผ ์
๋ ฅํด ์ฃผ์์ด์.
Credentials๋ ํด๋น Git hub Repository๊ฐ Private์ด๋ผ๋ฉด ์ ์ํ๊ธฐ ์ํ ๊ณ์ ๊ฐ์ ๋ฃ์ด์ผ ํด์.
ํ์ง๋ง, ์ง๊ธ์ Pubilc์ด๊ธฐ ๋๋ฌธ์ ๋ฃ์ง ์์๋ ๋ฉ๋๋ค.
Pre Steps๋ฅผ ๋๋ฅด๊ฒ ๋๋ฉด ์์ ๊ฐ์ ์ฐฝ์ ๋ง๋ ์ ์์ด์.
ํด๋น Project๋ Meven์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ Source Code๋ฅผ Meven Build Tool๋ก Compile์ ํ๋๋ก ์์
ํ ๊ฒ์ด์์.
Meven ์ค์ ๊ด๋ จ ๋ด์ฉ์ pom.xml์ ๋ค์ด๊ฐ ์์ด์.
Root Pom์ ์ด ์ค์ ๊ฐ์ด ๋ค์ด๊ฐ File์ธ pom.xml์ ๋ฐ๋ผ๋ณด๊ฒ ํด์ฃผ๊ณ ,
Goals and options์๋ Build๋ฅผ ํ ๋, ์ด๋ค ํญ๋ชฉ๋ค์ ๊ฐ์ง๊ณ Buildํ ๊ฒ์ธ์ง๋ฅผ ์ ํํด ์ฃผ์ด์ผ ํ๋๋ฐ, ์ด ๋ด์ฉ์ ์
๋ ฅํด ์ฃผ๋ฉด ๋์.
๋ช ๋ น์ด | ๋ด ์ฉ |
clean | ๊ธฐ์กด์ Buildํ ๋ด์ฉ์ด ์๋ค๋ฉด ์ง์ฐ๊ธฐ ์ํด ์ฌ์ฉ. (target Directory ์ญ์ ) |
compile | Code๋ฅผ Compileํ์ฌ Buildํ๊ธฐ ์ํด ์ฌ์ฉ. |
package | compile๋ ๋ด์ฉ์ ๋ฐ๋ผ pom.xml์ ์ง์ ๋ Option์ ๋ฐ๋ผ Package File ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉ. |
๊ธฐ๋ณธ์ ์ผ๋ก Maven๊ณผ Gradle์ jar, war ํํ์ Package File์ ์ ๊ณตํ๊ณ ์์ด์.
๐ก ์ฐธ๊ณ ์ฌํญ
Spring Boot Project๋ ๋๊ฐ์ง ํํ๋ก Program์ ๊ธฐ๋ํ ์ ์์ด์.
์ฒซ๋ฒ์งธ๋ Web Application์ธ ๊ฒฝ์ฐ ์๋ฒ ๋๋ ํฐ์ผ์ ๋ด์ฅํ๊ณ ์๋ ๊ฒฝ์ฐ์์. ์ด ๋, jar ํํ๋ก Packaging์ ํ์ ๋, ํด๋น jar๋ฅผ ์คํํ๊ฒ ๋๋ฉด ํฐ์ผ์ด ๊ตฌ๋๋๋ ๋ฐฉ์์ด์์.
๋๋ฒ์งธ๋ ๋ด์ฅ๋ ํฐ์ผ์ด ์๋ ๋ค๋ฅธ Web Application Server์ Packaging๋ File์ ๋ณต์ฌํ์ฌ ํด๋น Server ์์์ ๊ธฐ๋๋ ์ ์๊ฒ ๊ตฌ๋๋๋ ๋ฐฉ์์ด๊ณ , ์ด ๋๋ war ํํ๋ก ์ด์ฉ์ ํด์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์.
pom.xml์ ํ์ธํด๋ณด๋ฉด Packaging์ war๋ก ํ๊ฒ ๋ค๊ณ ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ Build๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋๋๋ฉด war File๋ก Packaging์ด ๋ ๊ฒ์ด์์.
์ด๋ ๊ฒ ์ค์ ์ด ์๋ฃ ๋์์ผ๋ฉด ์ ์ฅ์ ํด ์ค๋๋ค.
๊ทธ๋ฐ ๋ค ์ง๊ธ ๋น๋(Build now)๋ฅผ ์ ํํด ์ฃผ๋๋ก ํ ๊ฒ์.
๊ทธ๋ผ ์์ ๊ฐ์ด Build๊ฐ ๋๋ ๊ฒ์ ๋ณผ ์ ์์ด์.
์์ ์์
๋ฒํธ๋ฅผ ๋๋ฅด๋ฉด ๋ณด๋ค ์์ธํ ๋ด์ฉ์ ํ์ธํ ์ ์์ด์.
Console Output์ ๋๋ฅด๋ฉด ์์
๋ด์ฉ์ ๋ณด๋ค ์์ธํ ๋ณผ ์ ์์ต๋๋ค.
์์ ๊ฐ์ด Build ์์
์ด ์ฑ๊ณตํ์์ด์.
ํด๋น Project์ Workapce๋ฅผ ํตํด ๋ด์ฉ์ ํ์ธ ํด ๋ณผ๊ฒ์.
์ด ๊ณณ์์ target์ ๋ค์ด๊ฐ ๋ณด๋ฉด ์๋์ ๊ฐ์ด war File์ด ๋ง๋ค์ด์ง ๊ฒ์ ํ์ธํ ์ ์์ด์.
์ฐธ๊ณ ๋ก Jenkins Container ๋ด์์ ์์ ์์น์ war File์ด ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
๐ฆ CI / CD๋ฅผ ์ํ Tomcat Server ์ฐ๋
์ด๋ฒ์๋ Jenkins Plugin ์ค Deploy to container(Tomcat Plugin)๋ฅผ ์ค์นํด ๋ณผ๊ฒ์.
์์ Plugin์ ์ค์นํด ์ฃผ๋๋ก ํ ๊ฒ์.
๐ก ์ฐธ๊ณ ์ฌํญ
Deploy to container ๋?
Jenkins๋ฅผ ํตํด Packaging ํ war ํน์ jar File์ Tomcat Web Application์ด ์ค์น๋ Server์ ๋ณต์ฌํ์ฌ ๊ตฌ๋.
์ค์น๊ฐ ์๋ฃ ๋์๋ค๋ฉด ๋๋ฒ์งธ Project๋ฅผ ๋ง๋ค์ด๋ณผ๊ฒ์.
General์ ๊ฐ๋จํ ์ค๋ช
๋ฌธ์ ๋ฃ์ด์ฃผ์์ด์.
์์ค ์ฝ๋ ๊ด๋ฆฌ์์ Git์ ์ ํํด ์ฃผ์๊ณ , Repository URL์ ํด๋น Git Repository์ ์ฃผ์๋ฅผ ์
๋ ฅํด ์ฃผ์์ด์.
Public Repository ์ด๊ธฐ ๋๋ฌธ์ Credentials๋ none์ผ๋ก ๋๊ณ , ํด๋น Respository์์ ์์
ํ Branch๋ฅผ ๊ผญ ๋ง์ถฐ์ฃผ์ด์ผ ํด์.
์ฃผ๋ํ๋์ master Branch์ push๊ฐ ๋๋ฉด ์์
ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ master๋ก ํด์ฃผ์์ต๋๋ค.
Build๋ฅผ ํ ๋, Maven Build๋ฅผ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ Root POM์ pom.xml์ ์
๋ ฅํด์ฃผ์ด ์คํ๋ ์ ์๊ฒ ํด์ฃผ์์ต๋๋ค.
๊ทธ ๋ค์ ๋น๋ ํ ์กฐ์น์ ๋ด์ฉ์ ์ถ๊ฐํด ๋ณผ๊ฒ์.
๋น๋ ํ ์กฐ์น ์ถ๊ฐ๋ฅผ ๋์ด Deploy war/ear ...๋ฅผ ์ ํํด ์ค๋๋ค.
Build ๋จ๊ณ์์ war ํน์ jar File๋ก Packaging (์์ถ)์ด ๋ ๊ฒ์ ์ด๋ค ์์
์ ํ ๊ฒ์ธ๊ฐ๋ฅผ ์ ์ํด ์ฃผ๋ ๋ถ๋ถ์ด์์.
์ฃผ๋ํ๋์ ํด๋น Packaging์ Container์ ๋ฐฐํฌ๋ฅผ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ ๋ด์ฉ์ ์ ํํ ๊ฒ์ด์์.
WAR/EAR files์๋ ์์ Directory ๋ชจ๋๋ฅผ ํฌํจํด์ .war๋ผ๊ณ ์ด๋ฆ์ง์ด์ง Packaging๋ File์ ์ ํํ๊ฒ ๋ค๋ ๊ฒ์ด์์.
Context path์๋ ์์์ ํ์ธํ war File ์์น๋ฅผ ์๋ ค์ฃผ๋ฉด ๋์.
๊ทธ๋ฐ ๋ค Tomcat 9 Version์ ์ ํํด์ Container์ ๋ํ ์ ๋ณด๋ฅผ ์
๋ ฅํด ์ค๊ฒ์.
์๋ ์์
์ ์งํํ๊ธฐ ์ ์ Tomcat Web Application Server๋ฅผ ์ค์นํด ์ฃผ์ด์ผ ํด์.
ํด๋น ๋ด์ฉ์ ์ด ๊ณณ์ ์ ๋ฆฌ ํด ๋์์ต๋๋ค.
์ต์ด Credentials์ Add๋ฅผ ๋๋ฌ์ฃผ์ธ์.
์ฃผ๋ํ๋์ Tomcat์ ์ค์นํ ๋, ์์ ๊ฐ์ด ๊ณ์ ๊ณผ ๊ถํ ์ ๋ณด๋ฅผ ์
๋ ฅํด ์ฃผ์์ด์.
์์ ๊ฐ์ด kind์ Username with password๋ฅผ ์ ํํด์ฃผ๊ณ , Username๊ณผ password์ deployer๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.
Tomcat URL์ Tomcat Server๊ฐ ์ค์น๋์ด ์๊ณ , ํด๋น Tomcat Port ๋ฒํธ๋ฅผ ์
๋ ฅํด ์ฃผ์๋ฉด ๋์.
์ฃผ๋ํ๋์ Tomcat Server IP ์ฃผ์๋ ์์ ๊ฐ์ด ๋์ด ์์ด์.
๋ฐฐํฌํ๊ธฐ ์ Tomcat Server์๋ war File์ด Tomcat Home์ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์ง๊ธ ๋น๋๋ฅผ ๋๋ฌ ๋น๋๋ฅผ ์คํ ํด ๋ณผ๊ฒ์.
์ ์์ ์ผ๋ก Build / ๋ฐฐํฌ๊ฐ ์ฑ๊ณตํ ๊ฒ์ ํ์ธํ ์ ์์ด์.
Tomcat Server์ war File๋ ์ ๋ฌ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
Tomcat Manager Page์ ๋ณด๋ฉด /hello-wold ๋ผ๋ ๊ฒฝ๋ก์ Application์ด ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์คํ ์ค์๋ true๋ก ๋์ด ์๋ ๊ฒ์ ๋ณด์ ์ ์ ๊ตฌ๋ ์ค์ธ๊ฒ์ ํ์ธํ ์ ์์ด์.
ํด๋น Application URL์ ์
๋ ฅํด์ ๋ค์ด๊ฐ๋ ์์ฃผ ์ ๋์์ค์ธ ๊ฒ์ ํ์ธํ ์ ์์ด์.
๐ฆ PollSCM ์ค์ ์ ํตํ ์ง์์ ์ธ ํ์ผ ์ ๋ฐ์ดํธ
์ด๋ฒ์๋ Update๋ ๋ด์ฉ์ ํ์ธ์ ํด์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ค๋ฉด Build๋ฅผ ์๋์ผ๋ก ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณต๋ถํด ๋ณผ๊ฒ์.
PollSCM์ Polling ์์
์ ์ฃผ๊ธฐ์ ์ผ๋ก ํ๋ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ Build Triggers(๋น๋ ์ ๋ฐ)์ Build periodically(Code์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ด๋ ์ผ๋จ Build ์ํ)์ cron job์ ๋ง๋ค์ด์ ํน์ ์๊ฐ์ Build๊ฐ ์ง์ ๋๋๋ก ์ค์ ํ ๊ฒ์ด์์.
์ฌ๊ธฐ์๋ ์ผ์ ์๊ฐ์ด ๋๋ฉด ์๋์ผ๋ก ๊ฐ์ ธ์ค๊ฒ ํ๊ฑฐ๋, ๋ณ๊ฒฝ๋ ๋ด์ฉ์ด ์์ผ๋ฉด ๊ฐ์ ธ์ค๋ ์์
์ ํ ์ ์์ด์.
๋ง์ฝ Poll SCM ๋ฐฉ์์ ์ด์ฉํ๋ค๋ฉด Code์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๋, Github์์ ์์ ๋ ๋ด์ฉ์ ๊ฐ์ ธ์ค๊ฒ ๋๋๋ฐ, ์ฆ, Commit์ ๋ํ ๋ด์ฉ์ด ์์๋๋ง ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด์์.
์ฃผ๋ํ๋์ ์ด๋ฒ์ Poll SCM ๋ฐฉ์์ ๊ณต๋ถํด ๋ณผ๊ฒ์.
์์์ ์งํํ Project์์ ๊ตฌ์ฑ Tab์ ํด๋ฆญํ์ฌ ์ค๋๋ค.
์ด ๊ณณ์์ ๋น๋ ์ ๋ฐ ๋ด์ฉ์ ์์ ํด ์ค ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ ์์ ๊ฐ์ด *์ ํ๋ ์
๋ ฅํ๊ณ , ํ ์นธ ๋๊ณ ํด์ 5๊ฐ๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.
์์ ๋ด์ฉ์ Linux / Unix์ Crontab๊ณผ ๋์ผํ๋ฐ, ํด๋น ๋ด์ฉ์ ํ๋ฒ ์ฐพ์๋ณด์๊ธธ ๊ถ๊ณ ๋๋ฆฝ๋๋ค.
์์ ๋ด์ฉ์ ๋งค์ด๋ง๋ค ๋ณ๊ฒฝ์ฌํญ์ ํ์ธํ๊ฒ ๋ค๋ ์๋ฏธ์์.
์์ ๋ด์ฉ์ ์์ ํ๊ณ , Apply -> Save๋ฅผ ๋๋ฌ์ฃผ์ธ์.
์ค์ Web์ ๊ตฌ๋ํ๋ ํ๊ฒฝ์์๋ ๋งค ์ด๋ง๋ค ํ์ธํ๊ฒ ์ค์ ํ์ง ์์๊ฑฐ์์.
์์ ๊ฐ์ด Code๋ฅผ ์ถ๊ฐํด ์ฃผ์์ด์.
๊ทธ๋ฆฌ๊ณ ์์ ๊ฐ์ด Push๋ฅผ ํด์ฃผ์์ด์.
์ด๋ ๊ฒ ์๋์ผ๋ก Jenkins์์ Build ์์
์ด ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์ค์ ๋ฐฐํฌ๊ฐ ์ ๋๋ก ๋์ด์ ์์ ๊ฐ์ด ํ์ธ์ด ๋์์ด์.
๐ฝ Docker๋ฅผ ์ด์ฉํ ์ค์ต ํ๊ฒฝ ๊ตฌ์ฑ
๐ฆ SSH + Docker๊ฐ ์ค์น๋์ด ์๋ Container ์ฌ์ฉํ๊ธฐ
์ด๋ฒ์๋ ์ธ๋ถ์ ์๋ Server์ ๋ฐฐํฌ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋๋ก ํ ๊ฒ์.
๋จผ์ Jenkins์์ publish Over SSH๋ฅผ ์ค์นํด ์ค๊ฒ์.
์ฃผ๋ํ๋์ ์ด์ ์๋์ ๊ฐ์ ์์
์ ํ ๊ฑฐ์์.
1. Jenkins์์ war File์ SSH๋ฅผ ์ด์ฉํด์ Server๋ก ๋ณต์ฌ
2. Server์์ Dockerfile์ ๋ง๋๋๋ฐ, war File๊ณผ Docker Image๋ฅผ ๋น๋ํ์ฌ ๋ง๋ฆ.
3. Docker Image๋ฅผ Container๋ก ์์ฑ.
์ต์ด Jenkins์ Jenkins ๊ด๋ฆฌ์์ ํ๋ฌ๊ทธ์ธ ๊ด๋ฆฌ๋ก ๋ค์ด๊ฐ๋๋ค.
์ค์น ๊ฐ๋ฅ์์ publish Over ssh Plugin์ ์ค์นํด ์ฃผ์ธ์.
์ฃผ๋ํ๋์ Test๋ฅผ ์ํด test_ubunut ๋ผ๋ Container๋ฅผ ํ๋ ์์ฑํด ์ฃผ์์ด์.
์์ ๊ฐ์ด Test์ฉ Ubuntu์ ์ ์ํด ์ค๊ฒ์.
๋จผ์ ์ ๋ช
๋ น์ด๋ฅผ ํตํด apt๋ฅผ update ํด ์ฃผ๋๋ก ํ ๊ฒ์.
์์ ๊ฐ์ด ssh๋ฅผ ์ค์นํด ์ฃผ์ธ์.
systemctl ๋ช
๋ น์ด๋ฅผ ํตํด ssh ๊ธฐ๋ ์ํ๋ฅผ ํ์ธํ๋ ค ํ์์ผ๋, ์์ ๊ฐ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ด์.
์ด๋ฒ์๋ systemctl์ ์ค์นํด ์ฃผ๋๋ก ํ ๊ฒ์.
ํ์ฌ ssh๊ฐ ์ฃฝ์ด์๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
systemctl๋ก ssh๊ฐ ์๋ ๊ธฐ๋๋๊ฒ ํ๊ณ , ๋ฐ๋ชฌ์ ์์ํด ์ฃผ๋ ค ํ๋๋ฐ, ์์ ๊ฐ์ด ๋ฌธ์ ๊ฐ ์๊ธด๋ค๋ฉด /etc/init.d/๋ฅผ ์ด์ฉํด์ ๊ธฐ๋ํ ์ ์์ด์.
์์ ๊ฐ์ด ์ ์ ๊ธฐ๋์ค์ธ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์ด๋ฒ์๋ ์ฃผ๋ํ๋์ด ๋ฆฌ๋
์ค์์ ์ข์ํ๋ Text Editor์ธ vim์ ์ค์นํด ์ค๊ฒ์.
์์ ๋ช
๋ น์ด๋ก ๋ช๊ฐ์ง ์ค์ ์ ๋ฐ๊ฟ์ค๊ฒ์.
์ต์ด Port 22๋ผ๊ณ ์จ์ง ๋ถ๋ถ์ด ์ฃผ์์ฒ๋ฆฌ ๋์ด ์์ํ
๋ฐ, ์ฃผ์์ ํด์ ํ๊ณ , 10022๋ก ๋ฐ๊พธ์ด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค PermitRootLogin์ yes๋ก ๋ฐ๊ฟ Root ๊ณ์ ์ผ๋ก ssh ์ ์์ ํ์ฉํ์ฌ ์ฃผ์์ด์.
(์ค์ ์ด์ Server์ ๊ฐ์ ๊ณณ์์๋ ssh๋ก Root์ ๋ฐ๋ก ์ ๊ทผํ ์ ์๋๋ก ํ๋ฉด ์๋์.)
ํด๋น ๋ช
๋ น์ด๋ก ssh๋ฅผ ์ฌ ๊ธฐ๋ํ์ฌ ์ฃผ์์ด์.
๐ก ์ฐธ๊ณ ์ฌํญ
docker ๊ธฐ๋ ๋ช ๋ น์ด
#docker run --privileged --name {docker container name} -itd -p 10022:10022 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup --cgroups=host {docker Image Name} /usr/sbin/init
privileged : root ๊ถํ์ ํ๋ํ๊ธฐ ์ํ Option
-itd -p : Port Fowarding์ ์ํ Option
ํ์ฌ ssh๊ฐ ์ค์น๋ Ubuntu ip๋ ์์ ๊ฐ์์.
ํ๋ฒ ssh๋ก ์ ์ํด ๋ณผ๊ฒ์.
๊ทธ ์ ์ ํด๋น Container root ๊ณ์ ์ Password๋ฅผ ์์ ๊ฐ์ด ๋ง๋ค์ด ์ฃผ์ธ์.
Password๊ฐ ๋ฑ๋ก๋์ง ์์ผ๋ฉด ssh๋ก ์ ๊ทผํ ์ ์์ด์.
์์ ๊ฐ์ด ์ ์์ ์ผ๋ก ssh๋ก ์ ๊ทผํ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
Jenkins ๊ด๋ฆฌ์์ ์์คํ
์ค์ ์ ๋ค์ด๊ฐ ์ค๊ฒ์.
๋ฐ์ ๋ด๋ฆฌ๋ค ๋ณด๋ฉด ์์ ๊ฐ์ด Publish over SSH๊ฐ ๋์ฌ๊ฑฐ์์. ์ฌ๊ธฐ์ SSH Servers ๋ฐ์ ์ถ๊ฐ ๋ฒํผ์ ๋๋ฌ์ฃผ์ธ์.
๋จผ์ Name์๋ ํด๋น Docker Container ์ด๋ฆ์ ๋ฃ์ด์ฃผ์ธ์.
Hostname์๋ Container์ IP๋ฅผ ๋ฃ์ด์ฃผ์ธ์.
Username์๋ ssh๋ก ์ ์ํ Container ๊ณ์ ์ด๋ฆ์ ๋ฃ์ด์ฃผ์๋ฉด ๋์.
Remote Directory๋ ํ์ฌ ์์น๋ฅผ ์๋ฏธํ๋ . ์ ๋ฃ์ด์ฃผ์์ด์.
Use password ...๋ฅผ ํ์ฑํํ๋ฉด Password๋ฅผ ์
๋ ฅํ ์ ์๋ ๊ณณ์ด ๋์ค๋๋ฐ, root ๊ณ์ ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํด ์ฃผ๋ฉด๋์.
๊ทธ๋ฐ ๋ค Port์๋ ํด๋น Server์ ssh Port ๋ฒํธ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
์์ ๊ฐ์ด Test Button์ ๋๋ ์ ๋, Success๊ฐ ๋ฌ๋ค๋ฉด ์ ์ ์ค์ ํ ๊ฒ์ด์์.
ํด๋น ๊ณต๋ถ๋ฅผ ์ํด ์ฃผ๋ํ๋์ด ์ค์นํ๋ SSH Server์ Docker๋ ์ค์นํด ์ค์ผ ํด์.
์ด ๋ถ๋ถ์ ๋ํด์๋ ์ด ๊ณณ์ ์ ๋ฆฌํด ๋์์ด์.
๐ฆ Docker Container์ ๋ฐฐํฌํ๊ธฐ โ
์๋กญ๊ฒ Item์ ํ๋ ๋ง๋ค์ด ์ค๊ฒ์.
๊ธฐ์กด์ ๋ง๋ค์๋ Item๊ณผ ํฌ๊ฒ ์ฐจ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ Copy from์ ํตํด ์ด ์ ์ ๋ง๋ Project๋ฅผ ๋ถ๋ฌ์ค๋๋ก ํ ๊ฒ์.
์ด ์ ์ Poll SCM์ ํตํด Project๋ฅผ ์งํํ์๋๋ฐ, ์ด๋ฒ์๋ ์ ์ธํ๋๋ก ํ ๊ฒ์.
๊ทธ๋ฆฌ๊ณ , ๋น๋ ํ ์กฐ์น์ Deploy war/ear to a container๋ฅผ ์ญ์ ํด ์ค๊ฒ์.
๊ทธ๋ฐ ๋ค ์์ ๊ฐ์ด ssh๋ฅผ ํตํด ๋ฐฐํฌ๊ฐ ๋๋๋ก ์ค์ ํด ์ค ๊ฒ์ด์์.
Name์๋ SSH Server ์ฆ, Docker Container ์ด๋ฆ์ ์ ์ด์ฃผ๋ฉด ๋์.
Source file์๋ war๊ฐ ๋ด๊ธด Directory ์ด๋ฆ๊น์ง ๋ฃ์ด์ ์
๋ ฅ์ ํด์ค๊ฒ์.
target์ด๋ผ๋ Directory๋ ssh Container์์ ๋ณต์ฌ๋ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ Remove Prifix์ target์ ๋ฃ์ด war File๋ง ๋ณต์ฌ๋๋๋ก ํด์ค๊ฒ์.
ssh๋ฅผ ํตํด ํด๋น Container์ root๋ก ์ ์ํ๊ฒ ๋๋ฉด ์ต์ด Directory ์์น๊ฐ /root์์.
์ด ๊ณณ์ ๊ทธ๋๋ก ๋ณต์ฌ๋๊ฒ ํ๊ธฐ ์ํด ํ์ฌ ์์น๋ฅผ ์๋ฏธํ๋ . ์ ๋ฃ์ด์ฃผ์์ด์.
Exec command์๋ ํด๋น Container์ ๋ณต์ฌ๊ฐ ์๋ฃ๋ ๋ค ์ด๋ค ๋ช
๋ น์ด๋ฅผ ์คํํ ์ง๋ฅผ ์ ๋ ๊ณณ์ธ๋ฐ, ์ด๋ฒ์๋ ๋ณต์ฌ๊ฐ ๋๋ ๊ฒ๊น์ง๋ง ํ์ธํ๊ธฐ ์ํด ๊ณต๋์ผ๋ก ๋๋๋ก ํ ๊ฒ์.
Apply -> save๋ฅผ ๋๋ฌ ํด๋น ์ฐฝ์ ๋์ ์ฃผ์ธ์.
ํ์ฌ ssh Container์ File๋ค์ ์์ ๊ฐ์ด ์์ด์.
์ด์ Build๋ฅผ ์งํํด ๋ณผ๊ฒ์.
Jenkins๊ฐ Build / ๋ฐฐํฌ๊ฐ ์๋ฃ๋์๋ค๊ณ ํ๋ค์!
ssh Container์์ ํ์ธ์ ํด๋ณด๋ hello-word.war๊ฐ ์๊ธด๊ฑธ ํ์ธํ ์ ์์ด์.
์ด๋ฒ์๋ Dockerfile์ ํ๋ ๋ง๋ค์ด์ค๊ฒ์.
From์์๋ Container ์ข
๋ฅ๋ฅผ ์ ๋ ๊ณณ์ธ๋ฐ, tomcat 9.0์ด ์ค์น๋ Container๋ฅผ ์ง์ ํด ์ฃผ์๊ณ ,
COPY ๋ถ๋ถ์ ํ์ฌ Directory์ ์๋ hello-world.war File์ ํด๋น Container์ /usr/local/tomcat/webapps ์์ ๋ณต์ฌํ๊ฒ ๋ค๋ ์๋ฏธ์์.
์ฐธ๊ณ ๋ก ์ง๊ธ Docker Container ์์ ๋ ๋ค๋ฅธ Container๋ฅผ ๋ฃ๊ณ ์๋ค๋ ๊ฒ์ ์์ผ๋ฉด ์๋๋ ๊ฒ์ด์์.
๋ค์ Jenkins์ ํด๋น Project์ ๊ตฌ์ฑ ์ค์ ์ ๋ค์ด์์ ์๊น ๊ณต๋ฐฑ์ผ๋ก ๋จ๊ฒจ๋์๋ ๊ณณ์ ์์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.
๋ช
๋ น์ด ๋ด์ฉ์ docker๋ฅผ Buildํ ๊ฑฐ๊ณ , Container ์ด๋ฆ์ docker-server๋ก ํ ๊ฒ์ด๋ฉฐ, Dockerfile์ ํตํด ํ์ฌ ์์น(.)์์ buildํด๋ผ ๋ผ๋ ์๋ฏธ์์.
์ฌ๊ธฐ์ -f Options์ Dockerfile์ ๋ช
์์ ์ผ๋ก ์
๋ ฅํ์ ๋ ์ฌ์ฉํ๋ Option์ด์์.
๋ค์ Build๋ฅผ ์งํํด ๋ณผ๊ฒ์.
์์
์ด ์ ์์ ์ผ๋ก ์๋ฃ ๋์์ด์!
ssh Container๋ฅผ ํ์ธํด๋ณด๋ Tomcat Container๊ฐ ์ ์์ ์ผ๋ก ์ฌ๋ผ๊ฐ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์์ ๋ช
๋ น์ด๋ก Tomcat Container๋ฅผ ๊ธฐ๋์์ผ ๋ณผ๊ฒ์.
์ฐธ๊ณ ๋ก ํ์ฌ ssh Container์์๋ 8080 Port๋ฅผ ์ฐ๊ณ ์์ง ์์์. ๊ทธ ๋ฐ์ Host Server ๋ฑ์์ 8080 Port๋ฅผ ์ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ถฉ๋๋ ์ผ์ด ์์ด ์์ ๊ฐ์ด Port Forwarding์ ํด ์ฃผ์์ด์.
๋ญ๊ฐ ์์ฒญ๋๊ฒ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์์ ๊ฐ์ด ์ ์์ ์ผ๋ก ์ ์๋๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
์ฐธ๊ณ ๋ก Container๋ฅผ ํ์ธํ ๋๋ ์๋์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ด์.
sudo docker ps
sudo docker ps -a
Container๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด ์๋ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ด์.
sudo docker rm {Container ID ๋๋ Container ์ด๋ฆ}
Docker Image๋ฅผ ํ์ธํ ๋ ์๋ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ด์.
sudo docker images
Docker Image๋ฅผ ์ญ์ ํ ๋๋ ์๋ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ด์.
sudo docker remove image {image Id ํน์ ์ด๋ฆ}
# ๋๋
sudo docker rmi {image Id ํน์ ์ด๋ฆ}
๐ง ์ฐธ๊ณ ์๋ฃ
Jenkins๋ฅผ ์ด์ฉํ CI/CD Pipeline ๊ตฌ์ถ ๊ฐ์