From d20c51c9d93e0cd13c16994e14323ded9f1eb485 Mon Sep 17 00:00:00 2001 From: aipper Date: Sun, 1 Mar 2026 20:26:36 +0800 Subject: [PATCH] fix: align ACR script with cabinet interface --- build-push-acr.sh | 81 +++++++++++++++++++++++++++++++---------------- 1 file changed, 54 insertions(+), 27 deletions(-) diff --git a/build-push-acr.sh b/build-push-acr.sh index f37b093..f8704de 100755 --- a/build-push-acr.sh +++ b/build-push-acr.sh @@ -35,19 +35,23 @@ load_env_file() { usage() { cat <<'EOF' >&2 Usage: - ACR_REGISTRY=... ACR_NAMESPACE=... [ACR_USERNAME=... ACR_PASSWORD=...] bash build-push-acr.sh + bash build-push-acr.sh + # or: + ACR_PASSWORD=... ACR_USERNAME=... REPO_URL=... NAMESPACE=... REPO_NAME=... IMAGE_TAG=... bash build-push-acr.sh Required: - ACR_REGISTRY e.g. registry.cn-hangzhou.aliyuncs.com OR -registry..cr.aliyuncs.com - ACR_NAMESPACE your namespace + acr_password (positional arg #1) OR env ACR_PASSWORD Optional: ENV_FILE env file to load (default: ../deploy/.env if exists) - IMAGE_REPO default: digital-archive-frontend - IMAGE_TAG default: git sha or timestamp + ACR_USERNAME if set (recommended), script will docker login before pushing + REPO_URL registry host (ACR). Default: registry.cn-hangzhou.aliyuncs.com + NAMESPACE ACR namespace. Default: aipper + REPO_NAME repository name. Default: digital-archive-frontend + IMAGE_TAG default: YYYYMMDDHHMM PKG_MANAGER pnpm|npm (build-arg) NPM_REGISTRY custom npm registry (build-arg) - ACR_USERNAME / ACR_PASSWORD if set, script will docker login before pushing + DRY_RUN=1 print computed image ref and exit Compatibility: REPO_URL -> ACR_REGISTRY @@ -61,6 +65,13 @@ else load_env_file "$script_dir/../deploy/.env" fi +if [[ -z "${ACR_PASSWORD:-}" && -n "${1:-}" ]]; then + export ACR_PASSWORD="$1" +fi +if [[ -z "${ACR_USERNAME:-}" && -n "${2:-}" ]]; then + export ACR_USERNAME="$2" +fi + if [[ -z "${ACR_REGISTRY:-}" && -n "${REPO_URL:-}" ]]; then export ACR_REGISTRY="$REPO_URL" fi @@ -68,29 +79,36 @@ if [[ -z "${ACR_NAMESPACE:-}" && -n "${NAMESPACE:-}" ]]; then export ACR_NAMESPACE="$NAMESPACE" fi -if [[ -z "${ACR_REGISTRY:-}" || -z "${ACR_NAMESPACE:-}" ]]; then - echo "Missing required env: ACR_REGISTRY and/or ACR_NAMESPACE" >&2 +export REPO_URL="${REPO_URL:-${ACR_REGISTRY:-registry.cn-hangzhou.aliyuncs.com}}" +export NAMESPACE="${NAMESPACE:-${ACR_NAMESPACE:-aipper}}" +export REPO_NAME="${REPO_NAME:-${IMAGE_REPO:-digital-archive-frontend}}" +export IMAGE_TAG="${IMAGE_TAG:-$(date +"%Y%m%d%H%M")}" + +export ACR_REGISTRY="${ACR_REGISTRY:-$REPO_URL}" +export ACR_NAMESPACE="${ACR_NAMESPACE:-$NAMESPACE}" +export IMAGE_REPO="${IMAGE_REPO:-$REPO_NAME}" + +if [[ -z "${ACR_PASSWORD:-}" ]]; then + echo "错误:请在运行脚本时传递密码,例如:bash build-push-acr.sh your-acr-password" >&2 usage - exit 2 + exit 1 fi -image_repo="${IMAGE_REPO:-digital-archive-frontend}" -image_tag="${IMAGE_TAG:-}" - -if [[ -z "$image_tag" ]]; then - if command -v git >/dev/null 2>&1; then - image_tag="$(git -C "$script_dir" rev-parse --short HEAD 2>/dev/null || true)" - fi -fi - -if [[ -z "$image_tag" ]]; then - image_tag="$(date +%Y%m%d%H%M%S)" -fi +image_repo="$IMAGE_REPO" +image_tag="$IMAGE_TAG" image_ref="${ACR_REGISTRY}/${ACR_NAMESPACE}/${image_repo}:${image_tag}" -if [[ -n "${ACR_USERNAME:-}" && -n "${ACR_PASSWORD:-}" ]]; then +if [[ "${DRY_RUN:-}" == "1" ]]; then + echo "DRY_RUN=1" + echo "IMAGE_REF=$image_ref" + exit 0 +fi + +if [[ -n "${ACR_USERNAME:-}" ]]; then printf '%s' "$ACR_PASSWORD" | docker login "$ACR_REGISTRY" -u "$ACR_USERNAME" --password-stdin +else + echo "提示:未设置 ACR_USERNAME,将跳过 docker login(若你本机已登录则可继续 push)" >&2 fi build_args=() @@ -101,11 +119,20 @@ if [[ -n "${NPM_REGISTRY:-}" ]]; then build_args+=(--build-arg "NPM_REGISTRY=${NPM_REGISTRY}") fi -docker build \ - -f "$script_dir/Dockerfile" \ - -t "$image_ref" \ - "${build_args[@]}" \ - "$script_dir" +if docker buildx version >/dev/null 2>&1; then + docker buildx build \ + -f "$script_dir/Dockerfile" \ + -t "$image_ref" \ + --load \ + "${build_args[@]}" \ + "$script_dir" +else + docker build \ + -f "$script_dir/Dockerfile" \ + -t "$image_ref" \ + "${build_args[@]}" \ + "$script_dir" +fi docker push "$image_ref"