-
Notifications
You must be signed in to change notification settings - Fork 15
149 lines (126 loc) · 5.54 KB
/
Copy pathdeploy.yml
File metadata and controls
149 lines (126 loc) · 5.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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 条运行日志