[μΉνμ] 11/05 κ°λ°μΌμ§ λ°°ν¬ : Github Actions λ₯Ό νμ©ν CI/CD μλν WorkFlow
π± CI/CD Workflow
CICD.yml
name: CI/CD
on:
pull_request:
branches: ["main"]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Install JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Gradle
run: |
chmod +x ./gradlew
./gradlew clean build -x test
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build Docker Image
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/ssak:v1 .
- name: Push Docker Image
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/ssak:v1
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Deploy to Server
uses: appleboy/ssh-action@master
with:
username: ubuntu
host: ${{ secrets.SSAKTIUM_SERVER_IP }}
key: ${{ secrets.EC2_SSH_KEY }}
script_stop: true
script: |
# Pull the latest image from DockerHub
sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/ssak:v1
# Stop and remove the existing container if it exists
if [ "$(sudo docker ps -q -f name=daegyuhan-ssak)" ]; then
sudo docker stop daegyuhan-ssak
fi
if [ "$(sudo docker ps -aq -f status=exited -f name=daegyuhan-ssak)" ]; then
sudo docker rm daegyuhan-ssak
fi
# Run the new container
sudo docker run -d --name daegyuhan-ssak -p 8080:8080 ${{ secrets.DOCKERHUB_USERNAME }}/ssak:v1
on:
pull_request:
branches: ["main"]
π main λΈλμΉμ pull request κ° μΌμ΄λ λλ§ μ€ν
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Install JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
π ubuntu μ΅μ λ²μ μμ μ€νμν€κ³ , JDK 17 λ²μ μΌλ‘ μ€ννκ² λ€λ λ§μ΄λ€.
μ¬λ§νλ©΄ λ²μ μ λ³ΈμΈμ νλ‘μ νΈ μ€ν νκ²½κ³Ό λμΌνκ² κ°μ£Όλ κ² μ’λ€.
- name: Build with Gradle
run: |
chmod +x ./gradlew
./gradlew clean build -x test
π Gradle νκ²½μ΄κΈ° λλ¬Έμ λκ°μ΄ λ§μΆ°μ€¬λ€.
clean μ ν λ² νκ³ build λ₯Ό ν΄μ μΉ κ°μμ£Όκ³ , -x test μ΅μ μ μ¨μ μ°μ test λ₯Ό λ리λ κ³Όμ μ μλ΅νλ€.
: νλ‘μ νΈ μ§ν μλλ₯Ό μν΄μ μ°μ μ΄λ κ² μ§ν
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build Docker Image
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/ssak:v1 .
- name: Push Docker Image
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/ssak:v1
π λ΄ νλ‘μ νΈμ jar νμΌμ Docker μ΄λ―Έμ§λ‘ λ§λ€μ΄μ Docker Hub μ μ¬λ €λκΈ° μν μ½λμ΄λ€.
Docker Hub μ λ‘κ·ΈμΈμ νλ€μμ κΈ°μ‘΄μ μμ±λμ΄μλ Repository μ λ±λ‘λμ΄μλ μ΄λ―Έμ§μ λ²μ μ λ§μΆ°μ Build, Push λ₯Ό μ§ννλ€.
DOCKERHUB_TOKEN μ Docker Hub μ μ μν΄μ λ°μ μ μλ€.
Dockerfile
FROM amazoncorretto:17-alpine-jdk
EXPOSE 8080
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Deploy to Server
uses: appleboy/ssh-action@master
with:
username: ubuntu
host: ${{ secrets.SSAKTIUM_SERVER_IP }}
key: ${{ secrets.EC2_SSH_KEY }}
script_stop: true
π deploy κ³Όμ μ΄λ€. λκ°μ΄ νκ²½μ ubuntu μ΅μ λ²μ μΌλ‘ ν΄μ€¬κ³ , λ΄ μΈμ€ν΄μ€μ μλ² IP μ SSH_KEY λ₯Ό μ λ ₯ν¨μΌλ‘μ¨, λ΄ μΈμ€ν΄μ€ SSH μ μ μμ μμΌ°λ€.
script: |
# Pull the latest image from DockerHub
sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/ssak:v1
# Stop and remove the existing container if it exists
if [ "$(sudo docker ps -q -f name=daegyuhan-ssak)" ]; then
sudo docker stop daegyuhan-ssak
fi
if [ "$(sudo docker ps -aq -f status=exited -f name=daegyuhan-ssak)" ]; then
sudo docker rm daegyuhan-ssak
fi
# Run the new container
sudo docker run -d --name daegyuhan-ssak -p 8080:8080 ${{ secrets.DOCKERHUB_USERNAME }}/ssak:v1
π 맨 μμμ build λ¨κ³μμ push νλ λ΄ Docker Hub μ μ΄λ―Έμ§λ₯Ό Pull λ‘ λΉκ²¨μ¨λ€.
π κΈ°μ‘΄μ μ€νλκ³ μλ 컨ν μ΄λλ₯Ό stop νκ³ , remove νλ€.
π Pull λ‘ λΉκ²¨μ¨ μ μ΄λ―Έμ§λ₯Ό 8080 ν¬νΈλ‘ μλ‘ μ€νμν¨λ€.
μμμ νκ²½λ³μ μ€μ μ github νμ΄μ§μ Secrets and variables νμ Actions νμ λ€μ΄κ°λ³΄λ©΄
μ΄λ κ² μΆκ°λ₯Ό ν΄μ€ μ μλ€.