Project/싹틔움

[싹틔움] 11/05 κ°œλ°œμΌμ§€ 배포 : Github Actions λ₯Ό ν™œμš©ν•œ CI/CD μžλ™ν™” WorkFlow

ν•œ33 2024. 11. 10. 18:45

🌱 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 탭에 듀어가보면

 

μ΄λ ‡κ²Œ μΆ”κ°€λ₯Ό 해쀄 수 μžˆλ‹€.