#!/usr/bin/env sh # go-mod-upgrade — CVE 대응으로 강제 업그레이드할 Go 모듈 목록을 현재 모듈에 적용한다. # 빌더 스테이지에서 각 Go 프로젝트 디렉토리에 들어간 뒤 인자 없이 호출한다. # # 왜 스크립트로 빼는가 # -------------------- # 업그레이드 대상을 Dockerfile 에 직접 나열하면, 새 CVE 가 하나 나올 때마다 # ① build.env 에 _FIX_VERSION 추가 ② Dockerfile 의 ARG 선언 추가(스테이지마다) # ③ go get 목록에 추가(빌드 대상마다) ④ BUILD_ARGS 에 이름 추가 # 네 곳을 고쳐야 한다. 목록을 GO_MODULE_UPGRADES 값 하나로 받으면 **build.env 한 줄만** # 바뀌고 Dockerfile 은 그대로다 — 이 이미지는 앞으로도 CVE 조치를 반복해서 받는다. # # 목록에 있으나 이 프로젝트가 쓰지 않는 모듈은 건너뛴다 # ---------------------------------------------------- # 한 이미지 안에서 여러 Go 프로젝트(argocd·helm·kustomize·git-lfs)를 빌드하는데 각자 # 의존성이 다르다. `go get` 은 의존성 그래프에 없는 모듈도 go.mod 에 요구사항으로 # **추가**하므로(뒤이은 go mod tidy 가 지우긴 하지만) 애초에 넣지 않는 편이 의도가 분명하고, # 목록 하나를 네 프로젝트에 그대로 재사용할 수 있다. # # 형식: 공백으로 구분한 `@` 목록. # GO_MODULE_UPGRADES="golang.org/x/net@v0.56.0 google.golang.org/grpc@v1.82.1" set -eu if [ -z "${GO_MODULE_UPGRADES:-}" ]; then echo "go-mod-upgrade: GO_MODULE_UPGRADES 가 비어 있다 — 업그레이드 없이 진행" exit 0 fi targets="" for spec in $GO_MODULE_UPGRADES; do path="${spec%@*}" if [ "$path" = "$spec" ]; then echo "go-mod-upgrade: ::error:: '$spec' 에 @ 이 없다" exit 2 fi if go list -m "$path" >/dev/null 2>&1; then targets="$targets $spec" echo "go-mod-upgrade: 적용 $spec" else echo "go-mod-upgrade: 건너뜀 $path (이 프로젝트의 의존성 그래프에 없음)" fi done if [ -z "$targets" ]; then echo "go-mod-upgrade: 적용 대상 없음" exit 0 fi # shellcheck disable=SC2086 # targets 는 공백 구분 목록이라 의도적으로 분리한다 go get $targets go mod tidy