jenkins์ gitlab ์ฐ๊ฒฐํด์ฃผ๊ธฐ
docker, docker-compose, nginx, jenkins, react, ec2 ๋ฐฐํฌ
1. ๋ฐฐํฌ ํ๋ฆ ์์ฝ ๋ฐ q&a
2. ๋ฐฐํฌ ํ๋ก์ ํธ docker ๋ฐ nginx ํ์ผ ์ค์
3. ์ ํจ์ค์ ๊น๋ฉ ์ฐ๊ฒฐ ๋ฐ ci/cd ์ค์
1. ์ ํจ์ค ์ค์น
๋จผ์ ๋ค์ ๊ธ์ ์ฐธ๊ณ ํด์ ๋์ปค์ธ ๋์ปค๊ฐ ์ ์ฉ๋ ์ ํจ์ค๋ฅผ ec2 ์๋ฒ ๋ด๋ถ์ ์ค์นํด์ฃผ์
Docker in Docker๋ฅผ ์ ์ฉํ Jenkins ์ค์นํ๊ธฐ
โ ์ ๋์ปค๋ฅผ ํตํด ์ค์นํ ์ ํจ์ค์ ๋ ๋์ปค๋ฅผ ์ค์นํ ๊น?
- ๋จผ์ ๋์ปค๋ฅผ ์ฌ์ฉํด ์ ํจ์ค๋ฅผ image&conatainerํ ํด์ ec2 ์๋ฒ์ ์ค์นํด๋๋ค.
- ์ค์น๋ ์ ํจ์ค๋ ์ฐ๊ฒฐ๋ ํ๋ก์ ํธ(๋ณธ ๊ธ์์๋ frontend)์ ๋ํ ci/cd๋ฅผ ๋งก๊ฒ ๋๋๋ฐ, ๋น๋/๋ฐฐํฌํ๋ ๊ณผ์ ์์ ๋์ปค๋ฅผ ์ฌ์ฉํด ์ปจํ ์ด๋ํ ํ๊ธฐ ๋๋ฌธ์ ์ ํจ์ค ๋ด๋ถ์๋ ๋์ปค๊ฐ ํ์ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
2. ์ ํจ์ค ํ๋ก์ ํธ ์์ฑ
1๋ฒ ๋ธ๋ก๊ทธ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ๋์ปค๋ฅผ ์ค์นํ๋ค๋ฉด ๊น๋ฉ๊ณผ ๋์ปค ํ๋ฌ๊ทธ์ธ์ด ์ ์ค์น๋์์ ๊ฒ์ด๋ค.
๋ง์ฝ ์ค์น๊ฐ ์๋์๋ค๋ฉด DashBoard > Manager Jenkins > Plugin Manager์์ gitlab, docker ๊ฒ์ ํ ๊ฐ๊ฐ ์์ 4๊ฐ ํญ๋ชฉ์ ์ค์นํด์ฃผ์
๋ณธ๊ฒฉ์ ์ธ ํ๋ก์ ํธ ์์ฑ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
โ Jenkins ๋ฉ์ธ ํ๋ฉด์์ ์๋ก์ด item์ ๋๋ฌ ํ๋ก์ ํธ๋ฅผ ์์ฑํด์ฃผ์
โ ํ๋ก์ ํธ๋ ํ๋ฆฌ์คํ์ผ๋ก ์์ฑํ๋ค.
Q. ์ ํ์ดํ๋ผ์ธ์ด ์๋๋ผ ํ๋ฆฌ์คํ์ผ๋ก ํ๋์?
A. Jenkins์ ํ์ดํ๋ผ์ธ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ๋น๋ ๋ฐฐํฌ ํ ์คํธ ๋ฑ์ ๊ธฐ๋ฅ์ ๋จ๊ณ๋ณ๋ก ์คํํ ์ ์์ต๋๋ค. ์ถ๊ฐ๋ก ํ์ดํ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ฅผ jenkinsfile๋ก ๋นผ์ ํ๋ก์ ํธ ํ์ผ๊ณผ ํจ๊ป ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ด ๋ณต์กํ๊ฑฐ๋ ๋๊ท๋ชจ ์์ ์ ์ฉ์ดํฉ๋๋ค. ๋ค๋ง ๋ณธ ํ๋ก์ ํธ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๊ตณ์ด ํด๋น ๊ธฐ๋ฅ๋ค์ด ํ์ํ์ง ์์์ ๋น๊ต์ ๊ฐํธํ ํ๋ฆฌ์คํ์ผ๋ก ์งํํ์ต๋๋ค.
3. ์ ํจ์ค -> ๊น๋ฉ ์ฐ๊ฒฐ
โ ์์ค์ฝ๋ ๊ด๋ฆฌ์์ git์ ์ ํํด์ฃผ๊ณ ์ฐ๊ฒฐํ ๋ ํฌ์งํ ๋ฆฌ ์ฃผ์๋ฅผ ์ ๋ ฅํด์ค๋ค.
โ Credential ๊ฐ์ ๊ฒฝ์ฐ์ sshํค๋ apiํ ํฐ์ ์ด์ฉํ๋ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋๋ฐ ๋ณธ ๊ธ์์๋ ๋น๊ต์ ๋จ์ํ ๋ฐฉ์์ธ ๊น๋ฉ ๊ณ์ ์ ํตํด ์ธ์ฆ์ ํ๋ค.
![](https://blog.kakaocdn.net/dn/b3MO8M/btr4t7BPiS3/4cE9Wk5kzQ2vynAude8yAK/img.png)
โ ๋น๋ ์ ๋ฐ > Build when a change is pushed to Gitlab์ ์ ํํ๊ณ ์์ฑ๋ ์นํ url์ ์ ๊ธฐ์ตํด๋์
![](https://blog.kakaocdn.net/dn/pKdos/btr4wGDh9Ve/K0jiHfkwOeEAw1zmogPNO0/img.png)
โ ๊ณ ๊ธ์ ๋๋ฌ๋ณด๋ฉด Secret token๋์ด ์๋ค. generate๋๋ฌ์ ํ ํฐ์ ์์ฑํด์ฃผ๊ณ ์ ๊ธฐ์ตํด๋์. ์์ ์์ฑ๋ ์นํ url๊ณผ ํจ๊ป ๊น๋ฉ์์ ์ค์ ํ ๋ ์ฌ์ฉ๋๋ค
4. ์ ํจ์ค ์ ์คํฌ๋ฆฝํธ ์์ฑ
โ Build Steps > Execute shell ์ ํ
โ ํ๋ก์ ํธ ๋ฃจํธ ํด๋๋ก ์ด๋ ํ dockerfile์ ์คํํ๋ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
cd front-end
# ์ต์ ์ด๋ฏธ์ง ๋น๋ํ๊ณ ๊ธฐ์กด ์ปจํ
์ด๋ ๋ฎ์ด์ฐ๊ธฐ
docker-compose up -d --build --force-recreate
# ๊ธฐ์กด ์ด๋ฏธ์ง ์ฃฝ์ด๊ธฐ
docker image prune -f
โ ์ฐ๋ฆฌ๋ ์ง์ ๊ธ์์ docker-compse๋ก Docekrfile์ ์คํํ๊ฒฝ์ ์ ์ํด๋๊ธฐ ๋๋ฌธ์ ํด๋น docker-compose.yml
ํ์ผ์ ์คํํด์ฃผ๋ฉด ๋๋ค.
# ์ฐธ๊ณ : docker-compose๋ฅผ ์ฐ์ง ์๋ ๊ฒฝ์ฐ
# ํ๋ก์ ํธ ๋ฃจํธ๋ก ์ด๋์ด ํ์ํ ๊ฒฝ์ฐ
cd ${PROJECT_ROOT}
# ๊ธฐ์กด์ ๋์๊ฐ๋ ์ปจํ
์ด๋ ์ฃฝ์ด๊ธฐ
if docker ps -a --filter "name=${CONTAINER_NAME}" > /dev/null; then
docker kill frontend && docker rm frontend
fi
docker build -t ${CONTAINER_NAME} .
docker run -d -p ํฌํธ๋ฒํธ:ํฌํธ๋ฒํธ ${CONTAINER_NAME} --name ${CONTAINER_NAME}
# ๊ธฐ์กด ์ด๋ฏธ์ง ์ฃฝ์ด๊ธฐ
docker image prune -f
โ docker-compose๋ฅผ ์ฐ์ง ์๋ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ shell-script๋ฅผ ์ ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
์ฌ๊ธฐ๊น์ง ํ์ผ๋ฉด jenkins์์์ ์ค์ ์ ๋๋ฌ๋ค.
5. ๊น๋ฉ -> ์ ํจ์ค ์ฐ๊ฒฐ
โ ๋ฐฐํฌํ ํ๋ก์ ํธ๊ฐ ์๋ gitlab ๋ ํฌ์งํ ๋ฆฌ์ ๋ค์ด๊ฐ์ ์ข์ธกํ๋จ settings > Webhooks์ ๋ค์ด๊ฐ์
- ๋ง์ฝ settings๊ฐ ๋ณด์ด์ง ์๋๋ค๋ฉด ๋ฉค๋ฒ ๊ถํ ์ค์ ์ ํ์ธํด์ฃผ์
![](https://blog.kakaocdn.net/dn/bpnCHa/btr4zdAmjUc/innYd8CJEGJtZg2frqC60k/img.png)
โ #3 ์์ ์ป์ webhook URL๊ณผ secret token์ ์ ๋ ฅํด์ฃผ๊ณ ๋ธ๋์น๋ฅผ ์ค์ ํด์ฃผ์
โ ํ๋ก์ ํธ์ ๋ง๋ Trigger ์ค์ ํ Add webhook ํด๋ฆญํ์
โ ํ๋จ์ project hooks์์ ์ํ๋ trigger๋ฅผ ์ ๋ฐํด ํ ์คํธ ํด๋ณด์ 200์ด ๋ณด๋ด์ง๋ฉด ์ฑ๊ณต์ด๋ค.
6. ์ฑ๊ณต!
![](https://blog.kakaocdn.net/dn/bgug3m/btr4tijxJyS/zGKfsTpW7ukvKiVl5b8w01/img.png)
โ ์นํ ์ค์ ์ ์๋ฃํ๊ณ ํ ์คํธ๋ฅผ ๋ณด๋ด๊ฑฐ๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฑธ์ด๋ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด๋ฉด ์ ํจ์ค์์ ์ด๋ฅผ ์ธ์ํ๊ณ ๋น๋๋ฅผ ์งํํ๋ค.
โ ์ฝ์ ์์ํ์ ํ์ธํ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ ์ด๋ ๋์ปคํ์ผ์ ๊ฐ ๋จ๊ณ๊ฐ ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
![](https://blog.kakaocdn.net/dn/x8onJ/btr4t7hAMmn/T1TpiF48Lk8ebNm53KL78k/img.png)
โ ec2 ์๋ฒ์์๋ docker ps
๋ฅผ ํตํด ์ ์์ ์ผ๋ก ์๋์ค์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋๊ธ