Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Publish Tg Sign Plus Docker Image | |
| on: | |
| workflow_dispatch: # 手动触发 | |
| release: | |
| types: [published] # 新 release 发布时触发 | |
| jobs: | |
| build-and-push: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v5 | |
| - name: Get latest release tag | |
| id: get_latest_tag | |
| env: | |
| RELEASE_TAG: ${{ github.event.release.tag_name }} | |
| run: | | |
| if [ -n "$RELEASE_TAG" ]; then | |
| LATEST_TAG="$RELEASE_TAG" | |
| else | |
| LATEST_TAG=$(curl -s https://api.github.com/repos/ssfun/tg-sign-plus/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")') | |
| fi | |
| echo "Latest tag: $LATEST_TAG" | |
| echo "latest_tag=$LATEST_TAG" >> $GITHUB_OUTPUT | |
| - name: Get current Docker image version | |
| id: get_current_version | |
| run: | | |
| # 从 Docker Hub 获取当前镜像的版本号 | |
| CURRENT_TAG=$(curl -s https://hub.docker.com/v2/repositories/${{ secrets.DOCKER_USERNAME }}/tg-sign-plus/tags/ | jq -r '.results[] | select(.name != "latest") | .name' | sort -V | tail -n 1) | |
| if [ -z "$CURRENT_TAG" ]; then | |
| CURRENT_TAG="0.0.0" # 如果没有找到版本号,默认使用 0.0.0 | |
| fi | |
| echo "Current Docker image version: $CURRENT_TAG" | |
| echo "current_tag=$CURRENT_TAG" >> $GITHUB_OUTPUT | |
| - name: Compare versions | |
| id: compare_versions | |
| run: | | |
| LATEST_TAG="${{ steps.get_latest_tag.outputs.latest_tag }}" | |
| CURRENT_TAG="${{ steps.get_current_version.outputs.current_tag }}" | |
| # 去掉版本号中的 "v" 前缀 | |
| LATEST_VERSION=$(echo "$LATEST_TAG" | sed 's/^v//') | |
| CURRENT_VERSION=$(echo "$CURRENT_TAG" | sed 's/^v//') | |
| # 使用 sort -V 比较版本号 | |
| HIGHER_VERSION=$(echo -e "$LATEST_VERSION\n$CURRENT_VERSION" | sort -V | tail -n 1) | |
| if [[ "$HIGHER_VERSION" == "$LATEST_VERSION" && "$LATEST_VERSION" != "$CURRENT_VERSION" ]]; then | |
| echo "New version available, continuing..." | |
| echo "should_build=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "No new version available, stopping..." | |
| echo "should_build=false" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Set up Docker Buildx | |
| if: steps.compare_versions.outputs.should_build == 'true' | |
| uses: docker/setup-buildx-action@v2 | |
| - name: Log in to Docker Hub | |
| if: steps.compare_versions.outputs.should_build == 'true' | |
| uses: docker/login-action@v2 | |
| with: | |
| username: ${{ secrets.DOCKER_USERNAME }} | |
| password: ${{ secrets.DOCKER_PASSWORD }} | |
| - name: Build and push Docker image | |
| if: steps.compare_versions.outputs.should_build == 'true' | |
| uses: docker/build-push-action@v4 | |
| with: | |
| platforms: linux/amd64,linux/arm64 | |
| push: true | |
| build-args: | | |
| APP_VERSION=${{ steps.get_latest_tag.outputs.latest_tag }} | |
| tags: | | |
| ${{ secrets.DOCKER_USERNAME }}/tg-sign-plus:latest | |
| ${{ secrets.DOCKER_USERNAME }}/tg-sign-plus:${{ steps.get_latest_tag.outputs.latest_tag }} | |
| trigger-render-deployment: | |
| needs: | |
| - build-and-push | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| steps: | |
| - name: Trigger Render Deployment | |
| continue-on-error: true | |
| env: | |
| RENDER_DEPLOY_HOOKS: ${{ secrets.RENDER_DEPLOY_HOOKS }} | |
| run: | | |
| set -euo pipefail | |
| if [ -z "$RENDER_DEPLOY_HOOKS" ]; then | |
| echo "⚠️ RENDER_DEPLOY_HOOKS is not configured. Skipping Render deployment." | |
| exit 0 | |
| fi | |
| trigger_render_deploy() { | |
| local name="$1" | |
| local hook_url="$2" | |
| if [ -z "$hook_url" ]; then | |
| echo "⚠️ Render deployment target '$name' is missing hook URL. Skipping." | |
| return 0 | |
| fi | |
| echo "Triggering Render deployment for $name..." | |
| HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X POST "$hook_url" || echo "000") | |
| if [ "$HTTP_STATUS" -eq 200 ]; then | |
| echo "✅ Render deployment triggered successfully for $name." | |
| else | |
| echo "⚠️ Failed to trigger Render deployment for $name. HTTP Status: $HTTP_STATUS. Continuing." | |
| return 0 | |
| fi | |
| } | |
| if ! echo "$RENDER_DEPLOY_HOOKS" | jq -e 'type == "array"' >/dev/null; then | |
| echo "⚠️ RENDER_DEPLOY_HOOKS must be a JSON array. Skipping Render deployment." | |
| exit 0 | |
| fi | |
| echo "$RENDER_DEPLOY_HOOKS" | jq -c '.[]' | while IFS= read -r target; do | |
| trigger_render_deploy \ | |
| "$(echo "$target" | jq -r 'if type == "object" then (.name // "default") else "default" end')" \ | |
| "$(echo "$target" | jq -r 'if type == "object" then (.hook_url // .url // empty) else empty end')" | |
| done | |
| cleanup-runs: | |
| runs-on: ubuntu-latest | |
| needs: trigger-render-deployment # 确保在 build-and-push 任务完成后执行 | |
| permissions: | |
| actions: write # 需要 write 权限来删除运行日志 | |
| contents: read # 需要 read 权限来访问仓库信息 | |
| steps: | |
| - name: Delete old workflow runs | |
| uses: Mattraks/delete-workflow-runs@v2 | |
| with: | |
| token: ${{ secrets.GITHUB_TOKEN }} # 使用默认的 GITHUB_TOKEN | |
| repository: ${{ github.repository }} # 当前仓库 | |
| retain_days: 7 # 保留最近 7 天的运行日志 | |
| keep_minimum_runs: 6 # 至少保留 6 条运行日志 |