From ac119a3559cf33ac576163dce664ab4a3f7c12f0 Mon Sep 17 00:00:00 2001 From: wbsong111 Date: Wed, 8 Jul 2026 16:55:08 +0900 Subject: [PATCH] fix(sbom-ci): auth docker.getcollate.io (Docker Hub proxy) + raise trivy timeout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit openmetadata 실패의 진짜 원인은 참조 오류가 아니라 docker.getcollate.io(Docker Hub 프록시)의 익명 pull rate limit(TOOMANYREQUESTS)였음. 인증 config 에 getcollate 를 추가(Docker Hub 자격증명)하고, 대용량 이미지 분석을 위해 trivy 타임아웃 기본값을 10m→15m(TRIVY_TIMEOUT). 로컬 검증: 인증+타임아웃으로 openmetadata server SBOM 생성 성공(655 comp). Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/sbom.yml | 3 +++ doc/sbom-pipeline.md | 2 +- doc/scripts/generate-sbom.sh | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sbom.yml b/.github/workflows/sbom.yml index 49736e9..a2dc6a2 100644 --- a/.github/workflows/sbom.yml +++ b/.github/workflows/sbom.yml @@ -65,6 +65,9 @@ jobs: if user and secret: auths[reg]={"auth":base64.b64encode(f"{user}:{secret}".encode()).decode()} add("https://index.docker.io/v1/", os.environ.get("DOCKERHUB_USER"), os.environ.get("DOCKERHUB_TOKEN")) + # docker.getcollate.io(openmetadata)는 Docker Hub 프록시 → 익명 pull 시 Docker Hub rate + # limit(TOOMANYREQUESTS)에 걸린다. Docker Hub 자격증명으로 인증해 해소. + add("docker.getcollate.io", os.environ.get("DOCKERHUB_USER"), os.environ.get("DOCKERHUB_TOKEN")) add("nvcr.io", "$oauthtoken", os.environ.get("NGC_API_KEY")) out=os.path.join(os.environ["OUT_DIR"],".docker","config.json") json.dump({"auths":auths}, open(out,"w")) diff --git a/doc/sbom-pipeline.md b/doc/sbom-pipeline.md index 08be9f5..3a93350 100644 --- a/doc/sbom-pipeline.md +++ b/doc/sbom-pipeline.md @@ -105,7 +105,7 @@ gh run watch --repo /dip-catalog | 종류 | 이름 | 용도 | |------|------|------| | **Variable** | `SBOM_PIPELINE_IMAGE` | 실행 이미지 태그 (예: `docker.io/wbsong111/sbom-pipeline:latest`) | -| Secret | `DOCKERHUB_USER` / `DOCKERHUB_TOKEN` | **docker.io rate limit 회피**(이미지는 public). pull 만 하므로 read-only PAT 권장 | +| Secret | `DOCKERHUB_USER` / `DOCKERHUB_TOKEN` | **docker.io + docker.getcollate.io rate limit 회피**. getcollate(openmetadata)는 Docker Hub 프록시라 익명 pull 시 rate limit(TOOMANYREQUESTS)에 걸림 → Docker Hub 자격증명으로 인증. pull 만 하므로 read-only PAT 권장 | | Secret | `NGC_API_KEY` | **nvcr.io 인증**(NVIDIA nemo/nim — 없으면 pull 불가) | | Secret | (필요 시) paasup 사설 레지스트리 자격증명 | `paasup/*` 이미지가 사설일 때 | diff --git a/doc/scripts/generate-sbom.sh b/doc/scripts/generate-sbom.sh index ebc3b9b..a9011e2 100755 --- a/doc/scripts/generate-sbom.sh +++ b/doc/scripts/generate-sbom.sh @@ -22,6 +22,7 @@ # RETRIES 실패 이미지 재시도 횟수 (기본 1) # LIMIT 대상 이미지 수 상한 (기본 0 = 전체) # TRIVY_CACHE_DIR trivy 캐시 디렉토리 (미설정 시 trivy 기본 ~/.cache/trivy) +# TRIVY_TIMEOUT 이미지당 분석 타임아웃 (기본 15m — 대용량 이미지 여유) # MERGE=1 cyclonedx CLI 가 있으면 catalog.cdx.json 병합 생성 (선택) # 사설 레지스트리 인증: trivy 네이티브 방식 사용 — # - 단일 레지스트리: TRIVY_USERNAME / TRIVY_PASSWORD @@ -44,6 +45,7 @@ PARALLEL="${PARALLEL:-3}" RETRY_PARALLEL="${RETRY_PARALLEL:-1}" RETRIES="${RETRIES:-1}" LIMIT="${LIMIT:-0}" +TRIVY_TIMEOUT="${TRIVY_TIMEOUT:-15m}" # 대용량 이미지(예: openmetadata) 분석 여유 [ -n "${TRIVY_CACHE_DIR:-}" ] && export TRIVY_CACHE_DIR # trivy 가 네이티브로 인식 ts() { date -u +%Y-%m-%dT%H:%M:%SZ; } @@ -58,7 +60,7 @@ if [ "${1:-}" = "--gen-one" ]; then # --cache-backend memory : 분석 캐시를 메모리에 두어 공유 캐시 디렉토리의 bolt 잠금 충돌 방지(병렬 안전). # --skip-db-update : DB 는 메인 모드에서 1회 워밍했으므로 읽기만. if trivy image --quiet --cache-backend memory --skip-db-update \ - --format cyclonedx --timeout 10m --output "$out" "$img" 2>"$out.err"; then + --format cyclonedx --timeout "$TRIVY_TIMEOUT" --output "$out" "$img" 2>"$out.err"; then dur=$(( $(date +%s) - t0 )) if [ -s "$out" ]; then line="$(printf '%s\tOK\t%s\t%s' "$img" "$dur" "$out")" else rm -f "$out"; line="$(printf '%s\tERROR:empty-sbom\t%s\t' "$img" "$dur")"; fi