์ค์ต #1
1. CI ์ฌ์ ์ค๋น: ๋ฐฐํฌํ๊ณ ์ ํ๋ Java ์ฝ๋ ์์ฑ ๋ฐ Github ์ ๋ก๋
โ ๏ธ ํ์๋ ์ด์ ์ ๊ณต๋ถํ๋ Spring ์ค์ต ์ฝ๋๋ฅผ Github๋ฅผ ์ด์ฉํ ์์ ์ด๋ค.
1. ๋ํดํธ ๋ธ๋์น ์ด๋ฆ์ main์ผ๋ก ๋ฐ๊พธ์ด์ค๋ค.
- ํ์๋ main ๋ธ๋์น๋ก ๋ฐฐํฌํ ๊ฒ์.
git branch -m main
2. ์๊ฒฉ ์ ์ฅ์๋ฅผ ์์ฑํ ํ, ์๊ฒฉ ์ ์ฅ์(Github Repository)์ Push. (sanghyun-e/ci-ci-tutorial)
์๊ฒฉ ์ ์ฅ์๊ฐ ์๋ ๊ฒฝ์ฐ
git remote add origin git@github.com:SangHyun-e/ci-cd-tutorial.git
์๊ฒฉ ์ ์ฅ์๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ
git remote set-url origin git@github.com:SangHyun-e/ci-cd-tutorial.git
- Git ๋ช ๋ น์ด๋ ํด๋น ํฌ์คํ ์ ์ฐธ๊ณ ํ์ !
Git & GitHub #2 - Git ์์๊ณผ Local/Remote Branch ๊ด๋ฆฌ
git commit -m "Blog Posting #2๐ซก"๊ฐ๋ฐ์ํ์ ์ ํ์ ๋๊ตฌ Git๊ณผ Github๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ก์ปฌ ์ ์ฅ์์์ ์์ํ๊ฑฐ๋, ์๊ฒฉ ์ ์ฅ์์์ ์์ํ๋ ๊ฒ์ด๋ค. ์ด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ํด
1000sang-dev.tistory.com
- Dockerfile ๊ตฌ์ฑ์ ํ์ํ ๋ช ๋ น์ด๋ ํด๋น ๋งํฌ์์ ์ฐธ๊ณ ํ์ !
Dockerfile์์ ์์ฃผ ์ฐ์ด๋ ๋ช ๋ น์ด
Engineering Blog by Dale Seo
www.daleseo.com
2. CI: Github ๋ด Java ์ฝ๋๋ฅผ Github Action์ผ๋ก ๊ฐ์ ธ์ Docker ๋น๋.
์์น : Github Action
- Github Repository์ Java ์์ค ์ฝ๋๊ฐ ์ ๋ก๋๋๋ ์๊ฐ (Push) Github Action ์คํฌ๋ฆฝํธ๊ฐ ๊ตฌ๋๋๋ค.
- Github Action ์คํฌ๋ฆฝํธ๋ ์๋์ ๊ฐ์ผ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑ ํ Github์ Java ์ฝ๋์ ํจ๊ป ์ฌ๋ฆฐ๋ค.
1. Java ํ
์คํธ: Java ์ฝ๋๋ฅผ ํ
์คํธ → ์ด๋ฒ ์ค์ต์์๋ ํ
์คํธ ์ ์ธ
2. Java ๋น๋ (ํ๋ก๊ทธ๋จ ๋น๋) : Gradle์ ํตํ Java ๋น๋
./gradlew clean build
3. Docker ์ด๋ฏธ์ง ๋น๋: Docker๋ฅผ ํตํ Docker Image ๋น๋
docker build -t sanghyune/github-actions-demo .
Docker Image ๋น๋๋ฅผ ์ํด ํ์ํ Dockerfile์ ์๋์ ๊ฐ์ด ์ ์
- ์์ Java ๋น๋ ์๋ฃ ํ ์์ฑ ๋ JAR ํ์ผ์ ๊ตฌ๋ํ ์์ง ๋ฒ์ ๋ช
์ ๋ฐ JAR ํ์ผ ๋ฃ์ด์ ํฌ์ฅ
- = JAR ํ์ผ์ ๊ตฌ๋ํ JDK ๋ช
์ ๋ฐ JAR ํ์ผ ์ ์ํ์ฌ Docker Image ๋น๋
- JAR ํ์ผ์ ๊ตฌ๋ํ ์์ง ๋ฒ์ → Amazon Corretto 17 JdK ๋ฒ์ ๋ช ์
- JAR ํ์ผ → ์์ ๋ง๋ JAR ํ์ผ
- ํฌ์ฅ → Docker Image ๋น๋
- = JAR ํ์ผ์ ๊ตฌ๋ํ JDK ๋ช
์ ๋ฐ JAR ํ์ผ ์ ์ํ์ฌ Docker Image ๋น๋
FROM amazoncorretto:17-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
`--build-arg` ๊ฐ์ ์ค์ ํ์ง ์์๋ค๋ฉด, ARG๋ก ์ค์ ํ JAR_FILE์ ์ค์ ํ ๊ธฐ๋ณธ ๊ฐ ์ฌ์ฉ
- ์ฐธ์กฐ : `--build-arg` ๊ฐ์ ํ์ฉํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ ์ฉ → ํด๋น ์ค์ต์์๋ ๋ฐ๋ก ์ฌ์ฉํ์ง ์๋๋ค.
docker build --build-arg JAR_FILE=MOVED.jar -t sanghyune/github-actions-demo .
4. ๋น๋๋ Docker Image ์ ๋ก๋๋ฅผ ์ํ ์ ์ฅ์ Registry๋ก ์ฌ์ฉํ๊ธฐ ์ํ Docker Hub์ ๋ก๊ทธ์ธ
5. Docker Hub์ ์์ ๋น๋ํ Docker Image ์ ๋ก๋ (Push)
3. ์ต์ข ์ ์ผ๋ก Github Actions ์คํฌ๋ฆฝํธ๋ ์๋์ ๊ฐ์ด ์ ์ํ๋ค.
name: Java CI with Gradle
# master ๋ธ๋์น์ push, PR ์ด๋ฒคํธ ๋ฐ์์ ๋์.
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# (1) ํ๋ก๊ทธ๋จ ๋น๋ (Java ๋น๋) 1) Java ๋ฐ Docker ๋น๋๋ฅผ ์ํ ํ๊ฒฝ ์ค์
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# (1) ํ๋ก๊ทธ๋จ ๋น๋ (Java ๋น๋) 2) Java ๋น๋๋ฅผ ์ํ ./gradlew ํ์ผ ๊ถํ ๋ณ๊ฒฝ
- name: Run chmod to make gradlew executable
run: chmod +x ./gradlew
# (1) ํ๋ก๊ทธ๋จ ๋น๋ (Java ๋น๋) 3) Java ๋น๋
- name: Spring Boot Build
run: ./gradlew clean build
# (2) Docker ์ด๋ฏธ์ง ๋น๋ 1) DockerFile ์ ๊ธฐ๋ฐ์ผ๋ก Docker Image ๋น๋
- name: docker image build
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo .
# (2) Docker ์ด๋ฏธ์ง ๋น๋ 2) Docker Hub ์ Login
- name: docker login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PW }}
# (2) Docker ์ด๋ฏธ์ง ๋น๋ 3) Docker Hub ์ ๋น๋๋ ์ด๋ฏธ์ง push
- name: docker Hub push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-demo
GIthub Action ์คํฌ๋ฆฝํธ๋ ์ง์ ์์ฑํ๊ฑฐ๋, ์์ฑํ์ง์๊ณ Github ํํ์ด์ง์์๋ ๋ฐ๋ก ์ค์ ์ด ๊ฐ๋ฅํ๋ค
- ํด๋น ํ๋ก์ ํธ์ Github Repository → Actions → gradle ๊ฒ์ → Java With Gradle Configure

