Act란 무엇인가?
Act는 로컬에서 GitHub Actions Workflow를 실행할 수 있게 해주는 오픈소스 커맨드라인 도구다. 코드를 GitHub에 푸시하지 않고도 CI/CD 파이프라인을 테스트하고 디버깅할 수 있다.
GitHub Actions를 자주 작성하는 개발자에게 이는 효율성 신기원이다:
- 빠른 반복: workflow 수정 후 즉시 로컬에서 실행, GitHub 대기열과 실행 시간을 기다릴 필요 없음
- 리소스 절약: GitHub Actions 분(minute) 소모 없음(특히 프라이빗 저장소)
- 오프라인 디버깅: 네트워크 연결 없이도 workflow 테스트 가능
- 보안 테스트: 격리된 환경에서 workflow 보안 검증, 위험한 작업의 실수 실행 방지
왜 Act가 필요한가?
GitHub Actions는 강력한 CI/CD 플랫폼이지만, workflow 디버깅에는 한 가지 골칫거리가 있다:
.github/workflows/test.yml 수정
→ git commit
→ git push
→ GitHub 대기열 대기(몇 분에서 몇 시간까지)
→ 로그 확인 후 오류 발견
→ 위 단계 반복
이 사이클은 매우 시간이 많이 든다. Act를 사용하면:
.github/workflows/test.yml 수정
→ act -j test # 로컬에서 즉시 실행
→ 출력 확인, 문제 수정
→ 다시 실행, 문제없음 확인 후 푸시
효율성이 최소 10배 향상된다.
Act vs 다른 솔루션
| 특성 | Act | GitHub 웹 UI | Docker Compose 시뮬레이션 |
|---|---|---|---|
| 실행 속도 | ⚡ 로컬 즉시 | 🐌 대기열 필요 | ⚡ 로컬이지만 설정 복잡 |
| 실제성 | ✅ 실제 GitHub Actions runner 이미지 사용 | ✅ 완전 실제 | ❌ 수동 시뮬레이션 필요 |
| 비용 | 💰 무료(로컬 실행) | 💰 Actions 분 소모 | 💰 무료 |
| 사용 편의성 | ✅ 단일 명령어 | ✅ 그래픽 인터페이스 | ❌ 설정 번거로움 |
| 오프라인 지원 | ✅ 완전 오프라인 | ❌ 네트워크 필요 | ✅ 오프라인 가능 |
Act 설치
macOS(Homebrew)
brew install act
Linux
Ubuntu/Debian:
curl https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash
Arch Linux:
yay -S act
# 또는
paru -S act
Windows
Chocolatey:
choco install act-cli
Scoop:
scoop install act
설치 확인
act --version
# 출력 예시: act version 0.2.x
빠르게 시작하기: 첫 번째 Workflow 실행
사전 조건
프로젝트 루트 디렉토리에 .github/workflows/ 디렉토리가 있고, 그 안에 최소 하나의 workflow 파일(.yml 또는 .yaml)이 있는지 확인한다.
사용 가능한 Workflow 나열
cd /path/to/your/project
act -l
출력 예시:
Stage Job ID Job name Workflow name Workflow file Events
0 test Test CI ci.yml push,pull_request
0 build Build CI ci.yml push,pull_request
특정 Job 실행
# test라는 이름의 job 실행
act -j test
# 모든 job 실행
act
# 특정 이벤트로 트리거되는 workflow 실행(pull_request 등)
act pull_request
첫 실행 시 주의사항
처음 실행할 때 Act는 필요한 Docker 이미지를 다운로드한다(보통 catthehacker/ubuntu:act-latest). 이 과정은 몇 분 정도 걸릴 수 있다. 이후 실행에서는 캐시를 사용하여 더 빠르게 진행된다.
INFO[0000] Using docker host 'unix:///var/run/docker.sock'
INFO[0000] Pulling image 'catthehacker/ubuntu:act-latest'
...
고급 활용법
1. 다른 Runner 이미지 사용
Act는 기본적으로 Ubuntu 이미지를 사용하지만, -P 파라미터로 다른 플랫폼을 지정할 수 있다:
# Ubuntu 22.04 사용
act -P ubuntu-latest=catthehacker/ubuntu:act-22.04
# Ubuntu 20.04 사용
act -P ubuntu-latest=catthehacker/ubuntu:act-20.04
# 경량 이미지 사용(더 빠르지만 기능 제한적)
act -P ubuntu-latest=node:16-buster-slim
2. Secret과 환경 변수 전달
많은 workflow가 secret(API 키, Token 등)에 의존한다. .env 파일이나 커맨드라인으로 전달할 수 있다:
방법 1: .env 파일 사용
프로젝트 루트에 .env 파일 생성:
MY_API_KEY=your_secret_key
GITHUB_TOKEN=ghp_xxxxxxxxxxxx
그런 다음 실행:
act --secret-file .env
방법 2: 커맨드라인 직접 전달
act -s MY_API_KEY=your_secret_key -s GITHUB_TOKEN=ghp_xxxxxxxxxxxx
3. 여러 Job 병렬 실행
workflow에 독립적인 job이 여러 개 있다면 --parallel로 속도를 높일 수 있다:
act --parallel
4. 드라이 런 모드(Dry Run)
실제 실행 없이 실행될 단계만 출력:
act -n
5. 사용자 정의 작업 디렉토리
workflow가 특정 디렉토리 구조에 의존한다면 바인드 마운트를 사용할 수 있다:
act --bind
현재 디렉토리를 컨테이너 내부에 마운트하여 파일 수정이 실시간으로 반영되도록 한다.
실전 사례
사례 1: Node.js 프로젝트 CI 디버깅
Node.js 프로젝트가 있고, workflow가 다음과 같다고 가정하자:
# .github/workflows/nodejs.yml
name: Node.js CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
로컬에서 실행:
act -j test
테스트가 실패하면 Act가 전체 로그 출력을 표시하므로 문제 위치 파악이 쉽다.
사례 2: 다중 버전 Python 매트릭스 테스트
# .github/workflows/python.yml
name: Python Tests
on: [push]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.9', '3.10', '3.11', '3.12']
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: pytest
모든 Python 버전 테스트 실행:
act -j test
Act가 자동으로 매트릭스의 모든 조합을 순회하며 차례로 실행한다.
사례 3: Docker 빌드 디버깅
# .github/workflows/docker.yml
name: Build Docker Image
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Docker image
run: docker build -t myapp:${{ github.sha }} .
- name: Run tests in container
run: docker run myapp:${{ github.sha }} npm test
로컬에서 실행하기 전에 Docker daemon이 실행 중인지 확인:
# Docker 사용 가능 여부 확인
docker info
# workflow 실행
act -j build
일반적인 문제 해결
문제 1: 권한 오류
현상: permission denied while trying to connect to the Docker daemon socket
해결:
# 현재 사용자를 docker 그룹에 추가
sudo usermod -aG docker $USER
# 재로그인하거나 newgrp docker 실행
또는 sudo로 Act 실행(권장하지 않음):
sudo act
문제 2: 메모리 부족
현상: 대형 workflow 실행 시 OOM(Out of Memory)
해결: 동시 job 수 제한
act --max-parallel 1
문제 3: Action을 찾을 수 없음
현상: unable to find action 'actions/checkout@v4'
해결: Act는 GitHub에서 action을 다운로드해야 하므로 네트워크 연결이 정상인지 확인한다. 프라이빗 action의 경우 GITHUB_TOKEN을 설정해야 한다.
문제 4: 환경 변수가 적용되지 않음
현상: workflow에서 참조하는 환경 변수가 비어 있음
해결: --secret-file 또는 -s로 변수를 올바르게 전달했는지, 그리고 workflow에서 ${{ env.VAR_NAME }} 또는 ${{ secrets.VAR_NAME }}로 참조하는지 확인한다.
모범 사례
- 푸시 전 항상 로컬 테스트: workflow 수정 후 Act로 먼저 검증하는 습관 들이기
.env파일로 secret 관리: 민감 정보 하드코딩 금지,.env를.gitignore에 추가- Act 정기 업데이트:
brew upgrade act또는 최신 버전 재다운로드 설치 - VS Code와 함께 사용: GitHub Actions 확장 설치, 에디터에서 workflow 직접 미리보기
- CI에서 Act를 선택적 단계로 유지: PR 템플릿에 기여자에게 로컬 테스트 안내 포함
요약
Act는 GitHub Actions 개발자의 필수 도구로, 원래 몇 분에서 몇 시간이 걸리던 디버깅 사이클을 몇 초로 단축시킨다. 간단한 단위 테스트 workflow부터 복잡한 다단계 배포 파이프라인까지, Act를 사용하면 로컬에서 빠르게 검증할 수 있다.
핵심 장점 리뷰: - ⚡ 빠른 반복: 로컬 즉시 실행, GitHub 대기열 불필요 - 💰 비용 절감: GitHub Actions 분 소모 없음 - 🔒 보안 격리: 컨테이너에서 실행, 호스트 환경 영향 없음 - 🛠️ 실제 환경: GitHub와 동일한 runner 이미지 사용, 결과 신뢰성 확보
GitHub Actions workflow를 자주 작성하거나 유지보수한다면 Act를 도구 상자에 추가하기를 강력히 권장한다.
관련 링크: - Act GitHub 저장소 - Act 공식 문서 - GitHub Actions 문서