From d15adbd8bbdc620275496598b29d467a14a9038b Mon Sep 17 00:00:00 2001 From: liwei02 Date: Wed, 10 Jun 2026 16:03:12 +0800 Subject: [PATCH] add common-trigger --- .gitea/workflows/common-trigger.yml | 115 ++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 .gitea/workflows/common-trigger.yml diff --git a/.gitea/workflows/common-trigger.yml b/.gitea/workflows/common-trigger.yml new file mode 100644 index 0000000..d8491a8 --- /dev/null +++ b/.gitea/workflows/common-trigger.yml @@ -0,0 +1,115 @@ +name: Build Any Repository Docker Image + +on: + workflow_dispatch: + inputs: + repo_url: + description: '要构建的仓库地址(如:xc-workflows/engine-demo)' + required: true + type: string + ref: + description: '分支/tag/commit' + required: true + default: 'main' + type: string + dry_run: + description: '仅构建不推送' + required: false + default: 'true' + type: choice + options: + - 'true' + - 'false' + +jobs: + build: + runs-on: amd64-ubuntu-24.04 + + steps: + - name: Clone target repository + run: | + # 构建完整的 clone URL + CLONE_URL="https://${{ gitea.server_url }}/${{ github.event.inputs.repo_url }}.git" + echo "正在克隆: $CLONE_URL" + + git clone "$CLONE_URL" target_repo + cd target_repo + git checkout "${{ github.event.inputs.ref }}" + + # 保存仓库信息供后续步骤使用 + echo "TARGET_REPO_PATH=$(pwd)" >> "$GITEA_ENV" + echo "TARGET_REPO_NAME=$(basename ${{ github.event.inputs.repo_url }})" >> "$GITEA_ENV" + + - name: Set image metadata + run: | + cd target_repo + + # 生成镜像名称(将仓库路径中的 / 替换为 -) + IMAGE_NAME="$(echo "${{ github.event.inputs.repo_url }}" | tr '[:upper:]' '[:lower:]' | tr '/' '-')" + SAFE_TAG=$(echo "${{ github.event.inputs.ref }}" | sed 's/\//-/g') + IMAGE="${DOCKER_REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:${SAFE_TAG}" + + echo "IMAGE_NAME=${IMAGE_NAME}" >> "$GITEA_ENV" + echo "IMAGE=${IMAGE}" >> "$GITEA_ENV" + echo "构建目标镜像: ${IMAGE}" + + - name: Login to Docker Registry + if: github.event.inputs.dry_run != 'true' + run: | + echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY" \ + -u "$DOCKER_USERNAME" \ + --password-stdin + + - name: Build Docker Image + run: | + cd target_repo + echo "开始构建镜像: ${IMAGE}" + docker build -t "${IMAGE}" . + echo "镜像构建完成" + + - name: Push Docker Image + if: github.event.inputs.dry_run != 'true' + run: | + for attempt in 1 2 3; do + echo "Starting docker push attempt ${attempt}/3 for ${IMAGE}" + docker push "${IMAGE}" & + PUSH_PID=$! + + while kill -0 "$PUSH_PID" 2>/dev/null; do + echo "docker push is still running at $(date -u '+%Y-%m-%dT%H:%M:%SZ')" + sleep 60 + done + + if wait "$PUSH_PID"; then + echo "docker push completed successfully" + exit 0 + fi + + echo "docker push failed on attempt ${attempt}/3" + sleep 30 + done + + echo "docker push failed after 3 attempts" + exit 1 + + - name: Dry Run Summary + if: github.event.inputs.dry_run == 'true' + run: | + echo "==========================================" + echo "✅ 仅构建模式完成(未推送)" + echo "==========================================" + echo "源仓库: ${{ github.event.inputs.repo_url }}" + echo "分支/Tag: ${{ github.event.inputs.ref }}" + echo "镜像名称: ${IMAGE}" + echo "==========================================" + + - name: Full Build Summary + if: github.event.inputs.dry_run != 'true' + run: | + echo "==========================================" + echo "✅ 完整构建完成(已推送)" + echo "==========================================" + echo "源仓库: ${{ github.event.inputs.repo_url }}" + echo "分支/Tag: ${{ github.event.inputs.ref }}" + echo "镜像名称: ${IMAGE}" + echo "=========================================="