
1. ํน์ EC2 ์ธ์คํด์ค ๋ด Docker๋ก Jenkins ์ปจํ
์ด๋ ์ด์
2. Jenkins์์ ํน์ Bitbucket Repository branch ๋ฅผ Pull ๋ฐ์ ์ดํ Execute Shell์ ํ์ฉํ์ฌ gradle clean build
3. ์ํฐํฉํธ(Jar)๋ฅผ SSH๋ฅผ ํตํด ํน์ ํธ์คํธ ๋ด ํน์ ๋๋ ํ ๋ฆฌ๋ก ์ ์ก
4. ์ ์คํฌ๋ฆฝํธ์ DockerFile์ ํตํด ECR ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ ECS ํด๋ฌ์คํฐ์ ๋ฐฐํฌ
5. ํด๋น ๋ธ๋์น์ ๋ฐ์๋ Git Commit Log๋ฅผ Slack Webhook์ผ๋ก ์ ์ก
ํด๋น ๊ธ์์๋ Jenkins Images๋ฅผ Pull ๋ฐ๊ณ Docker Container๋ก ๋์ํ๋ ๋ถ๋ถ์ ์ ์ธ ํ๋๋ก ํ๊ฒ ๋ค. Jenkins Home ๊น์ง ์ง์ ์ด ๋ ์ํ์์ ์ค๋ช ๋ ๊ธ์ด๊ธฐ ๋๋ฌธ์ Jenkins๋ฅผ ์ปจํ ์ด๋๋ก ๋์ํ๋ ๊ณผ์ ์ ์๊ณ ์ถ๋ค๋ฉด ์ ์ ๋ฆฌ ๋์ด์๊ณ ๋ณด๊ธฐ ์ข์ ์ฐธ์กฐ ๋ฌธ์๋ค์ด ๋ง๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๊ธ์ ์ฐธ๊ณ ํ๊ธฐ ๋ฐ๋๋ค.




์ต์ํ์ ๊ถํ์ ์์ค์ฝ๋ ๊ด๋ฆฌ์ Webhook์ ๋ฐ๊ธฐ ์ํด Repository, Webhook ์ ๊ทผ๊ถํ์ด ํ์ํ๋ค.
โป ์ถ๊ฐ๋ก ํ์ํ ๋ถ๋ถ๋ค์ ์ฒดํฌ ์ดํ ์ฌ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค

๐จ ๊ณ ๋ ค ์ฌํญ : ๋ฐ๊ธ ์ดํ ๋ฑ ํ ๋ฒ๋ง ํ์ธ์ด ๊ฐ๋ฅํ๋ฏ๋ก ๋ณ๋์ ์ ์ฅ์๋ ๊ฐ์ธ์ด ๊ด๋ฆฌ๊ฐ ํ์ํจ



- Username : ํ์๊ด๋ฆฌ ๊ณ์ ์ด๋ฆ์ ๋ํ๋ด๋๊ฒ ๋๋ถ๋ถ์ด๋ค.
- Password :
Bitbucket์์ ์์ฑ๋ App Password- ID : Jekins ๋ด์์ Credentials๋ฅผ ์๋ณํ๋ ์๋ณ์
- Description : ํด๋น Credentials๋ฅผ ๋ํ ๊ฐ๋จํ ์ค๋ช


์ค์น๊ฐ ์ ๋ ๊ฒฝ์ฐ Available pligins ์ ๋ค์ด๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ฉด ๋๋ค.


- Name : SSH ์๋ฒ ๋ณ์นญ
- Hostname : SSH ์๋ฒ ํธ์คํธ ์ฃผ์
- Username : SSH ์๋ฒ ์์ด๋
- Remote Directory : SSH ์๋ฒ Remote ๊ฒฝ๋ก ์์น
- Passphrase / Password : SSH ์๋ฒ ๋น๋ฐ๋ฒํธ
๐จ โป SSH Password ์ค์ ์ sshd_config ํ์ผ์์ PasswordAuthenticateion ์ํ ๊ฐ์ yes ๋ก ๋ณ๊ฒฝ


**๐จ ํ ํฐ๊ฐ์ Jekins Slack Credential ์ค์ ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์ตํด๋๊ธฐ!!


์ค์น๊ฐ ์ ๋ ๊ฒฝ์ฐ Available pligins ์ ๋ค์ด๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ฉด ๋๋ค.



- Secret : 1๋ฒ์์ ๋ง๋ Slack Jenkins CI ํ ํฐ
- ID : ์ฑ๋ ID ๋๋ ๊ณ ์ ID ๋ฅผ ์ง์
- Description : ํด๋น Credential ์ค๋ช

