기본적인 github ci/cd 관련 내용은 아래 글 확인하여 만들어주시면 됩니다.
02. 개인 프로젝트에서 많이 쓰는 CI/CD 구축(Spring Boot)
1. 사전작업1) Spring Boot 프로젝트 설정URL : https://start.spring.io/ • 프로젝트 이름: pcy-server • Java 버전: 17 • Dependencies: Spring Web, Spring Boot DevTools 프로젝트를 생성한 후, 인텔리제이로 프로젝트
jakedevdiray.tistory.com
현업 프로젝트에서는 민감한 값을 따로 관리하기 위해 application.yml 파일을 분리하는 경우가 많습니다. 이 파일에는 데이터베이스 비밀번호, API 키와 같은 중요한 정보가 포함되기 때문에 .gitignore 파일에 추가하여 버전 관리 시스템(Git 등)에 포함되지 않도록 설정합니다. 하지만, 이러한 설정 때문에 배포 시마다 application.yml 파일을 따로 추가해줘야 하는 번거로운 과정이 발생하게 됩니다.
이 글에서는 GitHub Actions를 사용하여 배포 과정에서 이러한 application.yml 파일을 자동으로 추가하는 방법을 설명하고자 합니다. 이를 통해 배포 과정의 번거로움을 줄이고, 민감한 정보의 안전한 관리를 도모할 수 있습니다.
1 .gitignore에 application.yml 추가
....
### VS Code ###
.vscode/
### ETC ###
application.yml
• .gitignore 파일을 수정한 후 Git이 이를 인식하도록 다음 명령어를 실행합니다.
$ git rm -r --cached .
명령어 구성 요소
1) git rm
• git rm 명령어는 Git의 인덱스(index)와 워킹 디렉토리(work tree)에서 파일을 제거합니다.
2) -r
• -r 옵션은 재귀적으로 제거하겠다는 의미입니다. 디렉토리와 그 안의 모든 파일 및 하위 디렉토리를 제거합니다.
3) --cached
• --cached 옵션은 워킹 디렉토리에서 파일을 제거하지 않고 인덱스에서만 파일을 제거합니다. 즉, 파일이 Git의 추적 대상에서 제외되지만 로컬 파일 시스템에서는 여전히 존재하게 됩니다.
4. . (점)
• 현재 디렉토리와 그 하위 모든 파일 및 디렉토리를 대상으로 합니다.
2. application.yml 파일 작성
• src/main/resources/application.yml
spring:
application:
name: pcy-server
server:
port: 8080 # 서버 포트 번호를 설정합니다.
logging:
level:
root: info # 전체 로그 레벨을 설정합니다.
3. Github에 resources 폴더가 push 되도록 임의의 파일 하나 생성
• src/main/resources/empty.txt
4. Gitbub Actions 코드 수정
• .github/workflows/deploy.yml
name: Deploy to EC2
on:
push:
branches:
- main
jobs:
Deploy:
runs-on: ubuntu-latest
steps:
- name: SSH로 EC2에 접속하기
uses: appleboy/ssh-action@v1.0.3
env:
APPLICATION_PROPERTIES: ${{ secrets.APPLICATION_PROPERTIES }}
with:
host: ${{ secrets.EC2_HOST }} # EC2의 주소
username: ${{ secrets.EC2_USERNAME }} # EC2 접속 username
key: ${{ secrets.EC2_PRIVATE_KEY }} # EC2의 Key 파일의 내부 텍스트
envs: APPLICATION_PROPERTIES
script_stop: true # 아래 script 중 실패하는 명령이 하나라도 있으면 실패로 처리
script: |
cd /home/ubuntu/pcy-server
rm -rf src/main/resources/application.yml
git pull origin main
echo "$APPLICATION_PROPERTIES" > src/main/resources/application.yml
./gradlew clean build
sudo fuser -k -n tcp 8080 || true
nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &
env:
APPLICATION_PROPERTIES: ${{ secrets.APPLICATION_PROPERTIES }}
• 역할: 워크플로우 실행 중 사용할 환경 변수를 설정합니다.
• 내용: APPLICATION_PROPERTIES라는 환경 변수를 설정하고, 그 값은 GitHub Secrets에 저장된 APPLICATION_PROPERTIES 값을 가져옵니다.
envs: APPLICATION_PROPERTIES
• 역할: 지정된 환경 변수를 원격 서버(EC2 인스턴스)로 전달합니다.
• 내용: APPLICATION_PROPERTIES 환경 변수를 EC2 서버에 전달합니다.
rm -rf src/main/resources/application.yml
• 역할: 기존의 application.yml 파일을 삭제합니다.
• 내용: src/main/resources/application.yml 파일을 강제로(-f 옵션) 재귀적으로(-r 옵션) 삭제합니다.
echo "$APPLICATION_PROPERTIES" > src/main/resources/application.yml
• 역할: 새로운 application.yml 파일을 생성합니다.
• 내용: APPLICATION_PROPERTIES 환경 변수의 값을 src/main/resources/application.yml 파일로 출력하여 저장합니다.
전체 흐름 설명
1) 환경 변수 설정
GitHub Actions에서 APPLICATION_PROPERTIES 환경 변수를 설정하고, 그 값을 GitHub Secrets에서 가져옵니다.
2) SSH 세션 시작
appleboy/ssh-action을 사용하여 EC2 인스턴스에 SSH로 접속합니다. 이때 설정된 환경 변수 APPLICATION_PROPERTIES를 원격 서버로 전달합니다.
3) 기존 application.yml 파일 삭제
원격 서버에서 application.yml 파일을 삭제합니다. 이는 새로운 설정 파일이 기존 파일과 충돌하지 않도록 하기 위함입니다.
4) 새로운 application.yml 파일 생성
전달된 환경 변수 APPLICATION_PROPERTIES의 값을 새로운 application.yml 파일로 저장합니다. 이는 GitHub Secrets에 저장된 민감한 정보를 사용하여 설정 파일을 동적으로 생성하는 과정입니다.
5) 배포 및 실행
• 최신 코드를 가져오기 위해 git pull origin main을 실행합니다.
• Gradle을 사용하여 프로젝트를 빌드합니다.
• 기존 실행 중인 애플리케이션을 종료합니다.
• 새로운 애플리케이션을 백그라운드에서 실행합니다[nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &]
4. Github에 Secret 값 넣어주기
• GitHub 레포지토리의 Settings > Secrets and variables > Actions에서 필요한 민감한 정보를 추가합니다.
5. Github으로 확인
• 변경 코드 확인
secret application.yml · pcy4196/pcy-server@d0dc728
pcy4196 committed Jul 21, 2024
github.com
• github actions 확인
GitHub - pcy4196/pcy-server: practice project for ci/cd(github)
practice project for ci/cd(github). Contribute to pcy4196/pcy-server development by creating an account on GitHub.
github.com
'☁️ Cloud > Github CI,CD' 카테고리의 다른 글
03. 일반 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Github Actions, SCP) (0) | 2024.07.31 |
---|---|
02. 개인 프로젝트에서 많이 쓰는 CI/CD 구축(Spring Boot) (0) | 2024.07.20 |
01. Github Actions의 정의 및 기본문법 (0) | 2024.07.12 |