Merge pull request #37 from KNU-HAEDAL/feat/action #97
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build & Deploy | |
on: | |
push: | |
branches: [ "main" ] # main 브랜치에 push가 발생하면 workflow가 실행됩니다. | |
permissions: | |
contents: read # 권한을 설정합니다. | |
packages: write # github container registry 관련 권한을 설정합니다. | |
env: | |
REGISTRY: ghcr.io # github container registry를 사용합니다. | |
IMAGE_NAME: knu-haedal/zzansuni_be # 이미지 이름을 설정합니다. | |
VERSION: ${{ github.sha }} # 버전을 설정합니다. | |
jobs: | |
ci: | |
runs-on: ubuntu-latest | |
# set up java | |
steps: | |
- name: Checkout Repository # 저장소를 체크아웃합니다. | |
uses: actions/checkout@v4 | |
- name: Cache Gradle dependencies # Gradle 의존성을 캐시합니다. | |
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 JDK 17 # JDK 17을 설정합니다. | |
uses: actions/setup-java@v4 | |
with: | |
java-version: '17' | |
distribution: 'adopt' | |
- name: Setup Gradle # Gradle을 설정합니다. | |
run: | | |
chmod +x ./gradlew | |
./gradlew clean build | |
- name: Build docker image # Docker 이미지를 빌드합니다. | |
run: docker build -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.VERSION }} . | |
- name: Log into container registry # 컨테이너 레지스트리에 로그인합니다. | |
uses: docker/login-action@v2 | |
with: | |
registry: ${{ env.REGISTRY }} | |
username: ${{ github.actor }} # 현재 github 사용자 이름 | |
password: ${{ secrets.GITHUB_TOKEN }} # 깃허브 액션이 제공하는 토큰 | |
- name: Push image to container registry # 컨테이너 레지스트리에 이미지를 푸시합니다. | |
run: | | |
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.VERSION }} | |
cd: | |
runs-on: ubuntu-latest # ubuntu 최신 버전에서 script를 실행 | |
needs: ci # ci job이 성공적으로 끝나야 cd job이 실행됩니다. | |
# appleboy/ssh-action@master 액션을 사용하여 지정한 서버에 ssh로 접속하고, script를 실행합니다. | |
# script의 내용은 도커의 기존 프로세스들을 제거하고, docker repo로부터 방금 위에서 push한 내용을 pull 받아 실행하는 것입니다. | |
steps: | |
- name: Deploy to server | |
uses: appleboy/ssh-action@master | |
id: deploy | |
with: | |
host: ${{ secrets.HOST }} | |
username: ubuntu | |
key: ${{ secrets.KEY }} | |
port: 22 | |
script: | | |
docker rm -f $(docker ps -qa --filter "name=zzansuni-spring") # 기존 zzansuni-spring 서버만 잡아서 중지합니다. | |
# 기존에 사용되던 spring 이미지만 제거합니다. | |
docker rmi $(docker images -q --filter "reference=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}") || true # 이미지가 없을 경우 에러가 발생하므로, 에러가 발생해도 계속 진행합니다. | |
docker image prune -f # 사용하지 않는 도커 이미지들을 제거합니다. | |
docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} # github container registry로부터 이미지를 pull 받습니다. | |
docker run -d -p 8080:8080 -e SPRING_PROFILES_ACTIVE=prod \ | |
--name zzansuni-spring \ | |
-e KAKAO_CLIENT_SECRET=${{ secrets.KAKAO_CLIENT_SECRET }} \ | |
-e NAVER_CLIENT_SECRET=${{ secrets.NAVER_CLIENT_SECRET }} \ | |
-e KAKAO_REDIRECT_URI=${{ secrets.KAKAO_REDIRECT_URI }} \ | |
-e MYSQL_URL=${{ secrets.MYSQL_URL }} \ | |
-e MYSQL_USERNAME=${{ secrets.MYSQL_USERNAME }} \ | |
-e MYSQL_PASSWORD=${{ secrets.MYSQL_PASSWORD }} \ | |
-e S3_BUCKET=${{ secrets.S3_BUCKET }} \ | |
-e S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }} \ | |
-e S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }} \ | |
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }} |