실제 운영 중인 리눅스 서버에 GitHub Actions를 사용한 자동 배포를 구축하면서 발생했던 이슈와 해결 방법을 정리합니다.
✅ 목표
dev브랜치에 코드 푸시 시, 리눅스 서버에서 Spring Boot 프로젝트 자동 빌드 & 배포- Docker + docker-compose 환경에서 실행 중인 API 서버를 자동 재배포
📁 서버 디렉토리 구조 (예시)
/home/service/
┣ meowro/
┃ ┣ api/
┃ ┃ ┗ dev/
┃ ┃ ┣ docker-compose.yml
┃ ┃ ┣ Dockerfile
┃ ┃ ┣ meowapi-0.0.X.jar ← 최신 버전 자동 복사됨
⚙ GitHub Actions 워크플로우 (.github/workflows/deploy-dev.yml)
name: Deploy to Dev Server
on:
push:
branches:
- dev
jobs:
deploy:
runs-on: self-hosted
steps:
- name: 📦 Checkout
uses: actions/checkout@v3
- name: ☕️ Set up JDK
uses: actions/setup-java@v3
with:
java-version: '21'
distribution: 'temurin'
- name: 🧱 Build Spring Boot JAR
run: ./gradlew clean build -x test
- name: 🧹 Delete old JARs & copy latest
run: |
rm -f /home/service/meowro/api/dev/*.jar
latest_jar=$(ls -t build/libs/*.jar | head -n 1)
cp "$latest_jar" /home/service/meowro/api/dev/
- name: 🐳 Restart Docker container
working-directory: /home/service/meowro/api/dev
run: |
docker-compose down
docker-compose up -d --build
🧨 발생했던 문제 & 해결 방법
| 문제 | 원인 | 해결 |
|---|---|---|
cp: is not a directory |
복사 대상 경로를 meowapi-0.0.1.jar로 고정했는데 파일명이 달라짐 |
*.jar 자동 탐색 + 디렉토리로 복사하도록 변경 |
Permission denied |
Actions가 일반 사용자로 실행되는데, /home/service/...는 root 소유 |
chown -R 사용자:사용자 대상경로 로 소유권 변경 |
docker-compose: no config file found |
작업 디렉토리 설정 안 되어 있음 | working-directory: 명시해줌 |
| Dockerfile 수정했는데 반영 안 됨 | 재기동(--build)을 안함 |
docker-compose up -d --build 명시 |
.jar 파일이 계속 쌓임 |
매번 새 파일이 복사되며 쌓임 | rm -f *.jar로 기존 파일 삭제 |
🚀 Self-hosted runner 설정 팁
# 1. 일반 사용자 생성 및 권한 부여
sudo useradd -m realryan
sudo usermod -aG docker realryan
# 2. runner 디렉토리 이동 및 소유권 이전
sudo chown -R realryan:realryan /home/service/runner
run.sh 자동 실행을 위해 systemd 등록:
[Unit]
Description=GitHub Actions Runner (meowro)
After=network.target
[Service]
ExecStart=/bin/bash /home/service/runner/run.sh
WorkingDirectory=/home/service/runner
User=realryan
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable github-runner
sudo systemctl start github-runner
✅ 마무리
처음부터 끝까지 직접 구축하면서 겪은 오류와 해결 과정을 바탕으로
Spring Boot 프로젝트를 GitHub Actions로 자동 배포하는 구조를 완성했습니다.
실제로 운영 환경에 적용해도 충분히 활용 가능한 패턴입니다! 💪
'DevOps' 카테고리의 다른 글
| Spring Boot 개발 환경을 위한 도커 세팅, 그리고 실전 팁들 🐳 (0) | 2025.04.04 |
|---|---|
| MSA로 인증과 회원을 분리하고 JWT 연동 구조 설계하기 (0) | 2025.03.25 |
| 모놀리식에서 MSA로, 우리 서비스의 변화 (0) | 2025.03.12 |