feat: 根據版本號格式決定是否標記 latest

- 純數字版本(如 0.1.10)→ 同時標記 latest
- 測試版本(如 0.1.10.test)→ 僅標記版本號
- 使用正則表達式 ^[0-9]+\.[0-9]+\.[0-9]+$ 判斷
This commit is contained in:
Your Name 2026-01-21 22:38:37 +08:00
parent cac29bfff1
commit 2f6c3fc0c6

View file

@ -300,11 +300,21 @@ jobs:
echo "🔨 開始 Multi-Arch Docker Build" echo "🔨 開始 Multi-Arch Docker Build"
echo "========================================" echo "========================================"
echo "映像名稱: ${{ env.DOCKER_IMAGE_REPO }}:${{ github.event.inputs.image_tag }}" echo "映像名稱: ${{ env.DOCKER_IMAGE_REPO }}:${{ github.event.inputs.image_tag }}"
echo "同時標記: ${{ env.DOCKER_IMAGE_REPO }}:latest"
# 判斷是否為正式版本(純數字+點號)
IMAGE_TAG="${{ github.event.inputs.image_tag }}"
if [[ "$IMAGE_TAG" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "✅ 正式版本,將同時標記 latest"
ADD_LATEST="true"
else
echo "⚠️ 測試版本,不標記 latest"
ADD_LATEST="false"
fi
echo "目標架構: linux/amd64, linux/arm64" echo "目標架構: linux/amd64, linux/arm64"
echo "" echo ""
tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'REMOTE_EOF' tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << REMOTE_EOF
set -e set -e
WORKDIR="${{ env.REMOTE_WORKDIR }}" WORKDIR="${{ env.REMOTE_WORKDIR }}"
@ -312,27 +322,34 @@ jobs:
IMAGE="${{ env.DOCKER_IMAGE_REPO }}:${{ github.event.inputs.image_tag }}" IMAGE="${{ env.DOCKER_IMAGE_REPO }}:${{ github.event.inputs.image_tag }}"
IMAGE_LATEST="${{ env.DOCKER_IMAGE_REPO }}:latest" IMAGE_LATEST="${{ env.DOCKER_IMAGE_REPO }}:latest"
BUILDER_NAME="multiarch-builder-${{ github.run_id }}" BUILDER_NAME="multiarch-builder-${{ github.run_id }}"
ADD_LATEST="${ADD_LATEST}"
echo "📂 進入專案目錄..." echo "📂 進入專案目錄..."
cd "${WORKDIR}/${PROJECT}" cd "\${WORKDIR}/\${PROJECT}"
pwd pwd
echo "" echo ""
echo "🔨 執行 Multi-Arch Docker buildx..." echo "🔨 執行 Multi-Arch Docker buildx..."
echo "映像標籤: ${IMAGE}" echo "映像標籤: \${IMAGE}"
echo "目標平台: linux/amd64, linux/arm64" echo "目標平台: linux/amd64, linux/arm64"
echo "" echo ""
# 確保使用正確的 builder # 確保使用正確的 builder
docker buildx use "${BUILDER_NAME}" docker buildx use "\${BUILDER_NAME}"
# Multi-arch build只建構不推送載入到本地 # 根據版本類型決定是否加入 latest tag
# 使用 --progress=plain 顯示完整 log if [ "\${ADD_LATEST}" = "true" ]; then
# 同時標記版本號和 latest echo "📌 同時標記 latest"
BUILD_TAGS="-t \${IMAGE} -t \${IMAGE_LATEST}"
else
echo "📌 僅標記版本號(測試版本)"
BUILD_TAGS="-t \${IMAGE}"
fi
# Multi-arch build只建構不推送
if ! docker buildx build \ if ! docker buildx build \
--platform linux/amd64,linux/arm64 \ --platform linux/amd64,linux/arm64 \
-t "${IMAGE}" \ \${BUILD_TAGS} \
-t "${IMAGE_LATEST}" \
--progress=plain \ --progress=plain \
. 2>&1; then . 2>&1; then
@ -376,6 +393,16 @@ jobs:
echo "📤 推送映像到 Docker Hub" echo "📤 推送映像到 Docker Hub"
echo "========================================" echo "========================================"
echo "映像: ${{ env.DOCKER_IMAGE_REPO }}:${{ github.event.inputs.image_tag }}" echo "映像: ${{ env.DOCKER_IMAGE_REPO }}:${{ github.event.inputs.image_tag }}"
# 判斷是否為正式版本(純數字+點號)
IMAGE_TAG="${{ github.event.inputs.image_tag }}"
if [[ "$IMAGE_TAG" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "✅ 正式版本,將同時推送 latest"
ADD_LATEST="true"
else
echo "⚠️ 測試版本,不推送 latest"
ADD_LATEST="false"
fi
echo "" echo ""
# 檢查 Docker Hub 登錄狀態,未登錄則重新登錄 # 檢查 Docker Hub 登錄狀態,未登錄則重新登錄
@ -390,7 +417,7 @@ jobs:
fi fi
EOF EOF
tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'REMOTE_EOF' tailscale ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << REMOTE_EOF
set -e set -e
WORKDIR="${{ env.REMOTE_WORKDIR }}" WORKDIR="${{ env.REMOTE_WORKDIR }}"
@ -398,25 +425,32 @@ jobs:
IMAGE="${{ env.DOCKER_IMAGE_REPO }}:${{ github.event.inputs.image_tag }}" IMAGE="${{ env.DOCKER_IMAGE_REPO }}:${{ github.event.inputs.image_tag }}"
IMAGE_LATEST="${{ env.DOCKER_IMAGE_REPO }}:latest" IMAGE_LATEST="${{ env.DOCKER_IMAGE_REPO }}:latest"
BUILDER_NAME="multiarch-builder-${{ github.run_id }}" BUILDER_NAME="multiarch-builder-${{ github.run_id }}"
ADD_LATEST="${ADD_LATEST}"
echo "📂 進入專案目錄..." echo "📂 進入專案目錄..."
cd "${WORKDIR}/${PROJECT}" cd "\${WORKDIR}/\${PROJECT}"
echo "" echo ""
echo "📤 執行 Docker Push..." echo "📤 執行 Docker Push..."
echo "映像標籤: ${IMAGE}" echo "映像標籤: \${IMAGE}"
echo "同時標記: ${IMAGE_LATEST}"
echo ""
# 確保使用正確的 builder # 確保使用正確的 builder
docker buildx use "${BUILDER_NAME}" docker buildx use "\${BUILDER_NAME}"
# 根據版本類型決定是否加入 latest tag
if [ "\${ADD_LATEST}" = "true" ]; then
echo "同時推送: \${IMAGE_LATEST}"
BUILD_TAGS="-t \${IMAGE} -t \${IMAGE_LATEST}"
else
echo "(測試版本,不推送 latest"
BUILD_TAGS="-t \${IMAGE}"
fi
echo ""
# 使用 buildx build --push 來推送 multi-arch 映像 # 使用 buildx build --push 來推送 multi-arch 映像
# 同時推送版本號和 latest
if ! docker buildx build \ if ! docker buildx build \
--platform linux/amd64,linux/arm64 \ --platform linux/amd64,linux/arm64 \
-t "${IMAGE}" \ \${BUILD_TAGS} \
-t "${IMAGE_LATEST}" \
--push \ --push \
--progress=plain \ --progress=plain \
. 2>&1; then . 2>&1; then
@ -438,8 +472,10 @@ jobs:
echo "✅ Docker Push 完成!" echo "✅ Docker Push 完成!"
echo "" echo ""
echo "📦 映像已推送至 Docker Hub" echo "📦 映像已推送至 Docker Hub"
echo " ${IMAGE}" echo " \${IMAGE}"
echo " ${IMAGE_LATEST}" if [ "\${ADD_LATEST}" = "true" ]; then
echo " \${IMAGE_LATEST}"
fi
echo "" echo ""
echo "🏗️ 支援的架構:" echo "🏗️ 支援的架構:"
echo " - linux/amd64" echo " - linux/amd64"
@ -548,7 +584,15 @@ jobs:
echo "" echo ""
echo "📦 映像資訊:" echo "📦 映像資訊:"
echo " - 版本標籤: ${{ env.DOCKER_IMAGE_REPO }}:${{ github.event.inputs.image_tag }}" echo " - 版本標籤: ${{ env.DOCKER_IMAGE_REPO }}:${{ github.event.inputs.image_tag }}"
echo " - Latest 標籤: ${{ env.DOCKER_IMAGE_REPO }}:latest"
# 判斷是否為正式版本
IMAGE_TAG="${{ github.event.inputs.image_tag }}"
if [[ "$IMAGE_TAG" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo " - Latest 標籤: ${{ env.DOCKER_IMAGE_REPO }}:latest ✅"
else
echo " - Latest 標籤: (測試版本,未更新)"
fi
echo " - Docker Hub: https://hub.docker.com/r/${{ env.DOCKER_IMAGE_REPO }}/tags" echo " - Docker Hub: https://hub.docker.com/r/${{ env.DOCKER_IMAGE_REPO }}/tags"
echo "" echo ""
echo "🏗️ 支援的架構:" echo "🏗️ 支援的架構:"
@ -562,7 +606,9 @@ jobs:
echo "" echo ""
echo "📝 使用方式:" echo "📝 使用方式:"
echo " docker pull ${{ env.DOCKER_IMAGE_REPO }}:${{ github.event.inputs.image_tag }}" echo " docker pull ${{ env.DOCKER_IMAGE_REPO }}:${{ github.event.inputs.image_tag }}"
if [[ "$IMAGE_TAG" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo " docker pull ${{ env.DOCKER_IMAGE_REPO }}:latest" echo " docker pull ${{ env.DOCKER_IMAGE_REPO }}:latest"
fi
echo "" echo ""
echo "========================================" echo "========================================"
echo "🎉 所有步驟已成功完成!" echo "🎉 所有步驟已成功完成!"