Skip to content

chore: CORS 미적용건 해결 #105

chore: CORS 미적용건 해결

chore: CORS 미적용건 해결 #105

Workflow file for this run

# Repository의 Actions 탭에 나타날 Workflow 이름으로 필수 옵션은 아니다.
name: TripMingle CI/CD
# Workflow를 실행시키기 위한 Event 목록
# dev 브랜치에 대한 변경 사항(push, pull_request)을 감지하면 해당 브랜치에 CI Workflow를 실행한다.
on:
push:
branches: [ dev ]
pull_request:
branches: [ dev ]
# Workflow가 레포지토리의 콘텐츠에 대해서 읽기 권한만 가지도록 한다.
# 즉, Workflow가 레포지토리의 콘텐츠를 실수로 변경하거나 삭제하는 것을 방지할 수 있다.
permissions:
contents: read
# 해당 Workflow의 하나 이상의 Job 목록
jobs:
# Job 이름으로, build라는 이름으로 Job이 표시
build:
# Runner가 실행되는 환경을 정의하는 부분
runs-on: ubuntu-latest
# build Job 내의 step 목록
steps:
# uses 키워드를 통해 Action을 불러올 수 있다.
# 해당 레포지토리를 check-out하여 레포지토리에 접근할 수 있는 Actions을 불러온다. (@v3은 버전)
- uses: actions/checkout@v3
# 해당 서비스는 자바 스프링을 활용했기 때문에 jdk 17버전을 설정(설치)
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
# Action에 전달할 매개변수 지정
java-version: 17
distribution: 'temurin'
cache: gradle # 빌드 속도를 높이기 위해 gradle 캐시 설정 (매번 gradle 종속성을 계속 설치할 순 없으니)
# gradlew 실행 권한 얻기
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# gradle build (-x test는 테스트를 생략하고 빌드하겠다는 명렁어 옵션)
- name: Build with Gradle
# github에서 제공하는 gradle 빌드 Action
uses: gradle/[email protected]
with:
arguments: clean build -x test
# 파일을 업로드하여 나중에 다운로드에 사용되도록 한다.
# Artifact를 통해 작업을 완료한 후 데이터를 보관하고 동일한 Workflow의 다른 작업에서 공유할 수 있다.
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: TripMingle
# 업로드할 파일의 경로를 지정 (build/libs에 TripMingle jar 파일을 업로드한다.)
# 빌드 단계에서 생성된 jar파일
path: build/libs/TripMingle-0.0.1-SNAPSHOT.jar
deploy:
# needs 키워드는 현재 작업이 의존하는 이전 작업을 지정한다.
# 즉, build 작업이 성공적으로 완료된 후에만 이 작업이 실행된다.
needs: build
# Ubuntu 환경에서 실행 (Github Actions에서 제공하는 기본 실행 중 하나)
runs-on: ubuntu-latest
# Github 이벤트가 push일 때만 작업을 실행
if: github.event_name == 'push'
steps:
# CI 단계에서 업로드한 artifact를 다운로드 한다.
# CI 단계에서 artifact를 업로드했으면 그냥 그거 쓰면 되는거 아닌가?
# -> CI에서 생성된 artifact를 CD단계에서 동일한 artifact를 사용하여 배포의 일관성을 유지
# -> CI에서 생성된 결과물을 바로 사용하기때문에 시간 절약
# -> CI에서 검증한 코드를 CD에서 사용하므로 배포 안정성 높일 수 있음
- name: Download build artifact
uses: actions/download-artifact@v4
with:
# TripMingle 이름으로 업로드된 artifact를 build/libs 경로에 다운로드
name: TripMingle
path: build/libs/
- name: Create .ssh directory and add EC2 host key
# run은 명령을 실행하는데 사용한다.
# ssh 연결 시 해당 호스트에 연결할 때 호스트키를 확인하고, 연결을 안전하게 유지할 수 있다.
run: |
mkdir -p ~/.ssh
ssh-keyscan -H ${{ secrets.EC2_HOST }} >> ~/.ssh/known_hosts
# ec2 접속을 위해 깃허브에서 설정한 ssh key (pem key)를 생성하고 권한을 부여
- name: Create private key file
run: |
echo "${{ secrets.EC2_SSH_KEY }}" > private_key.pem
chmod 600 private_key.pem
# scp 명령을 통해 ec2에 jar 파일을 전송한다.
- name: Upload JAR to EC2
run: |
scp -i private_key.pem build/libs/TripMingle-0.0.1-SNAPSHOT.jar ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }}:/home/${{ secrets.EC2_USERNAME }}/TripMingle.jar
# ec2에 이미 실행 중인 자바 프로세스를 강제종료한다. (-9는 강제종료, -15는 안전하게 종료)
# 프로젝트 내 application.yml에 들어갈 private 데이터에 대해서 .env의 환경 변수들을 읽어와 셀 환경에 설정한다.
# nohup java -jar 를 통해 백그라운드에서 java를 실행하도록 한다. 그리고 log 디렉토리에 app_log.out 파일로 로그를 저장한다.
- name: Deploy to EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
pgrep java && pgrep java | xargs -r kill -9
export $(grep -v '^#' /home/${{ secrets.EC2_USERNAME }}/tripmingle/.env | xargs)
nohup java -jar /home/${{ secrets.EC2_USERNAME }}/TripMingle.jar > /home/${{ secrets.EC2_USERNAME }}/log/app_log.out 2>&1 &
# ec2 접속을 위해 사용한 private key를 삭제해서 보안을 강화한다.
- name: Remove private key file
run: rm -f private_key.pem