이번에는 AWS, Docker, Github action을 이용해 서버 자동 배포를 구현해본 것을 설명해보려고 합니다
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
- 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등 다양한 서버 배포와 관련된 시스템이나 서비스들에 대한 공부를 하고 싶어졌다.