Git Action
준비 환경
- Amazon RDS (mysql , postgresql 중 택1, 포트 설정)
- AWS EC2 (node.js, jdk17, Docker 등 필요한 기능 설치되어있어야함, 22, 8080, 80 포트 설정)
- Elastic IP 설정 (고정 IP 필수)
deploy.yml 파일 생성
- 깃 최상위 경로에 /.github/workflows/deploy.yml 폴더와 파일을 생성한다. (경로와 파일명이 동일해야 git에 인식됨)
- deploy.yml 에 자신의 프로젝트 환경에 맞는 빌드 스크립트를 작성한다.
ex. Demo project 의 경우 Frontend (React+Vite) 와 Backend (SpringBoot) 이고, 프론트 dist 파일을 Backend static 에 올려서 함께 배포한다.
name: Deploy to EC2
on:
push:
branches: [ feature/awscicd ] # 배포 원하는 브렌치 설정
jobs:
build-and-deploy:
runs-on: ubuntu-latest
env:
GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }}
GOOGLE_CLIENT_SECRET: ${{ secrets.GOOGLE_CLIENT_SECRET }}
# ... 환경변수들 git 에서 설정
steps:
- name: Checkout 코드
uses: actions/checkout@v3
- name: Node.js 설치
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Frontend Build
run: |
cd frontend
npm ci
npm run build
cp -r dist/* ../backend/src/main/resources/static/ # Front 경로 맞추기
- name: EC2에 .env 파일 생성
uses: appleboy/ssh-action@v0.1.10
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
mkdir -p /home/ec2-user/app/backend/build/libs # Backend 경로 맞추기
cd /home/ec2-user/app/backend/build/libs
echo "GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}" > .env
echo "GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}" >> .env
# ...
echo "======= .env 파일 생성 완료 ==========="
echo "======== .env 내용 확인 ========="
cat .env
echo "======== 환경변수 적용 ========"
# 환경변수 적용
if [ -f .env ]; then
echo ".env 파일이 존재합니다. 환경변수를 적용합니다."
set -a
source .env
set +a
else
echo ".env 파일이 존재하지 않습니다. 배포를 중단합니다."
exit 1
fi
- name: Backend Build
run: |
cd backend
chmod +x ./gradlew
./gradlew build --no-daemon -x test # 테스트 설정
- name: EC2에 JAR 파일 복사
uses: appleboy/scp-action@v0.1.4
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_KEY }}
source: "backend/build/libs/*.jar" # 경로 맞추기
target: "/home/ec2-user/app/"
- name: EC2에서 JAR 실행
uses: appleboy/ssh-action@v0.1.10
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd /home/ec2-user/app/backend/build/libs
echo "======== JAR 파일 확인 ========" # 파일명 확인
ls -al backend-0.0.1-SNAPSHOT.jar || echo "=== JAR 파일이 존재하지 않습니다"
echo "======== 자바 실행 ========="
nohup java -jar backend-0.0.1-SNAPSHOT.jar > app.log 2>&1 & disown
sleep 5
echo "======== 실행된 자바 프로세스 확인 ========"
pgrep -af java || echo "실행 중인 자바 없음"
echo "========= 자바 로그 출력 ========"
tail -n 50 app.log
참고
- pkill -f 'java' || true 이걸 넣으면 Git Action 프로세스까지 다 정지되어서 다른 방법 찾아야함. → pm2로 jar 관리가능
- disown 제거해도됨.
- profiles 설정 (--spring.profiles.active=dev 추가)
nohup java -jar backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev > app.log 2>&1 & disown
해당 최상단 위치에서 deploy.yml 커밋 후 실행하고 싶지만 GitHub은 2021년부터 패스워드 방식 인증을 막았기 때문에GitHub 비밀번호로는 더 이상 PUSH 안됨. → ssh key 생성 필요
Git 용 SSH Key 생성
1. git commit HTTPS → SSH 인증 방식으로 바꾸기
- git 폴더 경로 터미널에서 ssh 키 만들기 (이미 있으면 생략):
ssh-keygen -t rsa -b 4096 -C "hellou@example.com"
Enter passphrase for "cat ~/.ssh/id_rsa.pub" (empty for no passphrase): 다 엔터로 그냥 넘어가기
2. 공개키 확인하기
cat ~/.ssh/id_rsa.pub
ssh-rsa A~~~~~~~~
2. git settings 에 등록
- GitHub → Settings > SSH and GPG keys → New SSH Key → 붙여넣기
- 아까 ssh-rsa 로 시작했던 값 입력하기
2. GitHub remote 주소 변경:
git remote set-url origin git@github.com:{자신의 git 리포지토리 주소}
deploy.yml 실행
git add .
git commit -m "ci: github actions 배포 추가"
git push origin develop
- 배포 원하는 브랜치인지 확인할것
GitHub 에서 Action 워크플로우 확인
- GitHub 레포 열기
- 상단 탭 중에서 Actions 클릭
- Deploy to EC2 워크플로우가 실행되고 있는지 확인
- 각 step(log)을 클릭해서 npm, gradle, ssh, scp 성공 여부 확인
EC2 서버에서 배포확인
- .env 파일이 잘 생성되었는지 확인
- jar 파일이 경로에 생성되었는지 확인
- app.log 로 app 실행 로그 확인
- 디비 연결 잘 되는지 확인
- EC2에서 AWS RDS 연결 테스트 (생성한 DB 환경에 맞춰 수정하여 테스트)
psql -h database 엔드포인트 \\
-p 5432 \\
-U name_a \\
-d demodb
# jdbc:postgresql://{database앤드포인트}:5432/{dbname}
- 연결 성공 시:
psql (16.1, server 13.4)
Type "help" for help.
demodb=>
- 전체 테이블 보기 (현재 스키마 기준)
\\dt
5. EC2 서버와 연결된 Elastic IP 로 접속하면 된다.
Git secrets text 환경변수 설정
- Repository 에 필요한 환경변수들을 적용한다.
'개발자 > TIL' 카테고리의 다른 글
OAuth (0) | 2023.01.26 |
---|---|
[JavaMail] SMTP 메일 보내기 (ssl, tls) (0) | 2022.06.12 |
[JPA]queryDsl 에서 다중 IN 조건, where 절 서브쿼리 (0) | 2021.06.09 |
[Node] Node Express 서버에 Oracle DB 연결하기 (0) | 2021.05.12 |
[SOCKET] SOCKET 연결 (0) | 2021.03.24 |