๐ ๋ชฉ์ฐจ
์ง๋ ํฌ์คํ ์์ CI/CD๊ฐ ๋ฌด์์ธ์ง์ ๋ํด ์์๋ณด์๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ํ๋ก์ ํธ ์ด๊ธฐ ์ธํ ๊ณผ ๋๋ถ์ด GitHub Actions๋ฅผ ํ์ฉํด ์ง์ CI/CD๋ฅผ ๊ตฌ์ถํด ๋ณด์.
๐ GitHub์์ ์ค์ ํ๊ธฐ
์ธํ ๋ฆฌ์ ์ด์์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ , ๊นํ๋ธ ๋ ํฌ์งํ ๋ฆฌ์ ์ฐ๊ฒฐํด ์ฃผ๊ฑฐ๋ ๊นํ๋ธ์์ ๋ฐ๋ก ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํด๋ ๋๋ค.
๊นํ๋ธ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํ๋ฉด ๋์ค๋ ํ์ด์ง์์ Actions ํญ์ ์ ํํ๊ฑฐ๋ creating new file์ ์ ํ ํ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ์ค๋ค. Actions ํญ์ ์ ํํ๋ฉด ํ ํ๋ฆฟ์ ๊ฒ์ํ๊ณ ์ ํํ ์ ์๋ ํ์ด์ง๋ก ๋์ด๊ฐ๊ณ , creating new file์ ์ ํํ๋ฉด ๋ฐ๋ก ymlํ์ผ ํธ์ง ํ์ด์ง๋ก ๋์ด๊ฐ ์ ์๋ค.
์ด๋ฏธ ์ง์ํ๊ณ ์๋ ํ ํ๋ฆฟ๋ค์ด์๊ธฐ ๋๋ฌธ์ ๊ฒ์์ ํตํด ์ํ๋ ํ ํ๋ฆฟ์ ์ ํํ๋ฉด ๋๋ค. gradle ํ ํ๋ฆฟ์ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ Java with Gradle์ ์ ํํด ์ค๋ค.
์ด์ ์ํ๋ ๋๋ก ymlํ์ผ์ ํธ์งํด ์ฃผ๋ฉด ๋๋ค.
* creating new file์ ์ ํํด์ ๋ฐ๋ก ํ์ผ ํธ์ง ํ์ด์ง๋ก ๋์ด์จ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ์ค์ ํด์ฃผ์ด์ผ ํ๋ค.
/.github/workflows/gradle.yml
๐ก ymlํ์ผ์ ์์ฑํ๊ธฐ ์ ์, GitHub Actions์ ๋ํด ๊ฐ๋จํ ์์๋ณด์.
- Workflow
- ์ต์์ ๊ฐ๋ ์ผ๋ก ์ฌ๋ฌ Job์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- Event์ ์ํด ํธ๋ฆฌ๊ฑฐ ๋ ์ ์๋ ์๋ํ๋ ํ๋ก์ธ์ค์ด๋ค.
- Event
- Github Repository์์ ๋ฐ์ํ๋ push, pull request open, issue open, ํน์ ์๊ฐ๋ ๋ฐ๋ณต(cron) ๋ฑ์ ํน์ ํ ๊ท์น์ด๋ค.
- workflow๋ฅผ ์คํ(trigger)ํ๋ค.
- Runner
- Github Action Runner app์ด ์ค์น๋ VM
- Workflow๊ฐ ์คํ๋ instance๋ก, ๊ฐ๊ฐ์ Job ๋ค์ ๊ฐ๋ณ์ ์ธ runner์์ ์คํ๋๋ค.
- Job
- ํ๋์ runner์์ ์คํ๋ ์ฌ๋ฌ step์ ๋ชจ์์ ์๋ฏธํ๋ค.
- Step
- ์คํ ๊ฐ๋ฅํ ํ๋์ shell script ๋๋ action์ ์๋ฏธํ๋ค.
- Actions
- Workflow์ ๊ฐ์ฅ ์์ ๋จ์๋ก ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- Job์ ๋ง๋ค๊ธฐ ์ํด Step๋ค์ ์ฐ๊ฒฐํ๋ค.
GitHub Actions์ ๊ตฌ์กฐ์ ๋ํด ๊ฐ๋จํ๊ฒ ์์๋ณด์๋ค.
์๋์์ ์ง์ ymlํ์ผ์ ์์ฑํด ๋ณด์.
๐ ymlํ์ผ ์์ฑํ๊ธฐ
ymlํ์ผ ์์์ด๋ค. develop์ด๋ feature๋ก ์์ํ๋ ๋ธ๋์น์ ์ฝ๋๊ฐ push ๋๊ฑฐ๋ develop์ destinination์ผ๋ก ํ๋ pull request๊ฐ ์์ฑ๋๋ฉด ./gradlew clean test๋ฅผ ์คํํ๋ค.
# Actions ์ด๋ฆ github ํ์ด์ง์์ ๋ณผ ์ ์๋ค.
name: Run Test
# Event Trigger ํน์ ์ก์
(Push, Pull_Request)๋ฑ์ด ๋ช
์ํ Branch์์ ์ผ์ด๋๋ฉด ๋์์ ์ํํ๋ค.
on:
push:
# ๋ฐฐ์ด๋ก ์ฌ๋ฌ ๋ธ๋์น๋ฅผ ๋ฃ์ ์ ์๋ค.
branches: [ develop, feature/* ]
# github pull request ์์ฑ์
pull_request:
branches:
- develop # -๋ก ์ฌ๋ฌ ๋ธ๋์น๋ฅผ ๋ช
์ํ๋ ๊ฒ๋ ๊ฐ๋ฅ
# ์ค์ ์ด๋ค ์์
์ ์คํํ ์ง์ ๋ํ ๋ช
์
jobs:
build:
# ์คํฌ๋ฆฝํธ ์คํ ํ๊ฒฝ (OS)
# ๋ฐฐ์ด๋ก ์ ์ธ์ ๊ฐ์ ๋งํผ ๋ฐ๋ณตํด์ ์คํํ๋ค. ( ์์ : 1๋ฒ ์คํ)
runs-on: [ ubuntu-latest ]
# ์ค์ ์คํ ์คํฌ๋ฆฝํธ
steps:
# uses๋ github actions์์ ์ ๊ณตํ๋ ํ๋ฌ๊ทธ์ธ์ ์คํํ๋ค.(git checkout ์คํ)
- name: checkout
uses: actions/checkout@v4
# with์ plugin ํ๋ผ๋ฏธํฐ ์ด๋ค. (java 17๋ฒ์ ์
์
)
- name: java setup
uses: actions/setup-java@v2
with:
distribution: 'adopt' # See 'Supported distributions' for available options
java-version: '17'
- name: make executable gradlew
run: chmod +x ./gradlew
# run์ ์ฌ์ฉ์ ์ง์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ค.
- name: run unittest
run: |
./gradlew clean test
* name: github actions์ ์ด๋ฆ์ ์ ํ๋ ๋ถ๋ถ
* on: action์ด ์ธ์ ์คํ๋๋์ง์ ๋ํ ๋ถ๋ถ
* jobs: ์ค์ ์คํํ ๋ด์ฉ์ ๋ํ ๋ถ๋ถ
* runs-on: ์ด๋ค ํ๊ฒฝ์์ ์คํํ๋์ง ๊ธฐ์
* steps: ์ค์ ์คํํ ๋จ๊ณ๋ค์ ๊ธฐ์
* name: ์คํ์ ํ์๋ ์ด๋ฆ
* uses: ์ฌ๋ฌ ๊ฐ์ง plugin๊ณผ action์ ์ฌ์ฉ
์ง์ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์์ฑํ ymlํ์ผ์ด๋ค. Spring Boot ๊ธฐ๋ฐ์ ์ค์๊ฐ ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๊ณ , Docker ์ด๋ฏธ์ง๋ฅผ ์์ฑํ์ฌ AWS EC2๋ฅผ ํ์ฉํด ๋ฐฐํฌํ๋ CI/CD ํ์ดํ๋ผ์ธ์ ์ ์ํ ๊ฒ์ด๋ค. ์ฃผ์ ํ๋ฆ์ ์ด๋ ๋ค.
name: CI/CD
# main ๋ธ๋์น์ push ๋๋ pull_request ๋ฐ์ ์ ์คํ
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
# deploy job ์คํ: ubuntu-latest ํ๊ฒฝ์์ ์คํ
# contents: read ๊ถํ์ ์ฌ์ฉํ์ฌ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ด์ฉ์ ์ฝ์ ์ ์๋ค.
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: read
# actions/checkout@v3๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
steps:
- name: Checkout
uses: actions/checkout@v3
# actions/setup-java@v3๋ฅผ ์ด์ฉํด Java 17 ํ๊ฒฝ ์ค์
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'adopt'
# chmod +x ./gradlew๋ฅผ ์คํํ์ฌ Gradle Wrapper(gradlew) ์คํ ๊ถํ์ ๋ถ์ฌ
- name: Give execute permission to gradlew
run: chmod +x ./gradlew
# ./gradlew bootJar ๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ Spring Boot ์ ํ๋ฆฌ์ผ์ด์
์ ๋น๋
- name: Build with Gradle Wrapper
run: ./gradlew bootJar
# docker build๋ฅผ ์คํํ์ฌ Docker ์ด๋ฏธ์ง๋ฅผ ์์ฑ
- name: Build Docker Image
run: |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
docker build -t ${{ secrets.DOCKER_USERNAME }}/chat-app:latest .
docker push ${{ secrets.DOCKER_USERNAME }}/chat-app:latest
# AWS ์๋ฒ์ ๋ฐฐํฌ
- name: Deploy to AWS
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.AWS_HOST }}
username: ubuntu
key: ${{ secrets.AWS_KEYPAIR }}
script: |
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/chat-app:latest
sudo docker run -d --name chat-app -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/chat-app:latest
sudo docker image prune -f
๐ ํ๊ฒฝ๋ณ์ ์ค์ ํ๊ธฐ
๊ณ์ ์ ๋ณด์ ๊ฐ์ด ๋ ธ์ถ๋์ด์๋ ์ ๋๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ํ๊ฒฝ๋ณ์๋ก ์ค์ ํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
Settings ํญ์์ Secrets and variables-actions๋ฅผ ์ ํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ์ด์ง๋ก ์ด๋ํ๋ค. New repository secret๋ฅผ ์ ํํ๋ฉด ์๋์ ๊ฐ์ด ์๋ก ์์ฑํ ์ ์๋ค. ์์ฑ ๋ค์๋ ์์ ์ด๋ ์ญ์ ๋ฅผ ํตํด ํ๊ฒฝ๋ณ์๋ค์ ๊ด๋ฆฌํ ์ ์๋ค.
๐ CI/CD ๊ฒฐ๊ณผ ํ์ธํ๊ธฐ
ํ๊ฒฝ๋ณ์๊น์ง ์ ๋ถ ์ธํ ๋์๋ค๋ฉด, main ๋ธ๋์น๋ก push ๋์์ ๋ ํด๋น ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๊ฒ ๋๋ค. ์์ฐจ์ ์ผ๋ก ์ํฌํ๋ก์ฐ๊ฐ ์งํ๋๊ณ ๊ฒฐ๊ณผ๋ Actions ํญ์์ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
์คํจํ ๋ด์ญ๋ ํ์ธํ ์ ์๊ณ , ๋น์ฐํ ์ ์คํจํ๋์ง๋ ์์ธํ๊ฒ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
ํ์ดํ๋ฅผ ๋๋ฌ๋ณด๋ฉด ์คํจํ ๋ถ๋ถ์ ์๋ฌ ๋ฉ์์ง๋ฅผ ํ์ธํ ์ ์๋ค. ํ์ ๊ฐ์ ๊ฒฝ์ฐ์๋ Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
DockerFile์์ jdk ์ด๋ฏธ์ง๋ฅผ ์์ ํ๊ณ , ๊ณ์ ๋ก๊ทธ์ธ ๊ด๋ จ๋ ๋ถ๋ถ์ Docker์์ token์ ๋ฐ๊ธํ๊ณ ์ค์ ํ์ฌ ํด๊ฒฐํ๋ค.
์ต์ข ์ ์ผ๋ก๋ ์ฑ๊ณตํ ๊ฒ์ ์์ ์ด๋ฏธ์ง์์ ํ์ธํ ์ ์๋ค.
๐ก ์ฌ๊ธฐ๊น์ง GitHub Actions๋ฅผ ํตํด CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์๋ค.
์ด๋ฒ ์ค์๊ฐ ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์ฒ์ CI/CD๋ฅผ ๊ฒฝํํด ๋ณด์์ ๊ทธ๋ฐ์ง
๊ฐ๋จํ ๋ด์ฉ์ด์์ง๋ง ์๊ฐ์ด ์กฐ๊ธ ๊ฑธ๋ ธ๋ ๊ฒ ๊ฐ๋ค.
์ฒ์ ์ ํด๋ณด๋ ๋ด์ฉ์ด๋ผ ์ต๋ํ ์์ธํ๊ฒ ํฌ์คํ ํด ๋์์ผ๋
๋ค์๋ฒ์ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ ์ผ์ด ์๊ธฐ๋ฉด ์กฐ๊ธ์ ๋ ๋นจ๋ฆฌ ์งํํ ์ ์์ง ์์๊น ์ถ๋ค.
* ํฌ์คํ ์ด ๊ธธ์ด์ ธ์ AWS EC2 ๋ฐฐํฌ ๊ณผ์ ์ ์ฐธ๊ณ ๋งํฌ๋ฅผ ์ฌ๋ ค๋์๋ค.
๋ค์ ํฌ์คํ ์์๋ ์ค์๊ฐ ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก์ ํธ์ ๊ดํ ๋ด์ฉ์ ๋ค๋ฃฐ ์์ ์ด๋ค.
๐ ์ฐธ๊ณ
SpringBoot ํ๋ก์ ํธ EC2 ๋ฐฐํฌํ๊ธฐ
๊นํ์ ์๋ ํ๋ก์ ํธ๋ฅผ AWS EC2์ git clone์ ํตํด ๋ด๋ ค๋ฐ์ jar ํ์ผ ๋น๋๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค.(EC2 ์ธ์คํด์ค๋ ์ฐ๋ถํฌ๋ก ์งํํฉ๋๋ค. ๋ํ ๋ฐ๋ก ๋ฐฐํฌ ์์คํ ์ ๊ตฌ์ถํ์ง ์๊ณ ์๋์ผ๋ก ๋ฐฐํฌํ๋๊ฒ๋ง
velog.io
[CI/CD] Github Action์ ํ์ฉํ SpringBoot CI/CD ๊ตฌ์ถ
๋ชฉ์ฐจ 0. ํฌ์คํ ๊ณ๊ธฐ 1. CI/CD ๊ฐ๋ 2. OverView : Github Action + Docker + Nginx + AWS EC2 3. ์คํ๋ง ํ๋ก์ ํธ ๋ด๋ถ์ .yml ํ์ผ ์์ฑ 4. ์คํ๋ง ํ๋ก์ ํธ ๋ด๋ถ์ Dokerfile ์์ฑ 5. Github Actions์ Secrets ๊ฐ ์ค์ 6. Github
aeeazip.tistory.com
[CICD] GitHub Action์ผ๋ก CI/CD ๊ตฌ์ถํ๊ธฐ
Github Action์ผ๋ก CI/CD ๊ตฌ์ถํ๊ธฐ
velog.io
Docker์ GitHub Actions
GitHub Actions๋ GitHub์์ ์ ๊ณตํ๋ CI/CD๋ฅผ ์ํ ์๋น์ค์ ๋๋ค.GitHub Actions๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก ์ฝ๋ ์ ์ฅ์์์ ์ด๋ค ์ด๋ฒคํธ(event)๊ฐ ๋ฐ์ํ์ ๋ ํน์ ์์ ์ด ์ผ์ด๋๊ฒ ํ๊ฑฐ๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์ด๋ค ์
velog.io