소스 정보
- 저장소
- puk0806/gugbab-claude
- 최근 소스 활동
- 2026년 8월 12일 00:35
- 감지된 SKILL.md 언어
- 한국어
- 스타
- 2
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/puk0806/gugbab-claude --skill github-actions명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
DDD(Domain-Driven Design) 아키텍처 핵심 패턴 - 유비쿼터스 언어, 서브도메인, 바운디드 컨텍스트, Aggregate, Entity/VO, 도메인 서비스/이벤트, 레이어드 아키텍처
대규모 React/Next.js 프로젝트를 layer-first(types/·utils/·hooks/·api/·components/ 밑에 도메인이 반복되는 구조)에서 domain-first(feature/도메인 우선) 구조로 전환하는 설계 기준과 절차. Feature-Sliced Design 2.1 정본(layers 6종·slices·segments·import 규칙·@x 크로스임포트·public API), FSD를 쓰지 않는 경량 대안(features + shared 2~3계층 + ESLint import/no-restricted-paths), Next.js App Router 공존 전략(route group `()`·private folder `_`·colocation), Turborepo/Nx 모노레포에서 폴더↔패키지 승격 기준, colocation과 배럴 파일 성능 트레이드오프, 도메인 경계 역추출(import 그래프·change coupling·용어 클러스터), 전환 실패 패턴(shared 비대화·entities 남용·순환 의존·도메인=라우트 착각·조기 추상화). 도메인 개념 자체(바운디드 컨텍스트·유비쿼터스 언어)는 `architecture/ddd` 스킬을 참조한다.
소스 파일 수천 개 규모 프론트엔드 코드베이스를 멈추지 않고 점진 재구조화하는 실행 전략 - Strangler Fig / Branch by Abstraction / Parallel Change, ts-morph·jscodeshift codemod, PR 분할·검증 게이트·되돌리기, 테스트 없는 코드의 안전망, 작업 순서 설계와 위반 수 기반 진행 추적
SKILL.md 표시 중
| name | github-actions |
| description | GitHub Actions CI/CD 워크플로우 작성 패턴 - 트리거, 잡 의존성, 매트릭스, 캐싱, 시크릿, Docker, 배포, 모노레포 |
| disable-model-invocation | true |
소스:
- https://docs.github.com/en/actions
- https://github.com/actions/checkout (README·releases)
- https://github.blog/changelog/2026-06-18-safer-pull_request_target-defaults-for-github-actions-checkout/
검증일: 2026-08-11
주의: 이 문서는 2026-08 기준 최신 메이저 버전으로 작성되었습니다.
actions/checkout@v7(7.0.1, 2026-07-20),actions/cache@v6(6.1.0),actions/setup-node@v7(7.0.0),actions/upload-artifact@v7(7.0.1),actions/download-artifact@v8(8.0.1),actions/github-script@v9(9.0.0),dorny/paths-filter@v4(4.0.3),pnpm/action-setup@v6(6.0.10),Swatinem/rust-cache@v2(2.9.2) 기준입니다.
보안 필독 — actions/checkout v7 기본값 변경 (2026-06-18):
pull_request_target및workflow_run(pull_request 계열 이벤트로 트리거된 경우) 워크플로우에서 포크 PR 코드 체크아웃이 기본 차단됩니다. 2026-07-20부터 v2~v6 지원 메이저에도 백포트되어,@v4같은 부동(floating) 태그를 쓰는 기존 워크플로우도 영향을 받습니다. 상세는 아래 "포크 PR 보안 — checkout v7 pwn request 차단" 섹션 참조.
워크플로우 파일은 .github/workflows/ 디렉토리에 .yml 또는 .yaml 확장자로 저장한다.
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Build
run: npm run build
on:
push:
branches:
- main
- 'releases/**'
tags:
- 'v*'
paths:
- 'src/**'
- '*.json'
paths-ignore:
- 'docs/**'
- '**.md'
pull_request:
types: [opened, synchronize, reopened]
branches:
- main
paths:
- 'src/**'
pull_request 기본 activity types: opened, synchronize, reopenedbranches와 branches-ignore는 동시 사용 불가 (같은 이벤트 내에서)paths와 paths-ignore도 동시 사용 불가on:
workflow_dispatch:
inputs:
environment:
description: '배포 환경'
required: true
type: choice
options:
- staging
- production
dry-run:
description: 'Dry run 여부'
type: boolean
default: false
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- run: echo "Deploying to ${{ inputs.environment }}"
string, choice, boolean, environmenton:
schedule:
- cron: '0 9 * * 1-5' # 평일 09:00 UTC
jobs:
nightly:
runs-on: ubuntu-latest
steps:
- run: echo "Scheduled job"
분(0-59) 시(0-23) 일(1-31) 월(1-12) 요일(0-6)timezone 필드로 타임존 지정 가능on:
workflow_call:
inputs:
node-version:
type: string
required: true
secrets:
npm-token:
required: false
outputs:
build-result:
description: "빌드 결과"
value: ${{ jobs.build.outputs.result }}
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- run: npm run lint
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- run: npm test
build:
needs: [lint, test] # lint, test 모두 성공 후 실행
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- run: npm run build
deploy:
needs: build
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- run: echo "Deploying..."
needs에 나열된 잡이 모두 성공해야 실행if: always() 또는 if: failure() 사용jobs:
setup:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.get-version.outputs.version }}
steps:
- id: get-version
run: echo "version=1.2.3" >> $GITHUB_OUTPUT
use-version:
needs: setup
runs-on: ubuntu-latest
steps:
- run: echo "Version is ${{ needs.setup.outputs.version }}"
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false # 하나 실패해도 나머지 계속 실행
max-parallel: 3 # 동시 실행 최대 수
matrix:
node-version: [18, 20, 22]
os: [ubuntu-latest, macos-latest]
include:
- node-version: 22
os: ubuntu-latest
experimental: true
exclude:
- node-version: 18
os: macos-latest
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.experimental || false }}
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: ${{ matrix.node-version
fail-fast: 기본값 true (하나 실패 시 전체 취소)exclude: 부분 매칭으로 제외 (모든 키를 명시하지 않아도 됨)include: exclude 이후 처리되므로 제외된 조합을 다시 추가 가능- name: Cache node_modules
id: cache-deps
uses: actions/cache@v6
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-node-
- if: steps.cache-deps.outputs.cache-hit != 'true'
run: pnpm install --frozen-lockfile
캐시 키 매칭 순서:
key 정확히 일치key 접두사 일치restore-keys 순차 매칭캐시 제한:
- uses: pnpm/action-setup@v6
with:
version: 9
- uses: actions/setup-node@v7
with:
node-version: 20
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
pnpm/action-setup@v6의 version 입력은 package.json에 packageManager 또는 devEngines.packageManager 필드가 있으면 생략 가능하고, 없으면 필수다pnpm/action-setup 대신 런타임 설치까지 통합한 pnpm/setup 사용을 권장한다actions/setup-node@v7은 내부가 ESM으로 이관됐고, registry-url만 지정하고 NODE_AUTH_TOKEN이 없을 때 넣어주던 더미 토큰 폴백이 제거됐다 (Yarn Classic·구형 npm 조합에서 영향)- uses: dtolnay/rust-toolchain@stable
with:
components: clippy, rustfmt
- uses: Swatinem/rust-cache@v2
- run: cargo check
- run: cargo clippy -- -D warnings
- run: cargo test
~/.cargo (레지스트리, 바이너리)와 ./target (빌드 아티팩트)를 캐싱Cargo.lock, Cargo.toml, rust-toolchain.toml의 해시로 자동 생성| 레벨 | 범위 | CLI 생성 |
|---|---|---|
| Repository | 단일 레포 | gh secret set SECRET_NAME |
| Environment | 특정 환경 | gh secret set --env production SECRET_NAME |
| Organization | 조직 전체 | gh secret set --org ORG SECRET_NAME --visibility all |
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy
env:
API_KEY: ${{ secrets.API_KEY }}
DB_URL: ${{ secrets.DATABASE_URL }}
run: |
deploy-script "$API_KEY"
주의사항:
GITHUB_TOKEN 제외)jobs:
deploy-prod:
runs-on: ubuntu-latest
environment:
name: production
url: https://example.com
steps:
- run: echo "Production deploy"
pull_request_target 워크플로우는 base 레포의 GITHUB_TOKEN·시크릿·기본 브랜치 캐시 스코프를 가진 채 실행된다.
여기서 포크 PR의 head 코드를 체크아웃해 실행하면 공격자가 그 권한을 그대로 획득한다 — 전형적인 pwn request 취약점이다.
actions/checkout v7(2026-06-18 GA)부터 포크 PR 코드 체크아웃이 기본 차단된다.
| 항목 | 내용 |
|---|---|
| 차단 대상 이벤트 | pull_request_target, workflow_run(단, workflow_run.event가 pull_request*일 때만) |
| 차단되는 입력 패턴 | 포크 레포를 가리키는 repository:, refs/pull/<n>/head·refs/pull/<n>/merge 형태의 ref:, 포크 PR의 head/merge 커밋 SHA로 해석되는 ref: |
| 영향 없음 | 같은 레포에서 올라온 PR, 일반 pull_request 이벤트 |
| 백포트 | 2026-07-20부터 v2~v6 지원 메이저에 적용 (v1은 제외) |
| 부동 태그 | @v4 등 메이저 태그 사용 시 자동 적용 / SHA·마이너·패치 핀은 미적용이라 별도 업그레이드 필요 |
| 예외 입력 | allow-unsafe-pr-checkout (기본 false) |
# 차단됨 (기본값) — 포크 PR 코드를 신뢰 컨텍스트에서 체크아웃
on: pull_request_target
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
with:
ref: ${{ github.event.pull_request.head.sha }} # ← v7에서 실패
# 권장 — 신뢰 컨텍스트에서는 base 코드만 체크아웃하고,
# 포크 코드가 필요한 검사는 시크릿 없는 pull_request 워크플로우로 분리
on: pull_request_target
permissions:
contents: read
pull-requests: write
jobs:
label:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7 # ref 미지정 → base 브랜치 체크아웃
- run: ./scripts/label.sh # 포크 코드를 실행하지 않음
대응 원칙:
pull_request 이벤트를 쓴다 (시크릿 미전달 + 읽기 전용 토큰)allow-unsafe-pr-checkout: true는 최후의 수단이다. 켜야 한다면 시크릿을 잡에서 제거하고, permissions를 최소화하고, 승인 필요한 environment 뒤로 격리한 뒤에만 사용한다name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
contents: read
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: pnpm/action-setup@v6
with:
version: 9
- uses: actions/setup-node@v7
with:
node-version: 20
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- run: pnpm lint
- run: pnpm typecheck
- run: pnpm test
- run: pnpm build
상세 레퍼런스 (예제·고급 패턴·흔한 실수) →
references/REFERENCE.md