- `script.yml` ํ์ผ ์์ฑ ๋ฐ ์์

ํ์ง๋ง, ์ Github Action ์คํฌ๋ฆฝํธ๋ ๊ตฌ๋๋์ง ์์ ๊ฒ์ด๋ค. → ์๋์ ๊ฐ์ ๊ฐ๋ค์ด ์ฑ์์ง์ง ์์๊ธฐ ๋๋ฌธ. → ๋ณด์์์ ์ด์ ๋ก ๋ฏผ๊ฐํ ๊ฐ๋ค์ด Github Action ์คํฌ๋ฆฝํธ์ ๊ทธ๋๋ก ์ ๋ ฅ๋์ด์์ผ๋ฉด ์๋ฌด๋ ์ฝ๊ณ ํ์ทจ๊ฐ ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ๊ฐ์ ๋ฐ๋ก ์ค์ ํด์ค์ผํ๋ค.
- `${{ secrets.DOCKERHUB_USERNAME }}
- `${{ secrets.DOCKERHUB_PW }}
ํด๊ฒฐ ๋ฐฉ๋ฒ
- Docker Hub ํ์๊ฐ์
ํ My Profile์์ Security์ Access Token์ ์์ฑํ๋ค
- ํ์๋ ์ด๋ฏธ ์์ฑ๋์ด์์ด์ ์์ ์ ๋ฉ๋ชจํด๋ Access Token์ ๋ฃ์ด์ค ์์ ์ด๋ค.(AccessToken์ PW๋ ์์ฑ ๋น์์๋ง ํ์ธํ ์ ์์ด์ ํํ ๋ค๋ฅธ ๊ณณ์ ์ ์ด๋์ !)
- ๊ทธ ๋ค์ Dockerub ํ์๊ฐ์
๋ฐ ๋ฐํํ Access Token์ Github ํ๋ก์ ํธ ์ค์ ์ ์ฃผ์
ํ๋ค.
- GitHub ํ๋ก์ ํธ์์ Settings → Security → Secrets and Variable → Actions
- New repository secret ํด๋ฆญ
- DOCKERHUB_USERNAME์ Docker Hub์ ์ ์ ๋ค์์ ์ ๋ ฅํด์ค๋ค.
- DOCKERHUB_PW์ ์๊น ๋ณต์ฌํด๋ Access Token ๊ฐ์ ๋ถ์ฌ๋ฃ๋๋ค.
๋ชจ๋ ์ค์ ์ด ๋๋๋ฉด ํด๋น `main` ๋ธ๋์น์ ์๋ฌด๊ฑฐ๋ Git Push๋ฅผ ์ํํ๋ฉด Github Action์ด ๋์๋๋ค.
- Git Push ํ๋ฉด
- ์์ฒ๋ผ ์๋์ผ๋ก Github Action์ด ๊ฐ๋๋๊ณ
- ์ฑ๊ณต์ ์ผ๋ก ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค ! ๐
- Github Action์ด ์ ์์ ์ผ๋ก ์ฑ๊ณต๋๋ค๋ฉด, Docker Hub ๋ด ์ ์ฅ์์์๋ ์ ๋ก๋๊ฐ ์ ๋์ด์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ค์ ํฌ์คํ ์ ์ด์ด์ AWS EC2 ์์ฑ ํ, ๋ด๋ถ์ ์ํ์ฌ CI๋ก ๋ง๋ Docker ์ด๋ฏธ์ง๋ฅผ ์คํํ๋ ๊ณผ์ ์ ํฌ์คํ ํ ์์ ์ด๋ค.
โน๏ธ ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
https://www.daleseo.com/dockerfile/
Dockerfile์์ ์์ฃผ ์ฐ์ด๋ ๋ช ๋ น์ด
Engineering Blog by Dale Seo
www.daleseo.com
'๐ปDEV-STUDY > Docker' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker] Dockerize #2 (5) | 2024.11.01 |
---|---|
[Docker] Dockerize #1 (0) | 2024.11.01 |
[Github Action & Docker]์๋: Github Action์ผ๋ก CI / CD ๋ชจ๋ ์๋ ์ฒ๋ฆฌ #3 (4) | 2024.10.29 |
[GitHub Action & Docker] CD: AWS EC2 ์์ฑ ํ ๋ด๋ถ ์ ์ ํ CI๋ก ๋ง๋ Docker ์ด๋ฏธ์ง ์คํ #2 (2) | 2024.10.29 |
[Github Action & Docker] CI / CD ๋ฐฐํฌ (4) | 2024.10.28 |