회고

🚀 GitHub Actions + Self-Hosted Runner로 MSA 서비스 CI/CD 구축기

창따오 2025. 7. 22. 17:51
728x90

1. 개요

이번 포스팅에서는 MSA 기반 프로젝트에서 각 서비스(Gateway, Auth-Service, User-Service)에 대해 GitHub Actions와 self-hosted runner를 활용해 CI/CD 파이프라인을 구축한 과정을 공유합니다. 집 PC 서버에서 이미지 재배포까지 완전 자동화된 구조를 목표로 설정했습니다.

 


🛠️ 1. GitHub Actions 기반 CI 구성

✅ Dockerfile 구조 (예: Auth-Service)

FROM amazoncorretto:17
LABEL authors="changhoyoun"

ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-jar", "/app.jar"]

 

✅ workflow 설정 (.github/workflows/auth-cicd.yml)

name: CI for Auth-Service

on:
  push:
    branches: [ "main" ]

jobs:
  build-and-push:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'corretto'

      - name: Grant execute permission
        run: chmod +x ./gradlew

      - name: Build with Gradle
        run: ./gradlew clean build -x test

      - name: Docker Build & Push
        run: |
          docker build -t changddao/auth-service .
          echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login -u changddao --password-stdin
          docker push changddao/auth-service

 

🔄 2. Self-Hosted Runner 기반 CD 구성

✅ Runner 경로 예시

  • /home/changddao/changhome/auth-service/actions-runner

✅ .github/workflows/auth-cd.yml

name: CD for Auth-Service

on:
  workflow_run:
    workflows: ["CI for Auth-Service"]
    types:
      - completed

jobs:
  cd:
    runs-on: self-hosted
    steps:
      - name: Pull latest image
        run: docker compose -f ./docker-compose.yml pull app

      - name: Restart container
        run: docker compose -f ./docker-compose.yml up -d app

📝 docker-compose.yml 예시는 서비스마다 app, gateway, auth-service 등 이름 일치 확인 필요!

 


🔐 3. 환경 변수 관리 (.env)

CI/CD 파이프라인에서 보안을 고려해 민감한 정보는 .env 파일을 통해 관리합니다.

✅ .env 예시

DB_USERNAME=your_db_user
DB_PASSWORD=your_db_pass
JWT_SECRET_KEY=your_jwt_secret
  • .env는 runner가 clone한 디렉토리 기준 docker-compose.yml과 같은 경로에 있어야 주입 가능
  • Git에는 절대 커밋 금지

✅ 결론

  • 각 서비스는 별도 디렉토리로 관리
  • CI는 GitHub Actions에서 자동 빌드 및 Docker Hub push
  • CD는 self-hosted runner에서 이미지 pull 및 컨테이너 재기동
  • 환경 변수는 .env 파일로 주입