build를 ec2에서 처리할 경우 아래와 방법이 좀 달라짐 이 게시물은 action에서 빌드
cicd 구축과정
1. 로컬폴더에 만든 코드나 깃허브에서 클론해옴
git clone git주소
2. 인텔리제이 접속
3. .github-workflows폴더 생성후 하단에 deploy.yml파일 생성(파일명은 변경 가능)
4. 파일에 코드 작성
name: Deploy to EC2
on:
push:
branches:
- main # main 브랜치에 push될 때만 실행
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout source #깃허브 액션에 소스코드 복사
uses: actions/checkout@v3
- name: Set up JDK #깃허브 액션에 jdk설치
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
- name: Write application.properties #application.properties민갑정보라 따로 작성
run: |
echo "${{ secrets.APPLICATION_PROPERTIES }}" > src/main/resources/application.properties
- name: Build with Gradle #빌드
run: ./gradlew clean build
- name: Deploy to EC2 via SCP #EC2로 배송
uses: appleboy/scp-action@v0.1.6
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_KEY }}
source: "build/libs/naemeal-0.0.1-SNAPSHOT.jar" #보낼거 여기서.sh파일 같이 보내도 됌
target: "/home/ubuntu/naemeal"
# - name: Upload application.properties #이건 ec2에서 빌드할때 필요한 코드 or properties파일을 빌드파일 외부에서 설정시
# uses: appleboy/ssh-action@v1.0.0
# with:
# host: ${{ secrets.EC2_HOST }}
# username: ubuntu
# key: ${{ secrets.EC2_KEY }}
# script: |
# cd /home/ubuntu/naemeal
# rm -f src/main/resources/application.properties
# echo "${{ secrets.APPLICATION_PROPERTIES }}" > src/main/resources/application.properties
- name: SSH and restart server #서버 재시작
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_KEY }}
script: |
cd /home/ubuntu/naemeal
./start.sh
start.sh코드내용
#!/bin/bash
pkill -f 'naemeal' || true
tmux new-session -d "java -jar /home/ubuntu/naemeal/build/libs/naemeal-0.0.1-SNAPSHOT.jar > /home/ubuntu/naemeal/app.log 2>&1"
흐름구조 : 로컬에서 push > 깃허브 액션이 깃허브에서 코드 가져옴> 깃허브액션환경에 jdk깔음 > application포함해서 빌드> scp로 ec2에 배송 > 기존 ec2에 클론받은 파일에 빌드파일만 변경
ec2에는 .jar파일하고 서버실행용 .sh파일 log파일 3개만 존재
application.properties는 액션에서 처리해서 같이 빌드됌
gradlew파일하고 start.sh 두개 실행권한 부여 필수 chmod +x 파일명
첫줄 name : 워크플로우명
on: push: branch: main 부분은 main브랜치로 푸쉬될때만 작동하게 설정부분 여기에 여러 브랜치들로 자동화 가능
jobs : 할 로직들
build-and-deploy : 액션명 마음대로 설정가능
run-on: ec2 개발환경 처음에 생성할때 고른것
step: 차례대로 명령어 수행 리눅스 명령어만 쭉 적어도 됌
-name: 수행할 명령이름
uses : 깃허브액션사용
5. 깃허브 레포지토리에 secret변수 3개 설정
EC2_HOST : ec2연결ip
EC2_KEY : pem키파일안에 비밀키
APPLICATION_PROPERTIES : 로컬 application_properties파일 내용 그대로 복붙(gitignore처리땜에 함)
6. 깃허브에서 변경내용 포함후에 푸쉬
git branch dev
git pull origin dev //최신버전 유지용
git checkout -b feat/my-new-feature # 새 브랜치 생성 및 이동
git add .
git commit -m "새 기능 추가"
git push origin feat/my-new-feature
git checkout dev
git pull origin dev
git merge feat/my-new-feature
git push origin dev
git checkout main
git pull origin main
git merge dev
git push origin main
개발브런치 배포브런치 나눌경우에 쓰는 방식 아니면 안해도 됌
git status : 깃 캐시 상태 확인
git rm --cached src/main/resources/application.properties : 만약 ignore했는데도 파일이 잡힐시
7. 깃허브 액션에서 작동로그 확인 성공하면 끝
오류상황
깃허브 액션이 .sh파일을 사용하지 않고 nohub 빌드파일 실행을 하면 ssh가 종료되면서 같이 서버도 꺼버리는 현상 발생
깃허브액션의 docker에서 터미널 명령어가 잘 안먹는 다고 함 > 추측
정확한 이유는 모르겠으나 실행전에 꺼버리는거 아닌가 예상함 그래서 .sh에 스크립트를 넣어서 실행
여기선 session도 나눠볼려고 tmux설치했으나 필요없을수도 있음
'Project > TeamProject(내밀)' 카테고리의 다른 글
| 프로젝트 ec2+rds+s3+cloudFront환경 설정 (0) | 2025.04.18 |
|---|