Github Actions로 Springboot 빌드 + Docker image 빌드 자동화하기
깃허브 레포지토리 → Settings → Secrets and variables에서 도커허브의 username과 password를 등록해준다.
DB까지 테스트해야 되니까 application.properties의 내용도 싹다 긁어서 secrets로 등록해준다.
Actions로 들어가서 프로젝트에 맞는 Configure 파일을 작성하고 커밋한다.
name: Build Docker Image
#레포지토리에 push가 되면 master 브랜치에서 workflow를 실행한다.
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
#환경변수를 사용할 수 있도록 application.properties 파일을 생성하는 과정
- name: Make application.properties
run: |
mkdir ./src/main/resources
touch ./src/main/resources/application.properties
echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.properties
#JDK 셋업
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
#Gradle로 빌드
- name: Setup Gradle
uses: gradle/gradle-build-action@v3
- name: Build with Gradle
run: |
chmod +x ./gradlew
./gradlew clean build
#Docker 이미지 빌드
- name: Build Docker Image
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-test .
#Docker 로그인
- name: docker login
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
#Docker Hub에 이미지 push
- name: docker Hub push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-test
커밋하고 Actions 탭에 들어가보면 다음과 같이 workflow가 실행되고 있는 걸 볼 수 있다.(삽질 과정이 좀 많다..)
workflow를 선택해서 들어가보면 workflow 진행 상황을 확인할 수 있고 어느 과정에서 실패했는지도 알 수 있다.
EC2에 접속해서 도커 이미지를 pull 해오고 컨테이너를 실행한다.
$sudo docker pull oksdfn/github-actions-test
$sudo docker run -d -p 8080:8080 oksdfn/github-actions-test
컨테이너가 정상적으로 실행되고 DB사용도 정상적으로 된다.
Github Actions로 AWS EC2 배포 자동화하기
깃허브 workflow에서 EC2를 사용하기 위한 방법으로 github self-hosted runner를 사용하였다. EC2에서 self-hosted runner를 실행하고 있으면 github actions의 작업을 EC2에서 실행할 수 있다.
레포지토리에서 Setting→Actions→Runners로 들어가서 self hosted runner를 생성하고 EC2 OS를 선택해서 나오는 코드를 EC2 터미널에서 실행해준다.
./run.sh 전까지만 실행한다.
마지막 코드까지 실행하면 이런 화면이 나오는데 설정할 부분이 없으면 계속 엔터를 눌러서 넘어간다.
설정이 끝나면 다음 명령어를 차례로 실행하여 self-hosted runner를 서비스로 등록하여 사용한다.
sudo ./svc.sh install
sudo ./svc.sh install sudo ./svc.sh start
self-hosted runner에 대해선 다음 문서에 더 자세히 나와있다.
Configuring the self-hosted runner application as a service - GitHub Docs
You can configure the self-hosted runner application as a service to automatically start the runner application when the machine starts.
docs.github.com
이제 gradle.yml 파일에 배포과정을 추가한다.
name: Build Docker Image
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
...생략
deploy :
#build가 끝나면 실행한다.
needs: build
#self-hosted runner 위에서 실행한다.
runs-on: self-hosted
steps:
#docker 이미지 pull
- name: docker pull
run: sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-test
#실행중인 컨테이너 중지
- name: docker stop container
run: sudo docker stop $(sudo docker ps -q) 2>/dev/null || true
#새로운 컨테이너 실행
- name: docker run new container
run: sudo docker run --name github-actions-test --rm -d -p 8080:8080 ${{ secrets.DOCKERHUB_USERNAME }}/github-actions-test
#사용하지 않는 이미지 등 데이터 삭제
- name: delete old docker image
run: sudo docker system prune -f
작동 확인을 위해 개발환경에서 코드를 살짝 수정하고 커밋-푸쉬한다.
푸쉬하면 자동으로 workflow가 실행된다.
빌드 및 배포 과정이 완료되었다.
EC2 url에 접속해보면 변경 사항이 정상적으로 반영된 걸 볼 수 있다.
'Docker' 카테고리의 다른 글
윈도우 Docker Desktop 설치하기 (0) | 2024.03.08 |
---|