From a61d6730ddd9b6cad51b231bf4a56c6632981aac Mon Sep 17 00:00:00 2001 From: wbsong111 Date: Wed, 8 Jul 2026 14:08:03 +0900 Subject: [PATCH] fix(sbom-ci): clean artifact layout + add limit input for test runs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 아티팩트: 요약(trivy-summary.md/tsv)·sbom-index.tsv 를 최상위, 이미지별 상세 SBOM 을 sbom/ 하위로 배치. 절대경로 업로드 시 v4 가 전체 경로트리를 보존하던 문제를 스테이징 디렉토리 + 상대경로 업로드로 해결. - workflow_dispatch 에 limit 입력 추가(0=전체, 테스트 시 소수만 생성). Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/sbom.yml | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/.github/workflows/sbom.yml b/.github/workflows/sbom.yml index 8b6c309..49736e9 100644 --- a/.github/workflows/sbom.yml +++ b/.github/workflows/sbom.yml @@ -7,7 +7,12 @@ name: helm-catalog-sbom # 이미지를 지정해야 한다. (Settings > Secrets and variables > Actions > Variables) on: - workflow_dispatch: {} + workflow_dispatch: + inputs: + limit: + description: '대상 이미지 수 상한 (0=전체). 테스트 시 예: 3' + required: false + default: '0' pull_request: paths: - 'manifests/helm/**' @@ -87,6 +92,8 @@ jobs: run: cp "$OUT_DIR/images_final.tsv" "$OUT_DIR/images_scan.tsv" - name: SBOM 생성 (CycloneDX) + env: + LIMIT: ${{ github.event.inputs.limit || '0' }} # workflow_dispatch 테스트용 상한 run: | if [ -s "$OUT_DIR/images_scan.tsv" ]; then bash doc/scripts/generate-sbom.sh "$OUT_DIR/images_scan.tsv" "$OUT_DIR" @@ -107,17 +114,29 @@ jobs: run: | 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() uses: actions/upload-artifact@v4 with: name: sbom-and-vuln-report - path: | - ${{ 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 + path: report # 상대경로 → 아티팩트 루트 = report/ 내용 (깔끔한 구조) if-no-files-found: warn # 선택: PR 에서 CRITICAL 발견 시 실패 게이트 (필요 시 주석 해제)