Show HN: GitHub Actions 워크플로우를 Ubuntu-slim 러너로 안전하게 마이그레이션하는 도구
요약
gh-slimify는 GitHub Actions 워크플로우를 기존 ubuntu-latest 환경에서 컨테이너 기반의 ubuntu-slim 러너로 안전하게 마이그레이션할 수 있도록 돕는 CLI 도구입니다. 사용자의 워크플로우 파일을 스캔하여 마이그레이션 가능 여부를 판단하고, 실행 시간 및 도구 누락 가능성을 검토하여 보고합니다.
핵심 포인트
- GitHub Actions의 ubuntu-slim 러너로의 전환을 자동화하고 검토하는 도구입니다.
- 워크플로우 파일 내의 작업을 분석하여 안전하게 마이그레이션 가능한 작업과 주의가 필요한 작업을 구분합니다.
- GitHub CLI 확장 프로그램 형태로 제공되어 `gh extension install` 명령어로 간편하게 설치할 수 있습니다.
- ubuntu-slim의 사전 설치 도구 목록이 공식화되지 않았으므로, 도구의 판단 결과에 대한 수동 확인이 권장됩니다.
gh-slimify
[!WARNING]
ubuntu-slim으로 마이그레이션하면 워크플로우의 불안정성이나 실행 시간 증가가 발생할 수 있습니다.
[!TIP]
💡 잠깐, 이 도구를 아예 사용하지 않고 다음 프롬프트를 AI 에이전트에 복사해서 붙여넣으면 되지 않을까요? 🤔목표: `.github/workflows` 아래의 모든 워크플로우 파일에 대해, 현재 `ubuntu-latest`에서 실행되는 작업(jobs)을 컨테이너 기반 러너인 `ubuntu-slim`으로 마이그레이션합니다. 작업을 마이그레이션할지 판단할 때 다음 결정 규칙을 순서대로 사용하세요: 1. `runs-on`이 `ubuntu-latest` 또는 `ubuntu-24.04`인 작업(매트릭스 항목 포함)만 고려합니다.
...
> # 가장 최근에 성공한 실행의 데이터베이스 ID를 가져옵니다
> id=$(gh run list \
> --repo ${owner}/${repo} \
> --workflow ${workflow_file_name} \
> --status success \
> --limit 1 \
> --json databaseId | jq .'[0].databaseId')
>
> # 시작/완료 시간을 검사하기 위해 해당 실행의 작업 목록을 나열합니다
> gh api \
> repos/{owner}/{repo}/actions/runs/${id}/jobs | jq '.jobs[] | {name: .name, started_at: .started_at, completed_at: .completed_at}'
>
> 이 규칙을 기반으로 각 워크플로우를 검토하고 적격한 모든 작업을 ubuntu-slim으로 마이그레이션합니다. 그 후, 성공적으로 마이그레이션된 작업과 마이그레이션되지 않은 작업에 대해 부적격한 구체적인 이유를 모두 보고합니다.
> ```
## 🎯 동기 (Motivation)
...
```bash
gh extension install fchimpan/gh-slimify
[!NOTE]
이 글을 작성하는 시점에 GitHub는ubuntu-slim러너에 사전 설치된 도구 목록을 공식적으로 게시하지 않았습니다. 따라서 누락된 명령어를 탐지하는 기능은 불확실하며 가설에 기반합니다. 이 도구는 명령어가 누락되었다고 잘못 표시하거나(false positives), 실제로 누락된 명령어를 놓칠 수 있습니다(false negatives). 중요한 워크플로우를 마이그레이션하기 전에는 항상 수동으로 확인하십시오.
...
$ gh slimify --help
워크플로우 스캔 (Scan Workflows)
...
gh slimify .github/workflows/ci.yml
또는 여러 워크플로우 파일을 스캔합니다:
```bash
gh slimify .github/workflows/ci.yml .github/workflows/test.yml
.github/workflows/ 디렉토리 내의 모든 워크플로우를 스캔하려면 --all 플래그를 사용하세요:
gh slimify --all
출력 예시 (Example Output):
📄 .github/workflows/lint.yml
✅ 안전하게 마이그레이션 가능 (1개 작업 (job(s))):
• "lint" (L8) - 마지막 실행 시간: 4m
.github/workflows/lint.yml:8
⚠️ 마이그레이션 가능하지만 주의 필요 (1개 작업 (job(s))):
• "build" (L15)
⚠️ 설정이 필요할 수 있음 (go), 마지막 실행 시간: 알 수 없음
.github/workflows/lint.yml:15
❌ 마이그레이션 불가 (2개 작업 (job(s))):
• "docker-build" (L25)
❌ Docker 명령어를 사용함
.github/workflows/lint.yml:25
• "test-with-db" (L35)
❌ 서비스 컨테이너 (service containers)를 사용함
.github/workflows/lint.yml:35
✅ 1개 작업 (job(s))을 안전하게 마이그레이션할 수 있습니다
⚠️ 1개 작업 (job(s))을 마이그레이션할 수 있지만 주의가 필요합니다
❌ 2개 작업 (job(s))은 마이그레이션할 수 없습니다
📊 총계: 2개 작업 (job(s))이 마이그레이션 대상입니다
출력 내용은 다음과 같습니다:
- ✅ 안전하게 마이그레이션 가능 (Safe to migrate): 누락된 명령어가 없고 실행 시간이 확인된 작업들
...
gh slimify fix .github/workflows/ci.yml
또는 --all을 사용하여 모든 워크플로우를 수정할 수 있습니다:
gh slimify fix --all
출력 예시 (Example Output) (기본값 - 안전한 작업만):
Updating workflows to use ubuntu-slim (safe jobs only)...
Skipping 1 job(s) with warnings. Use --force to update them.
Updating .github/workflows/lint.yml
✓ Updated job "lint" (L8) → ubuntu-slim
Successfully updated 1 job(s) to use ubuntu-slim.
경고가 있는 작업(누락된 명령어 또는 알 수 없는 실행 시간)도 함께 업데이트하려면 --force 플래그를 사용하세요:
gh slimify fix --force
출력 예시 (Example Output) (--force 사용 시):
Updating workflows to use ubuntu-slim (including jobs with warnings)...
Updating .github/workflows/lint.yml
⚠️ Updated job "build" (L15) → ubuntu-slim (with warnings)
✓ Updated job "lint" (L8) → ubuntu-slim
Successfully updated 2 job(s) to use ubuntu-slim.
📖 사용법 (Usage)
...
gh slimify --all
--file 플래그 사용하기 (Using --file Flag)
...
```bash
gh slimify -f .github/workflows/ci.yml -f .github/workflows/test.yml
실행 시간 확인 건너뛰기 (Skip Duration Check)
...
gh slimify --skip-duration
--verbose 플래그를 사용하여 디버그 출력 (debug output)을 활성화할 수 있으며, 이는 API 호출이나 워크플로우 파싱 (workflow parsing) 관련 문제를 해결하는 데 도움이 될 수 있습니다:
gh slimify --verbose
경고와 함께 작업 강제 업데이트 (Force Update Jobs with Warnings)
...
gh slimify fix --force
JSON 출력 (JSON Output)
...
gh slimify --json --all
gh slimify fix --json --all
스캔 결과 예시 (Example scan output):
{
"jobs": [
{
"workflow_path": ".github/workflows/ci.yml",
"job_id": "lint",
"job_name": "Lint",
"line_number": 8,
"status": "safe",
"status_description": "ubuntu-slim으로 마이그레이션하기에 안전합니다. 누락된 명령어가 없으며 실행 시간을 알고 있습니다.",
"recommended_action": "migrate",
"duration_seconds": 143
},
{
"workflow_path": ".github/workflows/ci.yml",
"job_id": "build",
"job_name": "Build",
"line_number": 25,
"status": "warning",
"status_description": "마이그레이션이 가능하지만 주의가 필요합니다. 다음 항목에 대한 설정이 필요할 수 있습니다: docker.",
"recommended_action": "review_before_migrate",
"duration_seconds": 230,
"missing_commands": ["docker"]
}
],
"summary": {
"safe": 1,
"warning": 1,
"ineligible": 0,
"already_slim": 0,
"total": 2
}
}
스캔 작업 상태 (Scan job statuses):
...
gh slimify fix .github/workflows/ci.yml --skip-duration --force
gh slimify --all --skip-duration
gh slimify fix --all --force
gh slimify --json --all --skip-duration
🔍 마이그레이션 기준 (Migration Criteria)
...
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: npm run lint
예시 2: Docker 빌드 작업 (Docker Build Job) ❌
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: docker/build-push-action@v6
with:
context: .
push: true
결과: ❌ 대상 아님 — Docker 기반 액션 (Docker-based action) 사용
...
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:14
steps:
- run: npm test
**결과:** ❌ 대상 아님 — `services:` 컨테이너 사용
...
```yaml
jobs:
test:
runs-on: ubuntu-latest
container:
image: node:18
steps:
- run: node --version
결과: ❌ 대상 아님 — container: 구문 사용
...
jobs:
network-test:
runs-on: ubuntu-latest
steps:
- run: |
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
sudo sysctl -w net.ipv4.ip_forward=1
결과: ❌ 대상 아님 — 특권 작업 사용 (iptables, sysctl)
🛠️ 작동 방식
- 워크플로우 구문 분석:
.github/workflows/*.yml파일을 스캔하고 job 정의를 구문 분석합니다. - 기준 검사: 각 job을 마이그레이션 기준(Docker, services, containers)에 따라 평가합니다.
- 누락된 명령어 감지:
ubuntu-latest에는 존재하지만ubuntu-slim에는 없는 job의 명령어를 식별합니다. - 실행 시간 가져오기: GitHub API에서 최신 job 실행 시간을 검색합니다 (단,
--skip-duration사용 시 제외). - Job 분류: job을
AI 자동 생성 콘텐츠
본 콘텐츠는 HN AI Engineering의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기