Github에서 제공하는 자동화 도구
CI/CD 파이프라인을 코드로 작성할 수 있음
특정 이벤트(ex) push, PR 등)에 따라 테스트, 빌드, 배포 등을 자동으로 수행
CI (Continuous Integration)
개발자가 코드를 자주 통합하고, 자동으로 빌드하고 테스트 하는 과정
CD (Continuous Deployment/Delivery)
빌드된 코드를 자동으로 배포 (서버, 클라우드 등)
name: CI/CD Pipeline
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- on
워크플로우가 실행될 이벤트 정의on: [push, pull_request]
- jobs
실행할 작업을 정의. 병렬 또는 순차적으로 실행 가능jobs: build: ... test: ... deploy: ...
- runs-on
Job이 실행될 OS 환경runs-on: ubuntu-latest
- steps
작업 안에서 실행할 개별 단계를 정의
- uses : 다른 Action을 사용
- run : 쉘 명령어 실행
- with : Action에 전달할 인자
name: Spring CI Pipeline # 워크플로우 이름
on:
push:
branches: [ "main", "develop" ] # main, develop 브랜치에 push 시 실행
pull_request:
branches: [ "main", "develop" ] # main, develop 브랜치에 PR 생성 시 실행
jobs:
build:
runs-on: ubuntu-latest # GitHub에서 제공하는 우분투 가상 머신 환경에서 실행
steps:
- name: Checkout source code # GitHub 저장소의 소스 코드를 받아오기
uses: actions/checkout@v3
- name: Set up JDK 17 # Java 17 설치
uses: actions/setup-java@v3
with:
java-version: '17' # 사용할 Java 버전
distribution: 'temurin' # Adoptium(Temurin) 배포판 사용
- name: Grant execute permission to gradlew # gradlew 실행 권한 부여 (권한 없으면 실패)
run: chmod +x ./gradlew
- name: Build with Gradle # Gradle을 이용해 빌드 (테스트 포함)
run: ./gradlew clean build
- name: Upload build artifacts
uses: actions/upload-artifact@v3
with:
name: spring-boot-jar
path: build/libs/*.jar # 이 부분은 빌드된 JAR 파일을 Github에 업로드하여 저장하는 과정입니다.
여기까지가 CI의 과정입니다. 그 이후 과정은 :
3. 빌드 성공 시 →
4. JAR 파일 서버 전송 →
5. 서버에서 기존 프로세스 중단 →
6. 새 JAR 실행 (혹은 Docker 재시작)
의 CD의 과정을 예로 들 수 있습니다.
그 후에 yaml 파일에
- name: Deploy to EC2 via SSH # EC2에 SSH로 접속하여 배포 수행
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }} # EC2 IP 주소 (GitHub Secrets에 저장)
username: ubuntu # EC2 로그인 사용자 (보통 'ubuntu' 또는 'ec2-user')
key: ${{ secrets.EC2_PRIVATE_KEY }} # EC2 SSH 개인키 (Secrets에 저장)
script: |
pkill -f 'java -jar' || true # 기존에 실행 중인 Spring 프로세스를 종료
cd /home/ubuntu/app # Spring 프로젝트가 배포될 서버 디렉토리로 이동
rm -f *.jar # 이전 JAR 파일 제거
# GitHub Actions에서 EC2로 JAR을 직접 SCP로 복사 (대체 가능)
scp -o StrictHostKeyChecking=no build/libs/*.jar ubuntu@${{ secrets.EC2_HOST }}:/home/ubuntu/app/app.jar
nohup java -jar /home/ubuntu/app/app.jar > app.log 2>&1 & # 백그라운드로 실행하고 로그 저장
를 작성하며 EC2 서버에 SSH로 배포하는 과정을 가집니다.