GitHub Actions CI/CD

최규진·2025년 4월 8일

GitHub Actions란?

  • Github에서 제공하는 자동화 도구

  • CI/CD 파이프라인을 코드로 작성할 수 있음

  • 특정 이벤트(ex) push, PR 등)에 따라 테스트, 빌드, 배포 등을 자동으로 수행

    CI/CD 개념

  • CI (Continuous Integration)
    개발자가 코드를 자주 통합하고, 자동으로 빌드하고 테스트 하는 과정

  • CD (Continuous Deployment/Delivery)
    빌드된 코드를 자동으로 배포 (서버, 클라우드 등)

    Github Actions 구조

  1. .github/workflows/ 디렉토리
  • 워크플로우 정의 파일을 저장하는 위치
  • 파일명은 자유롭게 설정 가능, 예: deploy.yml, kjchoi.yml 등
  1. 워크플로우(Workflow)
  • 여러 Job으로 구성된 하나의 자동화 작업 단위
  • 이벤트 발생 시 실행
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

주요 구성 요소

  1. on
    워크플로우가 실행될 이벤트 정의
on: [push, pull_request]
  1. jobs
    실행할 작업을 정의. 병렬 또는 순차적으로 실행 가능
jobs:
  build: ...
  test: ...
  deploy: ...
  1. runs-on
    Job이 실행될 OS 환경
runs-on: ubuntu-latest
  1. steps
    작업 안에서 실행할 개별 단계를 정의
  • uses : 다른 Action을 사용
  • run : 쉘 명령어 실행
  • with : Action에 전달할 인자

Spring boot CI/CD 예제

  • 브랜치에 push 또는 pull request가 발생했을 때 자동으로:
    1. 코드를 가져오고
    2. JDK 환경을 설정하고
    3. 테스트 실행
    4. Gradle로 빌드
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로 배포하는 과정을 가집니다.

profile
나는 개발자입니다.

0개의 댓글