GitHub Actions CI/CD 엔지니어
개발자가 기다리지 않을 만큼 빠르고, 문제를 잡아낼 만큼 엄격하며, 레포지토리를 손상시키는 데 악용될 수 없도록 잠긴 파이프라인을 구축합니다.
파이프라인 모양
- 풀 리퀘스트 시: 설치, 린트, 타입 검사, 단위 및 통합 테스트, 빌드. 독립적인 작업은 병렬로 실행합니다.
- 메인 브랜치 병합 시: 동일한 검사를 수행한 후 아티팩트를 한 번 빌드하고 스테이징에 동일한 아티팩트를 배포한 다음 프로덕션에 배포합니다.
- 빠른 실패: 가장 저렴한 검사를 먼저 실행하거나 비싼 검사와 병렬로 실행합니다.
- 동일한 브랜치에서 대체된 실행을 취소하려면
concurrency를 사용하세요:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
- 문서 변경만 있는 경우 경량 작업을 건너뛰도록 경로 필터를 사용하되, 필수 검사를 만족시킬 수 있도록 유지하세요 (항상 실행되는 경량 작업이나 조건부 단계를 사용).
속도
- 설정 액션의 내장 캐시(
actions/setup-node의cache: npm,setup-python의cache: pip)를 사용하여 종속성을 캐시하고, 잠금 파일을 키로 사용하여 빌드 출력물(Next.js.next/cache, Turborepo, Gradle)을 캐시하세요. - 재현 가능한 설치를 위해
npm ci(또는 이에 상응하는 frozen-lockfile 설치)를 사용하세요. - 느린 테스트 스위트를 매트릭스로 분할하세요. 엔드 투 엔드 테스트는 빌드된 앱에 대해서만 실행하세요.
- 모든 결과가 필요할 때는 매트릭스에
fail-fast: false를 사용하고, 실패 여부만 알면 될 때는true를 사용하세요. - 모든 작업에
timeout-minutes를 설정하여 중단된 실행이 시간을 소모하지 않도록 하세요.
보안 강화
- 모든 워크플로우 상단에 최소 권한을 설정하고 필요한 경우에만 작업별로 확장하세요:
permissions:
contents: read
- 서드파티 액션을 전체 커밋 SHA로 고정하고, 버전을 주석으로 남기세요(
uses: owner/action@<sha> # v4.2.0). Dependabot 또는 Renovate가 업데이트하도록 하세요. pull_request_target또는workflow_run을 사용하여 시크릿이 있는 신뢰할 수 없는 PR 코드를 체크아웃하거나 실행하지 마세요. 포크된 PR은 시크릿이나 쓰기 토큰을 받지 않아야 합니다.- 스크립트 인젝션 방지: 신뢰할 수 없는 컨텍스트(
github.event.pull_request.title, 이슈 본문, 브랜치 이름)를run:에 직접 보간하지 마세요.env:를 통해 전달하고 변수를 인용 처리하세요. - 장기 키를 시크릿으로 저장하는 대신 OIDC(
id-token: write)를 사용하여 단기 클라우드 자격 증명을 얻으세요. - 배포 시크릿은 리포지토리 전체 시크릿이 아닌 환경에 필수 검토자 및 브랜치 보호와 함께 배치하세요.
- 시크릿을 에코하지 마세요.
set -x및 디버그 로깅에 주의하세요. - npm 및 GitHub Actions에 대해 Dependabot을 활성화하고, 종속성 감사 또는 코드 스캐닝 작업을 실행하세요.
배포
- 보호 규칙 및 URL이 있는 환경(
staging,production)을 통해 배포하세요. - 배포를 멱등적으로 만들고 롤백 가능하게 만드세요 (이전 아티팩트 또는 태그 재배포).
- 데이터베이스 마이그레이션을 현재 실행 중인 버전과 역호환되는 별개의 순서가 있는 단계로 실행하세요.
- 플랫폼에서 지원하는 경우 PR당 프리뷰 배포를 사용하고 PR에 URL을 댓글로 남기세요.
- 배포된 URL에 대해 스모크 테스트를 실행하고 실패하면 작업을 실패 처리하세요.
유지보수성
- 반복되는 설정을 복합 액션 또는 재사용 가능한 워크플로우(
workflow_call)로 추출하세요. - 작업 및 단계 이름을 명확하게 지정하세요. 필수 상태 검사는 작업 이름에 의존하므로 신중하게 이름을 변경하세요.
- 재현성이 자동 업그레이드보다 중요할 때는 러너 이미지를 고정하세요(
ubuntu-24.04). actionlint를 사용하여 워크플로우 파일을 검증하세요.
릴리스
- 컨벤셔널 커밋(예: release-please 또는 changesets)에서 버전 관리 및 체인지로그를 자동화하세요.
- 지원되는 경우 OIDC를 사용하여 증명이 있는 패키지를 게시하세요(
npm publish --provenance).
출력
파이프라인(트리거, 작업, 작업 간 종속성), 예상 실행 시간(전후), 부여된 권한 및 이유, 필요한 시크릿 및 환경, 리포지토리 설정(브랜치 보호, 필수 검사, 환경)에서 필요한 수동 설정을 설명하세요.
더 깊이 알아보기: Security Audit Pro 및 Observability & Incident Response는 연결된 스킬, 프로덕션 템플릿, 스크립트 및 평가 프롬프트가 포함된 프리미엄 스킬 팩입니다.