-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathTaskfile.yml
More file actions
290 lines (260 loc) · 12.8 KB
/
Copy pathTaskfile.yml
File metadata and controls
290 lines (260 loc) · 12.8 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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
# Taskfile for the rpi-* crate family release.
#
# `task publish` is the one-command release: it computes the next version
# automatically (scripts/next-version.sh), then hands the whole bump -> tag ->
# push -> binaries -> channels -> crates.io -> site pipeline to
# scripts/release.sh. `task release` is the same pipeline for an explicit
# version; `task publish:crates` is the crates.io-only half.
#
# The dep-ordered publish itself is driven by release-helper.rs via plain
# `cargo publish`. Keep this file as the ergonomic entry point so the
# dependency order is encoded once and `cargo test` stays the pre-flight.
#
# Dependency order (v0.1.4+): telemetry → ai → agent → plugin-sdk →
# extensions → tools → harness → tui → cli. plugin-sdk is a zero-dep leaf
# and extensions depends on plugin-sdk + ai + agent, so both land before
# tools/harness (which are independent of them but published in family order).
#
# Usage:
# task # list targets
# task publish # 发布下一个版本:自动递增 + 跑完整流水线
# task publish RELEASE_VERSION=0.4.0
# # 指定版本发布
# task publish RELEASE_BUMP=minor
# # 递增 minor(默认 patch;也可 major / none)
# task publish -- --from push --yes
# # 续跑中断的发布,额外参数原样传给 scripts/release.sh
# task publish:crates
# # 只发 crates.io,用 Cargo.toml 里已准备好的版本
# task publish:fast RELEASE_VERSION=0.1.12
# # 只发 crates.io,跳过 test/check(仍校验发布状态)
# task dry-run RELEASE_VERSION=0.1.12
# # package all crates without uploading
# task test # cargo test --workspace --locked
#
# 版本自动递增以最高的 `vX.Y.Z` 标签为基准,但 Cargo.toml 里的 workspace 版本
# 一旦已经领先于所有标签就原样沿用 —— 说明这一版已经 bump 过、只是还没发出去。
# 所以续跑中断的发布用 `RELEASE_BUMP=none`(或直接给 RELEASE_VERSION)。
#
# Prerequisites for `task publish*`: `rustc` and `curl` on PATH, plus a one-time
# `cargo login` so ~/.cargo/credentials.toml has a publish-scoped token.
# crates.io records are permanent.
version: '3'
vars:
RPI_SERVICE_NAME: rpi
RPI_DOMAIN: rpi.laofu.online
RPI_DEPLOY_DIR: .deploy/rpi
RPI_RELEASE_HELPER:
sh: git rev-parse --git-path rpi-release-helper.exe
# 自动版本递增的默认部分(patch|minor|major|none)。CLI 传 RELEASE_BUMP 覆盖。
RELEASE_BUMP: patch
tasks:
default:
desc: List available release targets
cmds:
- task --list
dry-run:
desc: Package all rpi-* crates in release order without uploading
vars:
PREPARED_VERSION:
sh: bash scripts/next-version.sh none
VERSION: '{{.RELEASE_VERSION | default .PREPARED_VERSION}}'
cmds:
- task: release:validate
vars:
RELEASE_VERSION: '{{.VERSION}}'
- task: release:dry-run-crates
publish:
desc: 发布下一个版本 —— 自动递增版本号,然后跑完整发布流水线
vars:
AUTO_VERSION:
sh: bash scripts/next-version.sh {{.RELEASE_BUMP}}
VERSION: '{{.RELEASE_VERSION | default .AUTO_VERSION}}'
cmds:
- bash scripts/release.sh "{{.VERSION}}" {{.CLI_ARGS}}
publish:crates:
desc: 只发布 crates.io(默认用 Cargo.toml 里已准备好的版本)
vars:
PREPARED_VERSION:
sh: bash scripts/next-version.sh none
VERSION: '{{.RELEASE_VERSION | default .PREPARED_VERSION}}'
cmds:
- task: release:validate
vars:
RELEASE_VERSION: '{{.VERSION}}'
- task: test
- task: check
- task: release:publish-crates
vars:
RELEASE_VERSION: '{{.VERSION}}'
publish:fast:
desc: 只发 crates.io,跳过 test/check(仍校验发布状态)
vars:
PREPARED_VERSION:
sh: bash scripts/next-version.sh none
VERSION: '{{.RELEASE_VERSION | default .PREPARED_VERSION}}'
cmds:
- task: release:validate
vars:
RELEASE_VERSION: '{{.VERSION}}'
- task: release:publish-crates
vars:
RELEASE_VERSION: '{{.VERSION}}'
release:
desc: One-command release for an explicit version — bump, tag, wait for binaries, refresh every channel
requires:
vars: [RELEASE_VERSION]
cmds:
- bash scripts/release.sh "{{.RELEASE_VERSION}}" {{.CLI_ARGS}}
release:channels:
desc: Refresh the install-channel manifests + site data for a released version
requires:
vars: [RELEASE_VERSION]
cmds:
- bash scripts/refresh-channels.sh "{{.RELEASE_VERSION}}"
release:validate:
desc: Require a clean tree and one consistent version across the nine release crates
requires:
vars: [RELEASE_VERSION]
deps:
- release:build-helper
cmds:
- '"{{.RPI_RELEASE_HELPER}}" validate "{{.RELEASE_VERSION}}"'
release:validate-dirty:
desc: Validate the release state while the version bump is still uncommitted (pre-commit)
requires:
vars: [RELEASE_VERSION]
deps:
- release:build-helper
cmds:
- '"{{.RPI_RELEASE_HELPER}}" validate "{{.RELEASE_VERSION}}" --allow-dirty'
release:build-helper:
internal: true
cmds:
- rustc --edition=2021 release-helper.rs -o "{{.RPI_RELEASE_HELPER}}"
release:dry-run-crates:
internal: true
deps:
- release:build-helper
cmds:
- '"{{.RPI_RELEASE_HELPER}}" dry-run'
release:publish-crates:
internal: true
requires:
vars: [RELEASE_VERSION]
deps:
- release:build-helper
cmds:
- '"{{.RPI_RELEASE_HELPER}}" publish "{{.RELEASE_VERSION}}"'
docs:sync:
desc: 同步仓库文档到 pi-cli 的 embedded-docs(include_str! 快照,CI 会校验)
cmds:
- sh scripts/sync-embedded-docs.sh
test:
desc: Run the locked workspace test suite
cmds:
- cargo test --workspace --locked
check:
desc: Check all locked workspace targets
cmds:
- cargo check --workspace --all-targets --locked
metrics:
desc: 打印曝光指标基线(stars / crates.io 下载 / release 下载 / 仓库流量)
cmds:
- bash scripts/metrics.sh
demo-transcript:
desc: 重新生成 README 用的离线示例输出(demo/transcript.txt)
cmds:
- bash scripts/demo-transcript.sh
demo:
desc: 重新录制 README 用的离线确定性 GIF(需要 vhs + ttyd + ffmpeg)
cmds:
- cargo build -p minimal -p tools-example
- vhs demo/sdk.tape
rpi-pack-frontend:
desc: 打包 rpi 静态官网(tar.gz;zip 在 Linux 侧解压会因反斜杠分隔符报错)
cmds:
- >-
powershell -NoProfile -Command "New-Item -ItemType Directory -Force -Path '{{.RPI_DEPLOY_DIR}}' | Out-Null; tar -czf '{{.RPI_DEPLOY_DIR}}\frontend.tar.gz' -C website --exclude=./.rpi --exclude=./.deploy ."
- >-
echo "前端包已生成: {{.RPI_DEPLOY_DIR}}/frontend.tar.gz"
rpi-upload-frontend:
desc: 上传 rpi 静态官网到公网服务器
deps:
- rpi-pack-frontend
cmds:
- ssh root@139.196.85.175 "mkdir -p /var/www/{{.RPI_SERVICE_NAME}} /tmp/deploy"
- scp "{{.RPI_DEPLOY_DIR}}/frontend.tar.gz" root@139.196.85.175:/tmp/deploy/{{.RPI_SERVICE_NAME}}-frontend.tar.gz
- ssh root@139.196.85.175 "tar -xzf /tmp/deploy/{{.RPI_SERVICE_NAME}}-frontend.tar.gz -C /var/www/{{.RPI_SERVICE_NAME}} && rm /tmp/deploy/{{.RPI_SERVICE_NAME}}-frontend.tar.gz"
# The web root is public and Caddy does not hide dotfiles, so local state
# that ever gets packaged (.rpi holds session transcripts, .deploy holds
# build tarballs) would be served over HTTP. Remove it on every deploy
# instead of relying on the packer's excludes alone.
- ssh root@139.196.85.175 "rm -rf /var/www/{{.RPI_SERVICE_NAME}}/.rpi /var/www/{{.RPI_SERVICE_NAME}}/.deploy"
- >-
echo "前端文件已上传到 /var/www/{{.RPI_SERVICE_NAME}}/"
rpi-upload-guide:
desc: 上传 rpi 完整使用手册、扩展作者指南和调试指引
cmds:
- ssh root@139.196.85.175 "mkdir -p /var/www/{{.RPI_SERVICE_NAME}}"
- scp docs/user-guide.md root@139.196.85.175:/var/www/{{.RPI_SERVICE_NAME}}/user-guide.md
- scp docs/extension-authoring.md root@139.196.85.175:/var/www/{{.RPI_SERVICE_NAME}}/extension-authoring.md
- scp docs/rust-debugging.md root@139.196.85.175:/var/www/{{.RPI_SERVICE_NAME}}/rust-debugging.md
- >-
echo "使用手册、扩展作者指南和调试指引已上传"
rpi-caddy-upload:
desc: 上传 rpi Caddy 配置并重载
cmds:
- scp deploy/rpi.caddy root@139.196.85.175:/root/work/ai-infr/config/caddy/sites/{{.RPI_SERVICE_NAME}}.caddy
- ssh root@139.196.85.175 "docker exec app-caddy sh -c 'mkdir -p /data/caddy && chmod 755 /data/caddy'"
- ssh root@139.196.85.175 "docker exec app-caddy caddy validate --config /etc/caddy/Caddyfile && docker exec app-caddy caddy reload --config /etc/caddy/Caddyfile"
- >-
echo "Caddy 配置已生效: {{.RPI_DOMAIN}}"
rpi-caddy-mount:
desc: 将 rpi 静态目录挂载到现有 Caddy 容器
cmds:
- scp deploy/caddy-rpi.override.yml root@139.196.85.175:/root/work/ai-infr/docker-compose.rpi.override.yml
- ssh root@139.196.85.175 "cd /root/work/ai-infr && docker compose -f docker-compose.yml -f docker-compose.rpi.override.yml config >/dev/null"
- ssh root@139.196.85.175 "docker rm -f app-caddy 2>/dev/null || true"
- ssh root@139.196.85.175 "cd /root/work/ai-infr && docker compose -f docker-compose.yml -f docker-compose.rpi.override.yml up -d caddy"
- powershell -NoProfile -Command "Start-Sleep -Seconds 5"
rpi-caddy-storage-repair:
desc: 恢复 Caddy 缺失的绑定存储目录并重启容器
cmds:
- ssh root@139.196.85.175 "mkdir -p /var/lib/docker/volumes/app-caddy-data/_data /var/lib/docker/volumes/app-caddy-config/_data"
- ssh root@139.196.85.175 "docker restart app-caddy"
- powershell -NoProfile -Command "Start-Sleep -Seconds 5"
rpi-deploy:
desc: 打包、上传并发布 rpi 静态官网
cmds:
- task: rpi-upload-frontend
- task: rpi-upload-guide
- task: rpi-caddy-mount
- task: rpi-caddy-upload
- task: rpi-verify
rpi-verify:
desc: 验证 rpi 公网首页和静态 JSON
cmds:
- ssh root@139.196.85.175 "curl --fail --silent --show-error --head https://{{.RPI_DOMAIN}}/"
- ssh root@139.196.85.175 "curl --fail --silent --show-error https://{{.RPI_DOMAIN}}/data/packages.json"
- ssh root@139.196.85.175 "curl --fail --silent --show-error https://{{.RPI_DOMAIN}}/index.html | grep -F 'bigfish1913/pi-rust'"
# Fail the verify if local state is reachable, so a regression is caught here
# rather than by someone discovering a session transcript over HTTP.
- >-
ssh root@139.196.85.175 "for p in .rpi/todo.json .deploy/website.tar.gz; do code=\$(curl -s -o /dev/null -w '%{http_code}' https://{{.RPI_DOMAIN}}/\$p); if [ \"\$code\" != 404 ]; then echo \"LEAK: https://{{.RPI_DOMAIN}}/\$p returned \$code\" >&2; exit 1; fi; done; echo 'no local state exposed over HTTP'"
rpi-diagnose:
desc: 诊断 rpi 公网 HTTP 与 Caddy 状态
cmds:
- ssh root@139.196.85.175 "curl --max-time 15 --silent --show-error --head http://{{.RPI_DOMAIN}}/"
- ssh root@139.196.85.175 "docker logs app-caddy --tail 80 2>&1 | grep -i '{{.RPI_DOMAIN}}' || true"
- ssh root@139.196.85.175 "docker inspect app-caddy | head -c 5000"
- ssh root@139.196.85.175 "docker exec app-caddy sh -c 'ls -ld /data /config /etc/caddy 2>&1 || true'"
- ssh root@139.196.85.175 "docker exec app-caddy sh -c 'id; stat /data /config; test -w /config && echo config-writable || echo config-not-writable'"
- ssh root@139.196.85.175 "docker volume inspect app-caddy-data app-caddy-config || true"
- ssh root@139.196.85.175 "ls -ld /var/lib/docker/volumes/app-caddy-data/_data /var/lib/docker/volumes/app-caddy-config/_data 2>&1 || true; ls -la /var/lib/docker/volumes/app-caddy-data/_data /var/lib/docker/volumes/app-caddy-config/_data 2>&1 || true"
- ssh root@139.196.85.175 "docker info | grep -E 'Docker Root Dir|Storage Driver'; ls -ld /var/lib/docker /var/lib/docker/volumes"
- ssh root@139.196.85.175 "find /var/www/rpi -maxdepth 2 -type f -printf '%P\\n' | sort | head -80"
- ssh root@139.196.85.175 "curl --insecure --silent --show-error --head https://{{.RPI_DOMAIN}}/index.html; curl --insecure --silent --show-error https://{{.RPI_DOMAIN}}/data/packages.json"
- ssh root@139.196.85.175 "find /root/work/ai-infr -maxdepth 4 -type f \( -name 'docker-compose*.yml' -o -name 'compose*.yml' \) -print"
- ssh root@139.196.85.175 "grep -R -n 'app-caddy' /root/work/ai-infr --include='*.yml' --include='*.yaml' 2>/dev/null | head -40"
- ssh root@139.196.85.175 "sed -n '170,230p' /root/work/ai-infr/docker-compose.yml"