fix(sbom-ci): auth docker.getcollate.io (Docker Hub proxy) + raise trivy timeout

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) <noreply@anthropic.com>
This commit is contained in:
wbsong111
2026-07-08 16:55:08 +09:00
parent 18ca8cd979
commit ac119a3559
3 changed files with 7 additions and 2 deletions
+3
View File
@@ -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"))
+1 -1
View File
@@ -105,7 +105,7 @@ gh run watch --repo <org>/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/*` 이미지가 사설일 때 |
+3 -1
View File
@@ -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