본문 바로가기
DevOps

CI/CD 구축하기(4) - 애플리케이션 배포

by byeongoo 2021. 9. 1.

이번 챕터에서는 EC2 서버에 애플리케이션을 배포하는 방법에 대해서 알아보겠다.  

깃허브에 runner를 세팅하고 build가 끝나면 EC2 서버에서 해당 runner를 실행하여 자동으로 배포가 되게 한다.

 

1. github action deploy job 추가

github action의 yml 파일에 deploy 관련 내용을 추가한다. 내가 실행할 도커 컨테이너의 이름은 spring-template이다. deploy 시 해당 도커 컨테이너가 올라와있으면 중단 후 이미지를 삭제한다. 그리고 도커 허브에 올려놓은 이미지를 받아와서 컨테이너를 서버에 올린다.

name: Java CI with Gradle

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
      
    - name: Build with Gradle
      run: ./gradlew build
      
    - name: Login to DockerHub
      uses: docker/login-action@v1
      with:
        username: ${{secrets.DOCKERHUB_USERNAME}}
        password: ${{secrets.DOCKERHUB_TOKEN}}
    
    - name: build and release to DockerHub
      env:
        NAME: goohoon # 계정 명
        REPO: spring-template # 레포 이름
      run: |
        docker build -t $REPO .
        docker tag $REPO:latest $NAME/$REPO:latest
        docker push $NAME/$REPO:latest
        
    - name: send custom message with args
      uses: appleboy/telegram-action@master
      with:
        to: ${{ secrets.TELEGRAM_TO_ID }}
        token: ${{ secrets.TELEGRAM_TOKEN }}
        args: ${{ github.actor }} 님의 소스 코드가 반영 됐습니다.
        
  deploy:
    needs: build
    name: Deploy
    runs-on: [ self-hosted, label-development ]
    steps:
      - name: Docker run
        run: |
              sudo docker ps -q --filter "name=spring-template" | grep -q . && sudo docker stop "spring-template" && sudo docker rmi  "goohoon/springboot-template"
              sudo docker run -d --name spring-template --rm -p 8080:8080 goohoon/springboot-template

 

2. runners 추가 및 EC2 서버에서 실행

Settings를 들어간다.

 

runners 메뉴에 접속하여 runners를 생성한다. 그리고 EC2 서버에 접속해서 다음 명령어를 통해 다운 및 run.sh 스크립트를 실행한다.

 

생성된 Runners에 label-development를 추가한다.

 

스크립트를 실행해두면 서버에서 deploy 시 자동으로 지정해둔 명령어를 실행하는 것을 볼 수 있다.

 

 

runner 설치 이후 service 로 등록해서 서버가 부팅되면 자동 실행되도록 아래 스크립트를 실행한다.

sudo ./svc.sh install
sudo ./svc.sh start