fix(sbom-ci): clean artifact layout + add limit input for test runs
- 아티팩트: 요약(trivy-summary.md/tsv)·sbom-index.tsv 를 최상위, 이미지별 상세 SBOM 을 sbom/ 하위로 배치. 절대경로 업로드 시 v4 가 전체 경로트리를 보존하던 문제를 스테이징 디렉토리 + 상대경로 업로드로 해결. - workflow_dispatch 에 limit 입력 추가(0=전체, 테스트 시 소수만 생성). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -7,7 +7,12 @@ name: helm-catalog-sbom
|
|||||||
# 이미지를 지정해야 한다. (Settings > Secrets and variables > Actions > Variables)
|
# 이미지를 지정해야 한다. (Settings > Secrets and variables > Actions > Variables)
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch: {}
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
limit:
|
||||||
|
description: '대상 이미지 수 상한 (0=전체). 테스트 시 예: 3'
|
||||||
|
required: false
|
||||||
|
default: '0'
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- 'manifests/helm/**'
|
- 'manifests/helm/**'
|
||||||
@@ -87,6 +92,8 @@ jobs:
|
|||||||
run: cp "$OUT_DIR/images_final.tsv" "$OUT_DIR/images_scan.tsv"
|
run: cp "$OUT_DIR/images_final.tsv" "$OUT_DIR/images_scan.tsv"
|
||||||
|
|
||||||
- name: SBOM 생성 (CycloneDX)
|
- name: SBOM 생성 (CycloneDX)
|
||||||
|
env:
|
||||||
|
LIMIT: ${{ github.event.inputs.limit || '0' }} # workflow_dispatch 테스트용 상한
|
||||||
run: |
|
run: |
|
||||||
if [ -s "$OUT_DIR/images_scan.tsv" ]; then
|
if [ -s "$OUT_DIR/images_scan.tsv" ]; then
|
||||||
bash doc/scripts/generate-sbom.sh "$OUT_DIR/images_scan.tsv" "$OUT_DIR"
|
bash doc/scripts/generate-sbom.sh "$OUT_DIR/images_scan.tsv" "$OUT_DIR"
|
||||||
@@ -107,17 +114,29 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
if [ -f "$OUT_DIR/trivy-summary.md" ]; then cat "$OUT_DIR/trivy-summary.md" >> "$GITHUB_STEP_SUMMARY"; fi
|
if [ -f "$OUT_DIR/trivy-summary.md" ]; then cat "$OUT_DIR/trivy-summary.md" >> "$GITHUB_STEP_SUMMARY"; fi
|
||||||
|
|
||||||
- name: 아티팩트 업로드 (SBOM + 요약)
|
# 아티팩트 레이아웃 정리: 요약·인덱스는 최상위, 이미지별 상세 SBOM 은 sbom/ 하위.
|
||||||
|
# (절대경로로 업로드하면 v4 가 전체 경로트리를 보존하므로, 스테이징 후 상대경로로 업로드)
|
||||||
|
- name: 아티팩트 레이아웃 정리
|
||||||
|
if: always()
|
||||||
|
run: |
|
||||||
|
mkdir -p "$GITHUB_WORKSPACE/report/sbom"
|
||||||
|
cd "$OUT_DIR" 2>/dev/null || exit 0
|
||||||
|
# 최상위: 요약(md/tsv)·인덱스·병합 SBOM·실행 로그
|
||||||
|
for f in trivy-summary.md trivy-summary.tsv sbom-index.tsv catalog.cdx.json; do
|
||||||
|
[ -f "$f" ] && cp -f "$f" "$GITHUB_WORKSPACE/report/"
|
||||||
|
done
|
||||||
|
cp -f ./*.log "$GITHUB_WORKSPACE/report/" 2>/dev/null || true
|
||||||
|
# 하위 sbom/: 이미지별 CycloneDX 상세 (.err 제외)
|
||||||
|
cp -f sbom/*.cdx.json "$GITHUB_WORKSPACE/report/sbom/" 2>/dev/null || true
|
||||||
|
echo "=== report/ 최상위 ==="; ls -1 "$GITHUB_WORKSPACE/report"
|
||||||
|
echo "=== report/sbom 개수: $(ls -1 "$GITHUB_WORKSPACE/report/sbom" 2>/dev/null | wc -l) ==="
|
||||||
|
|
||||||
|
- name: 아티팩트 업로드
|
||||||
if: always()
|
if: always()
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: sbom-and-vuln-report
|
name: sbom-and-vuln-report
|
||||||
path: |
|
path: report # 상대경로 → 아티팩트 루트 = report/ 내용 (깔끔한 구조)
|
||||||
${{ env.OUT_DIR }}/sbom/**
|
|
||||||
${{ env.OUT_DIR }}/catalog.cdx.json
|
|
||||||
${{ env.OUT_DIR }}/sbom-index.tsv
|
|
||||||
${{ env.OUT_DIR }}/trivy-summary.*
|
|
||||||
${{ env.OUT_DIR }}/*.log
|
|
||||||
if-no-files-found: warn
|
if-no-files-found: warn
|
||||||
|
|
||||||
# 선택: PR 에서 CRITICAL 발견 시 실패 게이트 (필요 시 주석 해제)
|
# 선택: PR 에서 CRITICAL 발견 시 실패 게이트 (필요 시 주석 해제)
|
||||||
|
|||||||
Reference in New Issue
Block a user