Loading...
Loading...
GitHub Actions 워크플로우 생성, 보안 및 버전 관리 스킬. 다음 상황에서 사용: (1) 새 워크플로우 파일(.yml) 작성 시, (2) 기존 워크플로우 수정 시, (3) 액션 버전 검토 또는 업데이트 시, (4) CI/CD 보안 감사 시, (5) 'actions/', 'uses:', 'workflow', '.github/workflows' 키워드가 포함된 작업 시
npx skill4agent add dalestudy/skills github-actions# ❌ 오래된 버전 - 가장 흔한 실수
uses: actions/checkout@v4 # v6가 최신인 경우
# ✅ 최신 메이저 버전 (gh api로 확인 후 사용)
uses: actions/checkout@v6gh api repos/{owner}/{repo}/releases/latest --jq '.tag_name'
# 예시
gh api repos/actions/checkout/releases/latest --jq '.tag_name'
gh api repos/oven-sh/setup-bun/releases/latest --jq '.tag_name'참고: 보안 민감 환경이나 신뢰도 낮은 서드파티 액션은 SHA 피닝()을 고려.@a1b2c3...
# ❌ 하드코딩 - 보안 위험
env:
API_KEY: "sk-1234567890"
DATABASE_PASSWORD: "mypassword123"
# ✅ secrets 사용
env:
API_KEY: ${{ secrets.API_KEY }}
DATABASE_PASSWORD: ${{ secrets.DATABASE_PASSWORD }}참고: Using secrets
# ❌ 인젝션 취약 - github.event 직접 사용
run: echo "${{ github.event.issue.title }}"
run: gh issue comment ${{ github.event.issue.number }} --body "${{ github.event.comment.body }}"
# ✅ 환경변수로 전달하여 인젝션 방지
env:
ISSUE_TITLE: ${{ github.event.issue.title }}
COMMENT_BODY: ${{ github.event.comment.body }}
run: |
echo "$ISSUE_TITLE"
gh issue comment ${{ github.event.issue.number }} --body "$COMMENT_BODY"# ⚠️ 위험 - 포크의 코드를 신뢰된 컨텍스트에서 실행
on: pull_request_target
steps:
- uses: actions/checkout@v{N}
with:
ref: ${{ github.event.pull_request.head.sha }} # 위험!pull_request_target# ❌ 불필요한 setup - node, npm, npx는 이미 설치됨
steps:
- uses: actions/setup-node@v{N}
- run: npx some-command
# ✅ 바로 사용
steps:
- run: npx some-command
- run: python script.py
- run: docker build .# ✅ 권한 범위: workflow > job > step (좁을수록 좋음)
jobs:
build:
permissions:
contents: read # job 레벨에서 필요한 권한만name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
# 버전은 gh api로 확인 후 사용
- uses: actions/checkout@v{N}
- name: Setup Bun
uses: oven-sh/setup-bun@v{N}on:
push: # 푸시 시
branches: [main]
pull_request: # PR 생성/업데이트 시
branches: [main]
workflow_dispatch: # 수동 실행
schedule: # 스케줄 실행
- cron: "0 0 * * 1" # 매주 월요일 00:00 UTC
release: # 릴리스 생성 시
types: [published]
workflow_call: # 다른 워크플로우에서 호출permissions:
contents: read # CI (빌드/테스트), 코드 체크아웃
contents: write # 커밋/푸시
pull-requests: write # PR 코멘트 봇
issues: write # 이슈 코멘트
packages: write # 패키지 배포 (contents: write와 함께)
id-token: write # OIDC 클라우드 인증 (contents: read와 함께)# 버전은 gh api repos/{owner}/{repo}/releases/latest --jq '.tag_name'으로 확인
steps:
- uses: actions/cache@v{N} # 의존성 캐싱
- uses: actions/checkout@v{N} # 코드 체크아웃
- uses: actions/download-artifact@v{N} # 아티팩트 다운로드
- uses: actions/upload-artifact@v{N} # 아티팩트 업로드
- uses: oven-sh/setup-bun@v{N} # Bun 설정