[cloud ‐ troubleshooting] GitHub Actions Runner 환경 오동작 트러블슈팅 보고서 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. 문서 개요

  • 작성일: 2025-06-25

  • 작성자: aaron.lee(이유성)/클라우드

  • 시스템 범위: GitHub Actions Self-hosted Runner (Dev/Prod 통합 구성)

  • 목적:

    GitHub Actions Self-hosted Runner가 레이블 미지정으로 인해 Dev/Prod 환경 간 무작위로 워크플로우를 실행하여 발생한 DB 접속 오류 문제를 분석하고, 재발 방지를 위한 구조적 개선 사항을 정리합니다.


2. 시스템 구성 및 현상 개요

2.1 인프라 구성

환경 VM 이름 IP 주소 역할
Dev dev-cloudsql-proxy 10.1.30.4 Dev DB Proxy + Self-hosted Runner
Prod prod-cloudsql-proxy 10.0.40.4 Prod DB Proxy + Self-hosted Runner
DB dev-ongi-db 10.0.30.3 Cloud SQL (MySQL)

2.2 발생 현상

  • Dev 브랜치에서 워크플로우 실행 시 Access denied for user ...@'10.0.40.4' 오류 간헐 발생
  • Flyway Migration Job이 예상과 달리 Dev가 아닌 Prod Runner에서 실행되어 발생

3. 문제 정의

항목 내용
문제 유형 Self-hosted Runner가 잘못된 환경에서 Job을 실행
주요 증상 Flyway Migration 중 MySQL 접근 오류 (IP 미허용)
발생 조건 runs-on에 환경 레이블 미지정 (self-hosted, Linux, X64만 지정)
재현 가능성 50% 이상 (Pool 내 2대가 랜덤 선택되므로 반복 발생 가능)

4. 분석 및 확인 절차

4.1 GitHub Actions 로그 확인

  • Flyway Job 실행 로그에 Access denied ...@'10.0.40.4' 식별
  • Job은 self-hosted로 실행되었으나 구체적인 호스트 식별 불가

4.2 Runner 레이블 구성 점검

cat ~/actions-runner/.runner
# 결과:
# "labels": ["self-hosted", "Linux", "X64"]
  • Dev/Prod 모두 동일한 기본 레이블만 등록됨 → 구분 불가

4.3 GitHub 매칭 규칙 확인

  • runs-on에 지정된 모든 레이블을 만족하는 Runner 중 임의 선택(random)
  • 현재 구성에서는 두 VM 모두 매칭됨 → 무작위 선택됨

5. 원인 분석

  • 원인: Runner 레이블에 dev, prod 등 환경 구분 태그 누락
  • 동일 Runner Pool 내 VM들이 서로 다른 네트워크 조건을 가짐에도 불구하고, 레이블 미지정으로 인해 워크플로우가 랜덤으로 실행
  • 결과적으로 Dev DB는 dev Runner(10.1.30.4)에서만 허용되어 있음에도, prod Runner(10.0.40.4)에서 Job이 실행되어 IP 기반 인증 실패

6. 해결 방안

6.1 [권장] 레이블 기반 환경 고정화

환경 추가 레이블 runs-on 지정
Dev dev runs-on: [self-hosted, Linux, X64, dev]
Prod prod runs-on: [self-hosted, Linux, X64, prod]

6.2 [대안] Proxy 127.0.0.1 바인드

  • cloud_sql_proxy를 127.0.0.1:3306에만 바인드
  • 모든 Runner에서 localhost로 접속 → MySQL 권한도 [email protected]로 통일
  • 단점: proxy 세부 구성과 Flyway URL 변경 필요

6.3 [비추천] MySQL 권한을 모든 호스트에 부여

GRANT ALL PRIVILEGES ON db.* TO 'user'@'10.0.40.4';
  • 보안상 위험 → VM 환경이 늘어날수록 통제 불가능

7. 해결 조치 및 검증 결과

항목 조치 내용
레이블 재지정 Dev: dev, Prod: prod 태그 지정 후 ./config.sh --labels 재등록
systemd 적용 svc.sh install && start로 자동 실행
워크플로우 수정 runs-on: [self-hosted, Linux, X64, dev] 명시
테스트 Dev 브랜치 PR → dev Runner에서만 실행 확인Prod 브랜치 PR → prod Runner에서만 실행 확인
  • 결과: 이후 모든 워크플로우에서 환경 오동작 없음

8. 결론 및 권고사항

결론

  • GitHub Self-hosted Runner는 레이블 기반으로 실행 대상을 결정하므로, 명확한 환경 식별 레이블 없이 구성하면 실행 환경이 불안정해짐
  • 환경 간 네트워크, DB 권한, 파일 경로 등이 상이한 경우에는 Runner를 명확히 구분하는 레이블을 필수로 구성해야 함

권고사항

항목 권고 내용
Runner 레이블 관리 self-hosted, OS, 아키텍처 외에 환경 구분 레이블(dev/prod) 필수
워크플로우 작성 runs-on 항목에 환경 태그 포함 (예: dev, prod)
Runner Pool 관리 불필요한 레이블 중복 제거 및 환경별 Runner 분리 배포
보안 정책 DB 사용자 권한은 최소화하고, Runner IP 또는 호스트명을 기반으로 관리
모니터링 journalctl, GitHub Actions UI 등으로 Runner 실행 히스토리 주기 확인