์ด ํฌ์คํ ์์๋ MSA ํ๋ก์ ํธ๋ฅผ ์์ฑํ ๋ค, Docker์ Jenkins๋ฅผ ์ด์ฉํ์ฌ CI/CD๋ฅผ ๊ตฌ์ถํ๋ ๊ณผ์ ์ ์ค๋ช ํ๋๋ก ํ๊ฒ ๋ค.
๊ตฌ๊ธ๋ง ํ๋ฉด์ ๋ ํ์ ํ๊ณ , ๋ฌด์ํ ์ฝ์ง๊ณผ ์ด์ ํ๋ก์ ํธ๋ค์ ๋ฌธ์์ ์ฃผ๋ณ ๋๊ธฐ๋ค์ ๋์์ ๋ฐ์ ๋์ ๋ด ํ๋ก์ ํธ์ ํ๊ฒฝ์ ๋ง๊ฒ CI/CD๋ฅผ ๊ตฌ์ถํ ์ ์์๋ค! ๋ถ์กฑํ ๋ถ๋ถ๋ ์์ง๋ง(๋ฌด์ค๋จ ๋ฐฐํฌ X, docker-compse ์ฌ์ฉ X, ๋ณด์ ์ ๊ฒฝ ๋ชป์) ์ค์ค๋ก Docker, Jenkins์ ๊ฐ๋ ์ ๊ณต๋ถํ๊ณ , ๋ฐ๋ก ํ ํ๋ก์ ํธ์ ์ ์ฉํ๋ค๋ ์ ์์ ์ข์๋ค.
์ฝ์งํ๋ฉด์ ๋ฐฐ์ด ๊ฒ์ ์ ๊น๋จน๊ณ ์, ๊ทธ๋ฆฌ๊ณ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋๊ณ ์ ๊ณผ์ ์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
3๊ฐ์ ํฌ์คํ ์ ๋๋ ์ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ผ๋ก ์งํ๋ ๊ฒ์ด๋ค.
1. Docker ์ค์นํ๊ธฐ + ์๋ ๋ฐฐํฌ
2. ์๋ ๋ฐฐํฌ๋ฅผ ์ํ Jenkins ์ค์นํ๊ธฐ
3. GitLab Webhook๊ณผ Jenkinsfile ํ์ฉํ์ฌ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ ๊ตฌ์ถํ๊ธฐ
๐ป ํ๊ฒฝ
- OS : Window
- Server : AWS EC2
- Backend : Spring boot, Spring Cloud(Gateway, Eureka), Gradle, Java11
- Deploy : Docker, Dockerhub, Jenkins
- Git : Gitlab
๐ ํ๋ก์ ํธ ๊ตฌ์กฐ๋
- ๋ฐฑ์๋ 6๊ฐ(๊ทธ๋ฆผ์์๋ 5๊ฐ ๋ง์), DB 2๊ฐ, Jenkins(Docker in docker๋ก ํ๋ค) ์ด 9๊ฐ์ ์ปจํ ์ด๋๋ฅผ ๋ง๋ค ๊ฒ์ด๋ค.
- GitLab์์ push ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ํด๋น ๋ง์ดํฌ๋ก ์๋น์ค๊ฐ ์๋์ผ๋ก ๋ฐฐํฌ๋๋๋ก ํ ๊ฒ์ด๋ค.
CI/CD ๊ณผ์
- ์์ค์ฝ๋๊ฐ ํด๋น ๋ธ๋์น์ push ๋๋ค. (ํธ์ฌ ์ด๋ฒคํธ ๋ฐ์)
- ํ๋ก์ ํธ ๋ด์ Jenkinsfile์ ์ฝ์ด ์คํํ๋ค.
- Git์ ์๋ ํ๋ก์ ํธ๋ฅผ Cloneํด, ๋น๋๋ฅผ ํ๋ค.
- jar ํ์ผ์ด ์์ฑ๋๊ณ , ๋์ปค ์ด๋ฏธ์ง๋ก ๋น๋ํ๋ค.
- ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋์ปค ํ๋ธ์ ์ ๋ก๋ ํ๋ค.
- ์ง๊ธ ๋์ปค์์ run ๋๊ณ ์๋ ํด๋น ์ด๋ฏธ์ง๋ฅผ ์ค์งํ๊ณ , ์ญ์ ์ํจ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋์ปค ํ๋ธ์ ์๋ ์ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ run ํ๋ค.
- Spring ์๋ฒ๊ฐ ๋์ปค ์ปจํ ์ด๋๋ก AWS์ ๋ฐฐํฌ๋๋ค.
์ด ํฌ์คํ ์์ ๋ค๋ฃจ๋ ๋ด์ฉ์ 4~8๊น์ง์ ๊ณผ์ ์ผ๋ก Docker ์ค์น๋ฅผ ํ๊ณ , ์ฐ์ ๋์ปค๋ก ์๋์ผ๋ก ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ํฌ์คํ ์์ Jenkins๋ฅผ ์ค์นํด์ 1~3 ๊ณผ์ ์ ์คํํ๊ณ , 4~8์ ์๋์ผ๋ก ๋ฐฐํฌํ๋ ๊ณผ์ ์ ๋ค๋ฃฌ๋ค.
๐ณ Docker ์ค์น
Ubuntu ์๋ฒ์ Docker๋ฅผ ์ค์นํ๋ค. ์ค์น ๊ณผ์ ์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ค.
(https://docs.docker.com/engine/install/ubuntu/)
- apt ํจํค์ง ์ ๋ฐ์ดํธ ๋ฐ ์ค์น
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg
- Docker GPG key ์ถ๊ฐ
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
- ์ ์ฅ์ ์ค์
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- Docker Engine ์ค์น
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
๐ณ Dockerfile ์์ฑ
Spring Cloud(Gateway, Eureka) Service์ ๊ฐ๊ฐ์ ๋ง์ดํฌ๋ก ์๋น์ค๋ค์ ๋ชจ๋ ๋์ผํ ํ๊ฒฝ์ธ Gradle, Java11์์ ๋์๊ฐ๋ค. ๊ทธ๋์ ํ๋์ Dockerfile๋ฅผ ๋ง๋ค์ด์คฌ๋ค.
FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
ARG JAR_FILE=build/libs/*jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
Java11 jdk๋ก ๋น๋๋ฅผ ํ ๊ฒ์ด๋ค. Spring boot ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๊ฒ ๋๋ฉด `build/libs` ์๋ jar ํ์ผ์ด ์์ฑ๋๋ค. ์์ฑ๋ jar ํ์ผ์ `app.jar` ํ์ผ์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ณต์ฌํด Docker์ image๋ก ๋ง๋ค๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
- `FROM` : ์ด๋ฏธ์ง์ ์ด๋ฆ(Docker Hub์์ ๊ฒ์ํด์ ์ฐพ์ผ๋ฉด ๋จ)
- `VOLUME` : ๊ฐ์์ ๋๋ ํ ๋ฆฌ
- `COPY` : ํ์ฌ ๋๋ ํ ๋ฆฌ์ ํ์ผ → ์ปจํ ์ด๋ ๋ด๋ก ๋ณต์ฌ
- `ENTRYPOINT` : ์ด๋ฏธ์ง๊ฐ ์คํ๋ ๋ ์ํํ ์ปค๋งจ๋
Dockerfile์ด ์์นํ๋ ๊ฒฝ๋ก๋ Spring boot ํ๋ก์ ํธ ๋ฐ๋ก ์๋์ด๋ค.
์ฌ๊ธฐ๊น์ง ํ๋ค๋ฉด ์๋์ ๋ช ๋ น์ด๋ค์ ํตํด ์๊ฒฉ ์๋ฒ์ ์๋ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํ๋ค.
์๋ ๋ฐฐํฌ ๊ณผ์
(ํ๋ก์ ํธ์ ํฐ๋ฏธ๋์์)
- ํ๋ก์ ํธ์์ ์ด๋ฏธ์ง ์์ฑ
docker build -t [Docker Hub ๊ณ์ ]/[์ด๋ฏธ์ง ์ด๋ฆ]
- Docker Hub์ ์ด๋ฏธ์ง ์ ๋ก๋
docker push [Docker Hub ๊ณ์ ]/[์ด๋ฏธ์ง ์ด๋ฆ]
(Ubuntu์์)
- Docker ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ
docker pull [Docker Hub ๊ณ์ ]/[์ด๋ฏธ์ง ์ด๋ฆ]
- Docker ์ด๋ฏธ์ง ์คํ
docker run --name [์ปจํ
์ด๋ ์ด๋ฆ] -d -p [ํฌํธ๋ฒํธ]:[ํฌํธ๋ฒํธ] [Docker hub ๊ณ์ ]/[์ด๋ฏธ์ง ์ด๋ฆ]
์๋ ๋ฐฐํฌ์ ํ์์ฑ
๊ฐ๋ณ ํ๋ก์ ํธ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ธธ ๋๋ง๋ค ๊ธฐ์กด์ Docker ์ปจํ ์ด๋๋ฅผ ์ค๋จ์ํค๊ณ , ์ง์ฐ๊ณ , ์๋ก Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ , ์ ๋ก๋ํ๊ณ , ์คํ์์ผ ๋ฐฐํฌํ๋ ์ผ์ ๋ฒ๊ฑฐ๋กญ๋ค. ์ด๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํด ์ค ํ์์ฑ์ด ๋๊ปด์ง๋ค.
๊ทธ๋ฆฌ๊ณ ๋งค๋ฒ ๋ก์ปฌ์์ ๋ช ๋ น์ด๋ฅผ ์ณ์ ์๋์ผ๋ก ๋ฐฐํฌ๋ฅผ ํ ์๊ฐ ์๋ค. ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ Git ์ ์ฅ์๋ก push ํ ๋๋ง๋ค ์ต์ข ๋ณธ์ธ ๊ทธ ๋ฒ์ ์ผ๋ก ๋ฐฐํฌ๋ฅผ ํ๊ณ ์ถ๋ค.
์ง์์ ํตํฉ๊ณผ ์๋ ๋ฐฐํฌ๋ฅผ ํด์ผ ํ๋๋ฐ, ์ด๋ฅผ ํ๊ธฐ ์ํด์๋ Jenkins๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๋ค์ ํฌ์คํ ์์ Jenkins๋ฅผ ์ค์นํ๊ณ , Webhook์ ํตํ CI/CD๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ๋๋ก ํ๊ฒ ๋ค.