- Workspace : Slack ์ํฌ์คํ์ด์ค ์ด๋ฆ
- Credential : Jenkins๊ฐ Slack API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ธ์ฆ ์ ๋ณด
(ํ ํฐ)/ 3๋ฒ์์ ๋ง๋ Credential ์ ์ฉ- Default channel / member id : ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์์ง๊ฐ ์ ์ก๋ Slack ์ฑ๋
(#์ฑ๋๋ช )๋๋ ์ฌ์ฉ์(@์ฌ์ฉ์๋ช )
# Amazon์์ ์ ๊ณตํ๋ Corretto OpenJDK 11 ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ณธ ์ด๋ฏธ์ง๋ก ์ฌ์ฉํฉ๋๋ค.
FROM amazoncorretto:11
# ๋น๋์ ์ ๋ฌ๋ฐ์ jar ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ ์ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ํ์ฌ ๋๋ ํ ๋ฆฌ์ weather-1.0.0-BUILD-SNAPSHOT.jar ํ์ผ์
๋๋ค.
ARG JAR_FILE=./weather-1.0.0-BUILD-SNAPSHOT.jar
# ์ ๋ฌ๋ฐ์ jar ํ์ผ์ ์ปจํ
์ด๋ ๋ด๋ถ์ app.jar๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ณต์ฌํฉ๋๋ค.
COPY ${JAR_FILE} app.jar
# Spring ํ๋กํ์ 'dev' ํ๊ฒฝ์ผ๋ก ํ์ฑํํฉ๋๋ค.
ENV SPRING_PROFILES_ACTIVE=dev
# ์ปจํ
์ด๋ ๋ด๋ถ์ ์๊ฐ๋๋ฅผ ํ๊ตญ ์๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค.
ENV TZ=Asia/Seoul
# ์ปจํ
์ด๋๊ฐ ์์๋ ๋ ์คํ๋ ๋ช
๋ น์ด์
๋๋ค.
# ์ต์ ํ ๋ฉ๋ชจ๋ฆฌ 512MB, ์ต๋ ํ ๋ฉ๋ชจ๋ฆฌ 2048MB๋ก JVM์ ์คํํ๋ฉฐ, app.jar๋ฅผ ์คํํฉ๋๋ค.
ENTRYPOINT ["java", "-Xms512m", "-Xmx2048m", "-jar", "app.jar"]
- FROM : Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ๋ ๊ธฐ๋ฐ ์ด๋ฏธ์ง(Base image) ๋ฅผ ์ง์ ํ ๋ ์ฌ์ฉ
- ARG : Docker ์ด๋ฏธ์ง ๋น๋ ๊ณผ์ ์ค์ ์ฌ์ฉํ ์ ์๋ ์ธ์(argument)๋ฅผ ์ค์
- COPY : ๋ก์ปฌ์ ์๋ ํ์ผ ๋๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ด๋ฏธ์ง ๋ด๋ถ๋ก ๋ณต์ฌ
- ENV : ์ปจํ ์ด๋ ๋ด๋ถ์์ ์ฌ์ฉํ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์
- ENTRYPOINT : Docker ์ปจํ ์ด๋๊ฐ ์คํ๋ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋๋ ๋ช ๋ น์ด๋ฅผ ์ง์
#!/bin/bash
# AWS ECR ๋ก๊ทธ์ธ (๋์ปค ํด๋ผ์ด์ธํธ ์ธ์ฆ)
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 998251115309.dkr.ecr.ap-northeast-2.amazonaws.com
# Docker ์ด๋ฏธ์ง ๋น๋ (๋ก์ปฌ Dockerfile ์ฌ์ฉ)
docker build -t dev-weather /home/admin/weather-dev
# Docker ์ด๋ฏธ์ง ํ๊ทธ ์ง์ (ECR ๋ ํฌ์งํ ๋ฆฌ์ ๋ง๊ฒ ๋ณ๊ฒฝ)
docker tag dev-weather:latest 998251115309.dkr.ecr.ap-northeast-2.amazonaws.com/dev-weather:latest
# AWS ECR๋ก Docker ์ด๋ฏธ์ง ์
๋ก๋
docker push 998251115309.dkr.ecr.ap-northeast-2.amazonaws.com/dev-weather:latest
# ๋ก์ปฌ Docker ์ด๋ฏธ์ง ์ญ์ (๋์คํฌ ๊ณต๊ฐ ํ๋ณด)
docker rmi 998251115309.dkr.ecr.ap-northeast-2.amazonaws.com/dev-weather:latest
docker rmi dev-weather:latest
# AWS ECS ์๋น์ค ๊ฐ์ ์ฌ๋ฐฐํฌ (์๋ก์ด ์ด๋ฏธ์ง ์ ์ฉ)
aws ecs update-service --cluster dev-weather-cluster --service dev-weather-service --force-new-deployment



- Repository URL : Git Repository URL
- Credentials : Jenkins์์ ๋ฑ๋กํ Bitbucket Credentials ์ค์
- Branch Specifier : ๋ธ๋์น๋ช
๐จ ๊บผ์ง๋ถ๋ ๋ค์๋ณด์!!!!!



chmod +x ./gradlew1) ์ด ๋ช
๋ น์ด๋ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์๋ gradlew ํ์ผ์ ์คํ ๊ฐ๋ฅ(executable)ํ๊ฒ ๋ง๋๋ ๋ช
๋ น์
๋๋ค.
2) chmod ๋ช
๋ น์ด๋ ํ์ผ์ ์ ๊ทผ ๊ถํ(permission)์ ๋ณ๊ฒฝํ๋ ๋ช
๋ น์ด์
๋๋ค.
3) +x ์ต์
์ ํ์ผ์ ์คํํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋ ์๋ฏธ์ด๋ฉฐ, ์ฃผ๋ก ์คํฌ๋ฆฝํธ๋ ์คํํ์ผ์ ์คํํ๊ธฐ ์ํด ์ค์ ํฉ๋๋ค.
4) ./gradlew๋ Gradle Wrapper๋ก, ํ๋ก์ ํธ์์ ์ ์ํ Gradle ๋ฒ์ ์ ์๋์ผ๋ก ๋ค์ด๋ก๋ํ๊ณ ๋น๋ํฉ๋๋ค.
๐จ ์ฆ, ์ด ๋ช ๋ น์ด๊ฐ ์์ผ๋ฉด ./gradlew ์คํ ์ Permission denied ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
./gradlew clean build1) ์ด ๋ช
๋ น์ด๋ Gradle ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๋ ๊ณผ์ ์
๋๋ค.
2) clean์ ์ด์ ๋น๋์์ ์์ฑ๋ ๋ชจ๋ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ญ์ ํ๋ ์์
์
๋๋ค.
3) ์ฃผ๋ก ์ด์ ๋น๋๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ์ถฉ๋์ด๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
4) build๋ ํ๋ก์ ํธ์ ์์ค๋ฅผ ์ปดํ์ผํ๊ณ , ํ
์คํธ๋ฅผ ์ํํ ํ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ(JAR/WAR ๋ฑ)์ ์์ฑํฉ๋๋ค.



