[방식 설명]
1. Github에서 push
2. Github Actions가 작동함
3. Github Actions 서버내에 jdk 및 프로젝트 다운로드받아 프로젝트 빌드후 운영서버에 jar 전달
4. 실제 운영서버에서 전달받은 jar로 프로젝트 실행
2-3.
[장점]
- 빌드 작업을 Github Actions 서버내에서 처리해서 운영서버의 성능에 영향을 주지 않음
(실제 EC2 서버내에서 빌드하니깐 프리티어는.. 서버가 멈춰버리는현상발생함, 스왑메모리로 해결) - 구조가 간단함
[단점]
- 무중단 배포 하거나, 여러개의 운영서버에 배포해야하는 상황이면 복잡해짐
deploy.yml
name: Deploy To EC2
# 해당 레포지토리의 main 브렌치에 push가 반응했을경우 이벤트 시작
on:
push:
branches:
- main
jobs:
# 이벤트의 이름은 deploy이다
deploy:
# 서버환경 ubuntu 최신버전
runs-on: ubuntu-latest
steps:
# Github ACtions 버내에 해당 Repository에서 해당 폴더를 다운로드함
# GithubActions 라이브러리임
- name: Github Repository에 올린 파일들을 불러오기
uses: actions/checkout@v4
# Github Actions 서버내에 JDK 17버전 설치함(라이브러리)
- name: JDK 17버전 설치
uses: actions/setup-java@v4
with:
distribution: temurin #JDK의 회사
java-version: 17 #JDK의 버전
# Github Actions 서버내에 application.yml 파일 생성
# 1. application.yml 파일생성
# 2. 파일 내에 secrets에 저장해둔값 불러와서 값 입력
- name: application.yml 파일 만들기
run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.yml
# Github Actions 서버내에서 프로젝트 빌드하기
- name: 테스트 및 빌드하기
run: ./gradlew clean build
# Github Actions 서버내에 빌드된 jar 파일을 project.jar로 이름 변경
- name: 빌드된 파일 이름 변경하기
run: mv ./build/libs/*SNAPSHOT.jar ./project.jar
# Github Actions 서버내에 있는 jar파일 EC2 서버로 파일 전송하기(라이브러리)
- name: SCP로 EC2에 빌드된 파일 전송하기
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: project.jar # 파일전송할 파일 이름
target: /home/ubuntu/cicdMemoryServer/tobe # EC2로 전송하는데 어디에 파일을 보낼지 지정
# SSH이용하여 EC2서버로 접속하기(라이브러리)
- name: SSH(원격접속)로 EC2에 접속하기
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script_stop: true
# 1. 기존에 사용하던 프로젝트 폴더 제거
# 2. 프로젝트 배포할 폴더 생성
# 3. Github Actions로 부터 받은 jar파일 프로젝트 배포 폴더로 이동
# 4. 프로젝트 배포 폴더로 이동
# 5. 현재 실행중이 8080포트 종료하기(만약 실행중인 8080 없더라도 오류로 처리하지 않고 성공처리함)
# 6. 프로젝트 jar 실행
# 7. SCP에서 전달받을때 사용하던 폴더 삭제
script: |
rm -rf /home/ubuntu/cicdMemoryServer/current
mkdir /home/ubuntu/cicdMemoryServer/current
mv /home/ubuntu/cicdMemoryServer/tobe/project.jar /home/ubuntu/cicdMemoryServer/current/project.jar
cd /home/ubuntu/cicdMemoryServer/current
sudo fuser -k -n tcp 8080 || true
nohup java -jar project.jar > ./output.log 2>&1 &
rm -rf /home/ubuntu/cicdMemoryServer/tobe
[간단 요약]
1. github내 push반응하여 이벤트 실행
2. github repository에서 프로젝트를 Github Actions 서버내로 다운로드
3. Github Actions서버내 JDK 설치
4. Github Actions서버내 다운로드 받은 프로젝트에 application.yml 값 설정(깃허브 secrets 에서 미리 작성해둠)
5. Github Actions서버내 프로젝트 빌드함
6. 빌드된 jar파일 project.jar 로 이름 변경
7. project.jar 운영서버로 파일전송함(target 으로 보낼 위치 설정)
8. 운영서버 원격접속(SSH)
9. 기존 프로젝트 폴더 삭제후 재생성
10. prject.jar 생성한 폴더로 이동
11. 기존 8080포트 사용중이면 종료
12. jar 실행
[Github Actions 사용 라이브러리]
Checkout - GitHub Marketplace
Checkout a Git repository at a particular version
github.com
Setup Java JDK - GitHub Marketplace
Set up a specific version of the Java JDK and add the command-line tools to the PATH
github.com
SCP Files - GitHub Marketplace
Copy files and artifacts via SSH
github.com
GitHub - appleboy/ssh-action: GitHub Actions for executing remote ssh commands.
GitHub Actions for executing remote ssh commands. Contribute to appleboy/ssh-action development by creating an account on GitHub.
github.com
[프로젝트에서 사용한 repository]
GitHub - memoryDev/cicdMemoryServer: CI/CD - 개인프로젝트 배포 연습
CI/CD - 개인프로젝트 배포 연습. Contribute to memoryDev/cicdMemoryServer development by creating an account on GitHub.
github.com
해당글은 인프런의 강의듣고 작성한 게시글입니다.
비전공자도 이해할 수 있는 CI/CD 입문·실전 강의 | JSCODE 박재성 - 인프런
JSCODE 박재성 | 비전공자 입장에서도 쉽게 이해할 수 있고, 실전에서 바로 적용 가능한 CI/CD 입문 강의를 만들어봤습니다!, 🤬 에라이, 못 해먹겠네!비전공자로 개발을 시작해 여러 회사에서 CTO로
www.inflearn.com
'프로그래밍 > DevOps' 카테고리의 다른 글
1. CI/CD 기본개념 및 흐름 (1) | 2024.12.29 |
---|