본문으로 건너뛰기

Recipe: CI/CD Skill Validation

CI 파이프라인에서 Skill을 자동으로 감사하고 동기화하세요.

시나리오

팀 Skill 저장소가 있고 모든 PR이 다음을 만족하기를 원합니다:

  • 보안 감사 통과(프롬프트 인젝션, 자격 증명 탈취 등 없음)
  • SKILL.md 형식 검증
  • 오류 없이 동기화됨

해결 방법

GitHub Actions(setup-skillshare 사용)

setup-skillshare 액션은 설치, 초기화, 선택적인 보안 감사를 한 단계에서 처리합니다.

name: Skill Validation
on:
pull_request:
paths:
- 'skills/**'

jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: runkids/setup-skillshare@v1
with:
source: ./skills
audit: true
audit-threshold: high
- run: skillshare sync --dry-run

SARIF 업로드를 사용하는 GitHub Actions

GitHub Code Scanning을 통해 인라인 PR 주석을 받으려면 SARIF 출력을 사용하세요:

name: Skill Security Scan
on:
pull_request:
paths: ['skills/**']
push:
branches: [main]

jobs:
validate:
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@v4
- uses: runkids/setup-skillshare@v1
with:
source: ./skills
audit: true
audit-threshold: high
audit-format: sarif
audit-output: results.sarif

- name: Upload SARIF to Code Scanning
if: always()
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
category: skillshare-audit

- run: skillshare sync --dry-run

액션 없이(수동 설정)

액션을 사용하지 않으려면 skillshare를 직접 설치할 수 있습니다:

jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: curl -fsSL https://raw.githubusercontent.com/runkids/skillshare/main/install.sh | sh
- run: skillshare init --no-copy --all-targets --no-git --no-skill --source ./skills
- run: skillshare audit --threshold high --format json
- run: skillshare sync --dry-run

GitLab CI

.gitlab-ci.yml을 만드세요:

skill-validation:
image: ghcr.io/runkids/skillshare-ci:latest
stage: test
script:
- skillshare init
- skillshare install . --into ci-check
- skillshare audit --threshold high --format json
- skillshare sync --dry-run
rules:
- changes:
- skills/**/*

CI Docker 이미지 사용하기

더 빠른 파이프라인 시작을 위해 미리 빌드된 CI 이미지를 사용하세요:

# GitHub Actions
jobs:
validate:
runs-on: ubuntu-latest
container:
image: ghcr.io/runkids/skillshare-ci:latest
steps:
- uses: actions/checkout@v4
- run: skillshare init && skillshare audit --format json

출력 형식

audit 명령어는 다양한 CI/CD 통합 요구 사항을 위해 여러 출력 형식을 지원합니다.

종료 코드

# 임계값 이상의 발견 사항이 있으면 배포 차단
skillshare audit --threshold high
echo $? # 0 = 정상, 1 = 발견 사항 있음

SARIF 출력

SARIF(Static Analysis Results Interchange Format)는 GitHub Code Scanning, VS Code SARIF Viewer, Azure DevOps, SonarQube 등의 정적 분석 도구가 사용하는 OASIS 표준입니다.

skillshare audit --format sarif              # stdout으로 출력
skillshare audit --format sarif > results.sarif # 파일로 저장

SARIF 출력에는 다음이 포함됩니다:

  • 도구 메타데이터 — 도구 이름(skillshare), 버전, 정보 URI
  • 규칙security-severity 점수가 포함된 중복 제거된 규칙 서술자
  • 결과 — 파일 위치와 심각도 수준이 매핑된 각 발견 사항

SARIF 수준으로의 심각도 매핑:

skillshare 심각도SARIF 수준security-severity
CRITICALerror9.0
HIGHerror7.0
MEDIUMwarning4.0
LOWnote2.0
INFOnote0.5

Markdown 리포트

GitHub Issues, Pull Requests, 또는 문서에 붙여넣기 적합한 독립형 Markdown 리포트를 생성하세요:

skillshare audit --format markdown               # stdout에 출력
skillshare audit --format markdown > report.md # 파일로 저장
skillshare audit -p --format markdown > report.md # 프로젝트 모드

리포트에는 다음이 포함됩니다:

  • 헤더 — 스캔된 개수, 모드, 임계값
  • 요약 표 — 통과/경고/실패 개수, 심각도 분류, 리스크 점수, 분석 가능 여부
  • 발견 사항 — 심각도, 패턴, 메시지, 위치가 포함된 Skill별 표; 접을 수 있는 스니펫
  • 정상 Skill — 발견 사항이 없는 Skill의 콤마로 구분된 목록

jq를 이용한 JSON 출력

# CRITICAL 발견 사항이 있는 모든 Skill 나열
skillshare audit --json | jq '[.skills[] | select(.findings[] | .severity == "CRITICAL")]'

# 모든 Skill의 리스크 점수 추출
skillshare audit --json | jq '.skills[] | {name: .skillName, score: .riskScore, label: .riskLabel}'

# 심각도별 발견 사항 개수
skillshare audit --json | jq '[.skills[].findings[].severity] | group_by(.) | map({(.[0]): length}) | add'

검증

  • PR 체크 통과: audit이 0으로 종료(임계값 이상의 발견 사항 없음)
  • Audit JSON 출력을 다운스트림 도구로 파싱 가능
  • SARIF 업로드가 PR diff에 인라인 주석으로 발견 사항 표시
  • Sync dry-run이 예상되는 심볼릭 링크 작업 표시

변형

  • HIGH 심각도에서 차단: audit--threshold HIGH(또는 -T HIGH) 추가 — HIGH 이상의 발견 사항이 있으면 종료 코드가 0이 아님
  • Code Scanning을 위한 SARIF: 인라인 PR 주석을 위해 github/codeql-action/upload-sarif@v3와 함께 --format sarif 사용
  • 병렬 검증: 더 빠른 피드백을 위해 별도 CI 작업에서 audit과 sync 실행
  • 예약된 감사: 기존 Skill에서 새로 감지된 패턴을 잡기 위해 매일 밤 실행

관련 문서