7746570ec0
images/·scripts/build/build-hardened-image.sh·suggest-go-upgrades.py·
build-image.yml·.claude/image-authoring.md·이미지 ADR(0001·0002·0004)을 삭제했다 —
전부 별도 public 레포 security-images 로 이미 이관됐다.
카탈로그 쪽에는 "무엇을 배포 중인가"를 아는 부분만 남긴다:
- catalog/image-map/<image>.env — 옛 catalog.env 의 카탈로그 레이아웃 정보만 뗀 것
- scripts/build/check-rebuild-needed.py — 드리프트 탐지(A 파트)만 남기고 핀 판단
(B 파트: pin_changes/apply_changes/parse_module_specs)은 제거
- scripts/build/apply-published-tags.py(신규) — security-images 의 published.json
을 읽어 카탈로그 values 를 패치
- .github/workflows/{self-build-drift-check,catalog-tag-update}.yml(신규) — 각각
드리프트 스캔+트리거, 발행 태그 반영
effective_severity 를 cve-gate.py 로 옮겼다 — check-rebuild-needed.py 가 핀 도구를
거치지 않고 게이트를 직접 로드하게 하기 위한 선행 작업이다.
두 레포의 계약은 published.json 스키마 하나뿐이다 — security-images 는 이 카탈로그를
모른다(단방향 의존). 이관 배경·결합점 전체는
doc/migrations/self-build-images-to-security-images.md.
부수 수정: 자체 빌드 이미지를 참조하는 차트 values/README 의 죽은 링크(images/**,
doc/decisions/000{1,2,4}, .claude/image-authoring.md)를 security-images 레포를
가리키는 서술로 교체. deploy-test 스크립트·CUSTOM-README 의 개인 Docker Hub 계정
(docker.io/wbsong111) 을 docker.io/paasup 로 교체.
pitfalls.md 의 "스캐너 결과를 그대로 믿지 말 것" 절은 sbom-cve-gate skill 이 차트
축 설명에 실제로 참조하고 있어 남겼다 — "이미지 태그의 베이스 OS" 절만 제거했다
(다른 참조 없음, security-images 문서로 이관 완료).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
84 lines
3.8 KiB
YAML
84 lines
3.8 KiB
YAML
name: self-build-drift-check
|
|
|
|
# 배포 중인 자체 빌드 이미지(security-images 레포가 만든 것)가 새 CVE 로 규정을 벗어났는지
|
|
# 이 카탈로그가 스스로 스캔해 판정한다. "무엇이 배포 중인가"는 이 카탈로그만 안다 —
|
|
# security-images 는 자기 스스로 이 판단을 하지 않는다
|
|
# (security-images 레포 docs/image-authoring.md "재빌드는 이 레포가 스스로 트리거하지 않는다").
|
|
#
|
|
# 판정(scripts/build/check-rebuild-needed.py)이 재빌드 대상이라고 하면 security-images 의
|
|
# `build-image.yml` 을 `workflow_dispatch` 로 부른다. 그 워크플로가 실제 빌드·검증·게이트·
|
|
# push·`published.json` 갱신을 한다 — 이 워크플로는 트리거만 한다.
|
|
#
|
|
# 레지스트리 push 와 카탈로그 반영은 이 워크플로가 하지 않는다. `catalog-tag-update.yml` 이
|
|
# `published.json` 을 읽어가는 별도 경로로 반영한다.
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
schedule:
|
|
- cron: '0 2 * * 1' # 매주 월요일 02:00 UTC
|
|
|
|
env:
|
|
SECURITY_IMAGES_REPO: paasup/security-images
|
|
|
|
jobs:
|
|
drift-check:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: trivy 설치
|
|
run: |
|
|
curl -fsSL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh \
|
|
| sh -s -- -b /usr/local/bin
|
|
trivy --version | head -1
|
|
|
|
- name: 배포 중인 자체 빌드 이미지 스캔
|
|
id: scan
|
|
run: |
|
|
set -uo pipefail
|
|
mkdir -p /tmp/drift-reports
|
|
python3 scripts/build/check-rebuild-needed.py --list-refs > /tmp/refs.tsv
|
|
while IFS=$'\t' read -r img ref fname; do
|
|
[ -n "${fname:-}" ] || continue
|
|
echo "스캔: $ref"
|
|
trivy image --quiet --scanners vuln \
|
|
--severity UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL \
|
|
--format json "$ref" > "/tmp/drift-reports/$fname" \
|
|
|| { echo "::warning::$img: 스캔 실패 ($ref) — 이 이미지는 판정에서 빠진다"
|
|
rm -f "/tmp/drift-reports/$fname"; }
|
|
done < /tmp/refs.tsv
|
|
|
|
python3 scripts/build/check-rebuild-needed.py \
|
|
--reports /tmp/drift-reports \
|
|
--summary-md /tmp/drift.md \
|
|
--json-out /tmp/drift.json
|
|
cat /tmp/drift.md >> "$GITHUB_STEP_SUMMARY"
|
|
|
|
python3 - <<'PY' >> "$GITHUB_OUTPUT"
|
|
import json
|
|
rows = json.load(open("/tmp/drift.json"))
|
|
print("images=" + json.dumps([r["image"] for r in rows if r["status"] == "rebuild"]))
|
|
PY
|
|
|
|
- name: security-images 재빌드 트리거
|
|
if: steps.scan.outputs.images != '' && steps.scan.outputs.images != '[]'
|
|
env:
|
|
GH_TOKEN: ${{ secrets.SECURITY_IMAGES_DISPATCH_TOKEN }}
|
|
run: |
|
|
set -euo pipefail
|
|
[ -n "$GH_TOKEN" ] || { echo "::error::SECURITY_IMAGES_DISPATCH_TOKEN 시크릿 없음 — ${SECURITY_IMAGES_REPO} 에 workflow_dispatch 를 걸 권한이 있는 PAT 필요"; exit 1; }
|
|
python3 -c "import json,sys; print('\n'.join(json.loads(sys.argv[1])))" '${{ steps.scan.outputs.images }}' | \
|
|
while read -r img; do
|
|
[ -n "$img" ] || continue
|
|
echo "재빌드 트리거: $img"
|
|
gh workflow run self-build-image --repo "$SECURITY_IMAGES_REPO" -f "image=$img"
|
|
done
|
|
{
|
|
echo
|
|
echo "재빌드를 트리거했다: ${{ steps.scan.outputs.images }}"
|
|
echo "진행 상황: https://github.com/${SECURITY_IMAGES_REPO}/actions/workflows/self-build-image.yml"
|
|
echo
|
|
echo "게이트 PASS + push 성공 시 그 레포의 \`published.json\` 이 갱신되고,"
|
|
echo "\`catalog-tag-update.yml\` 이 다음 실행에서 카탈로그에 반영한다."
|
|
} >> "$GITHUB_STEP_SUMMARY"
|