From b0ca0dc3a34e7e851197bb4825d5a79a55d4613d Mon Sep 17 00:00:00 2001 From: Endial Fang Date: Tue, 20 Jan 2026 11:27:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=94=9F=E6=88=90?= =?UTF-8?q?=E9=95=9C=E5=83=8F=E6=A0=87=E7=AD=BE=E5=AF=B9=E7=BA=AF=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E5=88=86=E6=94=AF=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build_push.sh | 47 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/build_push.sh b/build_push.sh index c252dd3..2bac9ab 100644 --- a/build_push.sh +++ b/build_push.sh @@ -46,23 +46,36 @@ generate_version_tags() { local clean_ver=$(echo "$ver" | sed 's/^[vV]//') - # 提取各段 + # 提取各段,使用更安全的方式 local major=$(echo "$clean_ver" | cut -d. -f1) - local minor=$(echo "$clean_ver" | cut -d. -f2) - local patch=$(echo "$clean_ver" | cut -d. -f3) + local minor="" + local patch="" + + # 检查是否包含小数点,如果有则提取minor和patch + if echo "$clean_ver" | grep -q '\.'; then + # 检查是否包含两个小数点(即有patch部分) + if echo "$clean_ver" | grep -q '\..*\.'; then + minor=$(echo "$clean_ver" | cut -d. -f2) + patch=$(echo "$clean_ver" | cut -d. -f3) + else + # 只有一个小数点,即major.minor格式 + minor=$(echo "$clean_ver" | cut -d. -f2) + fi + fi + # 开始构建标签列表 local tags="$repo:v$clean_ver,$repo:$clean_ver" - # v + # 添加major标签(如果major与clean_ver不同) if [ -n "$major" ] && [ "$major" != "$clean_ver" ]; then tags="$tags,$repo:v$major,$repo:$major" fi - # v. + # 添加major.minor标签(如果minor存在且组合不同于clean_ver) if [ -n "$minor" ]; then - local mm="$major.$minor" - if [ "$mm" != "$clean_ver" ]; then - tags="$tags,$repo:v$mm,$repo:$mm" + local major_minor="$major.$minor" + if [ "$major_minor" != "$clean_ver" ]; then + tags="$tags,$repo:v$major_minor,$repo:$major_minor" fi fi @@ -147,7 +160,10 @@ build_and_push() { echo "" echo "==> 构建 Tag 镜像: $TAGS" - docker buildx build --platform linux/amd64,linux/arm64 $build_args --progress=plain --push --provenance=false --sbom=false . + docker buildx build --platform linux/amd64,linux/arm64 $build_args --progress=plain --push --provenance=false --sbom=false . || { + echo "==> 错误: 镜像构建失败" + exit 1 + } # ===== 分支触发 ===== elif [ -n "${CI_COMMIT_BRANCH:-}" ]; then @@ -155,8 +171,8 @@ build_and_push() { # 主干分支 build_args="-t $SWR_REPO:latest" track_image "$SWR_REPO:latest" - elif is_semver_like "$CI_COMMIT_BRANCH" && echo "$CI_COMMIT_BRANCH" | grep -q '\.'; then - # 语义化分支 → 生成带 v 的多级标签; 仅当包含 '.' 时才生成多级标签(如 v1.2.3 → v1.2, v1) + elif is_semver_like "$CI_COMMIT_BRANCH"; then + # 语义化分支 → 生成带 v 的多级标签; 支持纯数字版本号(如 12, v1, 1.2 等) TAGS=$(generate_version_tags "$CI_COMMIT_BRANCH" "$SWR_REPO") IFS=',' for tag in $TAGS; do @@ -165,7 +181,7 @@ build_and_push() { done unset IFS else - # 普通分支或纯数字(如 12, feature-x)→ 单标签 + sha + # 普通分支(如 feature-x)→ 单标签 + sha local safe_branch=$(sanitize_label "$CI_COMMIT_BRANCH") build_args="-t $SWR_REPO:$safe_branch" track_image "$SWR_REPO:$safe_branch" @@ -173,7 +189,10 @@ build_and_push() { echo "" echo "==> 构建 Branch 镜像: $build_args" - docker buildx build --platform linux/amd64,linux/arm64 $build_args --progress=plain --push --provenance=false --sbom=false . + docker buildx build --platform linux/amd64,linux/arm64 $build_args --progress=plain --push --provenance=false --sbom=false . || { + echo "==> 错误: 镜像构建失败" + exit 1 + } else echo "==> 错误: 无有效构建上下文" @@ -210,4 +229,4 @@ main() { } # 执行主函数 -main +main \ No newline at end of file