a096ba5f51
PC 端卡片宽度过窄:创建卡片(createAndDeliver)请求体从未请求宽屏布局。
修复落在创建卡片的 JSON 载荷层 —— cardData.cardParamMap 的钉钉保留系统
字段 sys_full_json_obj 内传 {"config":{"autoLayout":true}}。config 为
对象类型,钉钉规定复杂类型变量必须走该保留字段;放在 cardParamMap 兄弟
节点会因变量未赋值而静默失效(宽度不变、无报错)。
- 仅影响 PC 宽屏渲染;移动端保持自适应布局不变。
- 未改动富文本组件宽度/padding,也未改动模板内静态内容。
- 流式更新(streaming)请求体不带该字段,避免中途变更布局。
新增回归守卫测试:投放体(direct/group)必须含该字段且 autoLayout=true,
流式更新体必须不含;防止退化为静默失效写法。
验证:gofmt 干净、go vet ok、go test ./... 全绿;
A/B 探针(A 带字段 / B 对照)经 PC 端人工确认 A 卡片变宽。
67 lines
2.8 KiB
Bash
67 lines
2.8 KiB
Bash
#!/usr/bin/env bash
|
|
# Test-server switch to the wide-screen (autoLayout) card image.
|
|
# Rollback tag + 0600 env backup first; refuses unless the DOBOTAI_IMAGE
|
|
# substitution is exactly 1 before and exactly 1 after. Read-only readback
|
|
# at the end. No secrets are printed.
|
|
set -euo pipefail
|
|
|
|
NEW_IMAGE="dobotai-dingtalk:local-cardfix-ba090d17"
|
|
RUNTIME_ENV="/opt/dobotai/container/runtime.env"
|
|
OLD_IMAGE="$(grep -m1 '^DOBOTAI_IMAGE=' "$RUNTIME_ENV" | cut -d= -f2-)"
|
|
ROLLBACK_TAG="dobotai-dingtalk:rollback-$(echo "$OLD_IMAGE" | sed 's/.*://')-before-card-widescreen"
|
|
STAMP="$(date +%Y%m%dT%H%M%S)"
|
|
BACKUP_DIR="/opt/dobotai/container/backups"
|
|
BACKUP="$BACKUP_DIR/runtime.env.before-card-widescreen.$STAMP"
|
|
|
|
echo "== preflight =="
|
|
docker image inspect "$NEW_IMAGE" >/dev/null
|
|
[ "$OLD_IMAGE" != "$NEW_IMAGE" ] || { echo "ABORT: runtime.env already points at $NEW_IMAGE" >&2; exit 1; }
|
|
before_count="$(grep -c '^DOBOTAI_IMAGE=' "$RUNTIME_ENV")"
|
|
[ "$before_count" = "1" ] || { echo "ABORT: $before_count DOBOTAI_IMAGE lines before edit" >&2; exit 1; }
|
|
echo "old_image=$OLD_IMAGE"
|
|
echo "new_image=$NEW_IMAGE"
|
|
echo "rollback_tag=$ROLLBACK_TAG"
|
|
|
|
echo "== tag rollback target =="
|
|
if docker image inspect "$ROLLBACK_TAG" >/dev/null 2>&1; then
|
|
echo "rollback tag already exists, keeping it (no overwrite)"
|
|
else
|
|
docker tag "$OLD_IMAGE" "$ROLLBACK_TAG"
|
|
echo "tagged $OLD_IMAGE -> $ROLLBACK_TAG"
|
|
fi
|
|
|
|
echo "== backup runtime.env =="
|
|
mkdir -p "$BACKUP_DIR"
|
|
install -m 0600 "$RUNTIME_ENV" "$BACKUP"
|
|
echo "backup=$BACKUP"
|
|
|
|
echo "== rewrite DOBOTAI_IMAGE =="
|
|
tmp="$(mktemp /opt/dobotai/container/.runtime.env.XXXXXX)"
|
|
awk -v new="$NEW_IMAGE" '/^DOBOTAI_IMAGE=/ { sub(/^DOBOTAI_IMAGE=.*/, "DOBOTAI_IMAGE=" new) } { print }' "$RUNTIME_ENV" >"$tmp"
|
|
after_count="$(grep -c "^DOBOTAI_IMAGE=$NEW_IMAGE\$" "$tmp")"
|
|
if [ "$after_count" != "1" ] || [ "$(wc -l <"$tmp")" != "$(wc -l <"$RUNTIME_ENV")" ]; then
|
|
rm -f "$tmp"
|
|
echo "ABORT: post-edit verification failed (match=$after_count)" >&2
|
|
exit 1
|
|
fi
|
|
chmod 0644 "$tmp"
|
|
mv "$tmp" "$RUNTIME_ENV"
|
|
grep -n '^DOBOTAI_IMAGE=' "$RUNTIME_ENV"
|
|
|
|
echo "== recreate container =="
|
|
cd /opt/dobotai/container
|
|
docker compose --env-file runtime.env -f compose.yaml up -d --no-deps --force-recreate dobotai-dingtalk
|
|
|
|
echo "== readback =="
|
|
sleep 3
|
|
curl -fsS http://127.0.0.1:8090/healthz; echo
|
|
docker inspect dobotai-dingtalk --format 'image={{.Config.Image}} status={{.State.Status}} started={{.State.StartedAt}}'
|
|
for lit in sys_full_json_obj autoLayout _CARD_DEBUG_TOOL_ENTRY; do
|
|
if docker exec dobotai-dingtalk grep -aqF "$lit" /proc/1/root/usr/local/bin/dobotai; then
|
|
echo "literal $lit: PRESENT"
|
|
else
|
|
echo "literal $lit: ABSENT"
|
|
fi
|
|
done
|
|
docker logs dobotai-dingtalk --since 60s 2>&1 | tail -5
|
|
echo "rollback: DOBOTAI_IMAGE=$OLD_IMAGE (+ compose up -d --no-deps --force-recreate dobotai-dingtalk)" |