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:
@@ -65,6 +65,9 @@ jobs:
|
|||||||
if user and secret:
|
if user and secret:
|
||||||
auths[reg]={"auth":base64.b64encode(f"{user}:{secret}".encode()).decode()}
|
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"))
|
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"))
|
add("nvcr.io", "$oauthtoken", os.environ.get("NGC_API_KEY"))
|
||||||
out=os.path.join(os.environ["OUT_DIR"],".docker","config.json")
|
out=os.path.join(os.environ["OUT_DIR"],".docker","config.json")
|
||||||
json.dump({"auths":auths}, open(out,"w"))
|
json.dump({"auths":auths}, open(out,"w"))
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ gh run watch --repo <org>/dip-catalog
|
|||||||
| 종류 | 이름 | 용도 |
|
| 종류 | 이름 | 용도 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| **Variable** | `SBOM_PIPELINE_IMAGE` | 실행 이미지 태그 (예: `docker.io/wbsong111/sbom-pipeline:latest`) |
|
| **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 | `NGC_API_KEY` | **nvcr.io 인증**(NVIDIA nemo/nim — 없으면 pull 불가) |
|
||||||
| Secret | (필요 시) paasup 사설 레지스트리 자격증명 | `paasup/*` 이미지가 사설일 때 |
|
| Secret | (필요 시) paasup 사설 레지스트리 자격증명 | `paasup/*` 이미지가 사설일 때 |
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
# RETRIES 실패 이미지 재시도 횟수 (기본 1)
|
# RETRIES 실패 이미지 재시도 횟수 (기본 1)
|
||||||
# LIMIT 대상 이미지 수 상한 (기본 0 = 전체)
|
# LIMIT 대상 이미지 수 상한 (기본 0 = 전체)
|
||||||
# TRIVY_CACHE_DIR trivy 캐시 디렉토리 (미설정 시 trivy 기본 ~/.cache/trivy)
|
# TRIVY_CACHE_DIR trivy 캐시 디렉토리 (미설정 시 trivy 기본 ~/.cache/trivy)
|
||||||
|
# TRIVY_TIMEOUT 이미지당 분석 타임아웃 (기본 15m — 대용량 이미지 여유)
|
||||||
# MERGE=1 cyclonedx CLI 가 있으면 catalog.cdx.json 병합 생성 (선택)
|
# MERGE=1 cyclonedx CLI 가 있으면 catalog.cdx.json 병합 생성 (선택)
|
||||||
# 사설 레지스트리 인증: trivy 네이티브 방식 사용 —
|
# 사설 레지스트리 인증: trivy 네이티브 방식 사용 —
|
||||||
# - 단일 레지스트리: TRIVY_USERNAME / TRIVY_PASSWORD
|
# - 단일 레지스트리: TRIVY_USERNAME / TRIVY_PASSWORD
|
||||||
@@ -44,6 +45,7 @@ PARALLEL="${PARALLEL:-3}"
|
|||||||
RETRY_PARALLEL="${RETRY_PARALLEL:-1}"
|
RETRY_PARALLEL="${RETRY_PARALLEL:-1}"
|
||||||
RETRIES="${RETRIES:-1}"
|
RETRIES="${RETRIES:-1}"
|
||||||
LIMIT="${LIMIT:-0}"
|
LIMIT="${LIMIT:-0}"
|
||||||
|
TRIVY_TIMEOUT="${TRIVY_TIMEOUT:-15m}" # 대용량 이미지(예: openmetadata) 분석 여유
|
||||||
[ -n "${TRIVY_CACHE_DIR:-}" ] && export TRIVY_CACHE_DIR # trivy 가 네이티브로 인식
|
[ -n "${TRIVY_CACHE_DIR:-}" ] && export TRIVY_CACHE_DIR # trivy 가 네이티브로 인식
|
||||||
|
|
||||||
ts() { date -u +%Y-%m-%dT%H:%M:%SZ; }
|
ts() { date -u +%Y-%m-%dT%H:%M:%SZ; }
|
||||||
@@ -58,7 +60,7 @@ if [ "${1:-}" = "--gen-one" ]; then
|
|||||||
# --cache-backend memory : 분석 캐시를 메모리에 두어 공유 캐시 디렉토리의 bolt 잠금 충돌 방지(병렬 안전).
|
# --cache-backend memory : 분석 캐시를 메모리에 두어 공유 캐시 디렉토리의 bolt 잠금 충돌 방지(병렬 안전).
|
||||||
# --skip-db-update : DB 는 메인 모드에서 1회 워밍했으므로 읽기만.
|
# --skip-db-update : DB 는 메인 모드에서 1회 워밍했으므로 읽기만.
|
||||||
if trivy image --quiet --cache-backend memory --skip-db-update \
|
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 ))
|
dur=$(( $(date +%s) - t0 ))
|
||||||
if [ -s "$out" ]; then line="$(printf '%s\tOK\t%s\t%s' "$img" "$dur" "$out")"
|
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
|
else rm -f "$out"; line="$(printf '%s\tERROR:empty-sbom\t%s\t' "$img" "$dur")"; fi
|
||||||
|
|||||||
Reference in New Issue
Block a user