[배포]AWS+SPRING BOOT + Docker + github action을 사용한 배포-2

이한비·2023년 8월 7일
0

배포

목록 보기
3/4

이번에는 AWS, Docker, Github action을 이용해 서버 자동 배포를 구현해본 것을 설명해보려고 합니다

  1. EC2에서 도커 설치해주기
  2. Github Actions Script 파일 생성해준다
    Github ->Actions -> Java with Gradle
  3. 내가 작성한 코드
name: Java CI with Gradle

on:
  push:
    branches:
      - main

permissions:
  contents: read

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'temurin'
        
         # gradle 캐싱
    - name: Gradle Caching
      uses: actions/cache@v3
      with:
        path: |
          ~/.gradle/caches
          ~/.gradle/wrapper
        key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
        restore-keys: |
          ${{ runner.os }}-gradle-

    - name: Set up NTP
      run: |
        sudo apt-get update
        sudo apt-get install -y ntp
        sudo service ntp start


    - name: make application-db.yml
      run: |
          cd ./src/main/resources
          touch ./application-db.yml
          echo "${{ secrets.DB_PROPERTIES }}" > ./application-db.yml
      shell: bash

    - name: make application-real.yml
      run: |
        cd ./src/main/resources
        touch ./application-real.yml
        echo "${{ secrets.PROPERTIES_PROD }}" > ./application-real.yml
      shell: bash
      
    - name: Grant execute permission for gradlew
      run: chmod +x ./gradlew
    - name: Build with Gradle
      run: ./gradlew build -x test

    - name: Docker build
      run: |
        docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
        docker build -t app -f DockerFile .
        docker tag app ${{ secrets.DOCKER_USERNAME }}/clutchserver:latest
        docker push ${{ secrets.DOCKER_USERNAME }}/clutchserver:latest

        
    - name: Deploy
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.HOST_PROD }} # EC2 인스턴스 퍼블릭 DNS
        username: ubuntu
        key: ${{ secrets.PRIVATE_KEY }} # pem 키
        # 도커 작업
        script: |
          docker pull ${{ secrets.DOCKER_USERNAME }}/clutchserver:latest
          docker stop $(docker ps -a -q)
          docker run -d --log-driver=syslog -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/clutchserver:latest
          docker rm $(docker ps --filter 'status=exited' -a -q)
          docker image prune -a -f
  1. 중요한 정보를 담는 곳

내가 겪은 문제점들

  1. MySql이 제대로 연결 되지 않아서 502 에러 뜨면서 배포가 계속 안됬었다
  • 더 구체적인 문제는 바로 .env파일이 이 깃허브 yml파일에서 생성이 되지 않고 있어서 문제였다
  • env파일을 생성하는 방법을 몰라서 application.yml을 2개로 나누어서
    - name: make application-db.yml
      run: |
          cd ./src/main/resources
          touch ./application-db.yml
          echo "${{ secrets.DB_PROPERTIES }}" > ./application-db.yml
      shell: bash

    - name: make application-real.yml
      run: |
        cd ./src/main/resources
        touch ./application-real.yml
        echo "${{ secrets.PROPERTIES_PROD }}" > ./application-real.yml
      shell: bash

application-db안에 db관련 secret key들을 넣어줬다
application-real안에는 전체적인 secret key들을 넣어줬다
이렇게 생성이 되다 보니 결국에 MySQL이 제대로 연결이 되어 배포가 성공적으로 되었다.
2. main브랜치에다가 Push할 때마다 workflow에 github에서 배포 상태를 보여줬는데 계속 배포 성공했다고 뜨는데 배포가 안되는 이유를 몰랐는데,여기서 얻은 교훈은 ec2터미널에 직접 들어가서 수동 배포를 해보면서 직접 에러 로그를 봐가면서 배포해줘야한다고 느꼈다. 깃헙 workflow에 성공한다고 뜨더라도 직접 터미널에 쳐서 로그를 뜯어보면 오류가 나온다!

후기

생각보다 삽질 하면서 얻어가는 지식도 많고 노하우가 좀 생기는 것 같다...특히 github action 구글링 처음 했을때 저 파일 예시들 보면 이해가 안갔는데 이제는 해당 줄 하나하나 무슨 역할을 하고 어떤 파일을 생성하는지 알 수 있다.
아직 부족한 점이 너무나 많다고 느껴서 Docker랑 Docker-compose, Nginx등 다양한 서버 배포와 관련된 시스템이나 서비스들에 대한 공부를 하고 싶어졌다.

profile
백엔드 개발자

0개의 댓글