退出码
CloudBase CLI 使用结构化退出码(Exit Codes)来表示命令执行结果,便于 CI/CD 流水线、脚本和自动化工具进行错误处理和重试决策。
为什么需要退出码?
退出码是 Unix/Linux 进程的标准机制,用于告诉调用者命令是否成功以及失败原因的分类:
1. CI/CD 流程控制
# GitHub Actions 示例
- name: Deploy function
run: tcb fn deploy app --env-id ${{ secrets.ENV_ID }}
continue-on-error: false # 非 0 退出码会中断流水线
2. Shell 脚本错误处理
#!/bin/bash
set -e # 遇到非 0 退出码立即退出
tcb fn deploy app --env-id my-env
if [ $? -eq 2 ]; then
echo "认证失败,请重新登录"
tcb login
fi
3. 条件执行和重试
# 仅当函数部署成功时,才部署静态资源
tcb fn deploy && tcb hosting deploy
# 认证失败时自动重试登录
tcb fn list || (tcb login && tcb fn list)
4. 自动化测试
# 测试脚本验证 CLI 行为
tcb fn delete non-existent-func
EXIT_CODE=$?
if [ $EXIT_CODE -eq 4 ]; then
echo "✅ 资源不存在错误码正确"
else
echo "❌ 期望退出码 4,实际 $EXIT_CODE"
exit 1
fi
退出码定义
| 退出码 | 语义 | 触发场景 | 建议处理方式 |
|---|---|---|---|
| 0 | 成功 | 命令正常执行完成 | 继续下一步 |
| 1 | 通用错误 | 未分类的错误(兜底) | 查看错误信息,手动排查 |
| 2 | 认证失败 | 未登录、Token 过期、无权限 | 执行 tcb login 重新登录 |
| 3 | 参数错误 | 缺少必填参数、格式错误、枚举值非法 | 检查命令参数,参考 --help |
| 4 | 资源不存在 | 函数名/环境 ID 无效、集合不存在等 | 确认资源名称是否正确 |
| 5 | 云 API 错误 | CloudBase API 返回错误、网络超时 | 检查网络连接,查看 --verbose 日志 |
| 6 | 本地文件错误 | cloudbaserc.json 缺失/损坏、路径不存在 | 检查配置文件和路径 |
使用场景
场景 1: 条件执行
# 仅当函数部署成功时,才部署静态资源
tcb fn deploy app && tcb hosting deploy
场景 2: 错误捕获与处理
#!/bin/bash
tcb fn deploy app --env-id my-env
EXIT_CODE=$?
case $EXIT_CODE in
0)
echo "✅ 部署成功"
;;
2)
echo "❌ 认证失败,请重新登录"
tcb login
;;
3)
echo "❌ 参数错误,请检查命令"
exit 1
;;
4)
echo "❌ 资源不存在"
exit 1
;;
5)
echo "⚠️ 云 API 错误,5 秒后重试..."
sleep 5
tcb fn deploy app --env-id my-env
;;
*)
echo "❌ 未知错误(退出码 $EXIT_CODE)"
exit 1
;;
esac
场景 3: 重试机制
#!/bin/bash
MAX_RETRIES=3
RETRY_DELAY=5
for i in $(seq 1 $MAX_RETRIES); do
tcb fn deploy app --env-id my-env
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
echo "✅ 部署成功"
exit 0
elif [ $EXIT_CODE -eq 5 ]; then
echo "⚠️ 云 API 错误,$RETRY_DELAY 秒后重试(第 $i/$MAX_RETRIES 次)"
sleep $RETRY_DELAY
else
echo "❌ 不可重试的错误(退出码 $EXIT_CODE)"
exit $EXIT_CODE
fi
done
echo "❌ 重试 $MAX_RETRIES 次后仍失败"
exit 1