- Name : Jenkins System์์ ์ค์ ํ SSH
- Source files : ๋น๋๋ ๊ฒฐ๊ณผ๋ฌผ(artifact)์ ๋ํ ๊ฒฝ๋ก ์์น
- Remove prefix : ์ ๋์ฌ๋ก ์ง์ ๋ ๊ฒฝ๋ก๋ฅผ ์ ๊ฑฐํ ํ ๋๋จธ์ง ๊ฒฝ๋ก๋ง ์ฌ์ฉ
- Remote directory : ์ ์ก๋ ์ํฐํฉํธ๋ฅผ ๋์ ์๋ฒ ์ํ๋ ๊ฒฝ๋ก
- Exec command : ์ํฐํฉํธ๋ฅผ ์๊ฒฉ ์๋ฒ์ ์ ์กํ ํ ์คํํ ๋ช ๋ น์ด
์ ์คํฌ๋ฆฝํธ์ ๋ฐฐํฌ์ ๋ํ ๋ช ๋ น์ด๋ฅผ ์ ์ํด๋จ์ผ๋ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ!!!!!

- Notification message includes : Jenkins๊ฐ Slack์ผ๋ก ๋ณด๋ผ ์๋ฆผ ๋ฉ์์ง์ ํฌํจํ ํญ๋ชฉ๋ค์ ์ ํํ ์ ์๋๋ก ํด์ฃผ๋ ์ค์ ์ ๋๋ค.
- Credential : Jenkins System์์ ์ค์ ํ Slack Credentials
โญ ๋ณ๋์ ์คํฌ๋ฆฝํธ ์์ฑ ์์ด ํ๋ฌ๊ทธ์ธ์ ์ฝ๊ณ ๊ฐํธํ๊ฒ ์ถ๊ฐ ๋ฐ ์ฌ์ฉ ๊ฐ๋ฅ
โญ ์ฝ๋ ์์ด ์ง๊ด์ ์ธ GUI ๊ธฐ๋ฐ์ ๊ด๋ฆฌ
โญ ๋น ๋ฅด๊ณ ์ฌ์ด ์ค์ ์ด ๊ฐ๋ฅํ๋ค. ์ฆ, ๊ตฌ์ฑ ์๋๊ฐ ๋น ๋ฅด๋ค.
โญ ๋ฌ๋์ปค๋ธ๊ฐ ๋ฎ๊ธฐ ๋๋ฌธ์ ์ ๊ท ์ฌ์ฉ์๋ ์ง์
์ฅ๋ฒฝ์ด ๋งค์ฐ ๋ฎ์ ์ฅ์ ์ด ์๋ค.