如何通过curl等待201响应码并保存Confluence异步任务结果至日志
实现Confluence Scroll Versions空间发布的自动化轮询流程
我来帮你搞定这个完整的自动化流程——用一段shell脚本就能把「触发发布→轮询任务→保存结果」全串起来,下面是分步说明和可直接复用的代码:
一、核心流程拆解
整个流程分三步:
- 触发发布请求,拿到任务ID
- 循环轮询任务状态,直到完成
- 任务完成后保存结果到日志
二、完整Shell脚本实现
先确保你的环境安装了jq(用来解析JSON响应,大部分Linux发行版可以用apt install jq或yum install jq安装),然后把下面的代码保存成publish_confluence_space.sh:
#!/bin/bash # 配置参数,记得替换成你的实际值 SERVER="http://your-confluence-server-url" SOURCE_SPACE_KEY="your-source-space-key" USERNAME="your-username" PASSWORD="your-password-or-api-token" LOG_FILE="confluence_publish.log" # 1. 触发发布请求,获取任务ID echo "触发Confluence空间发布请求..." RESPONSE=$(curl -v -s -w "%{http_code}" -H "Accept:application/json" -H "Content-Type:application/json" \ -X POST "${SERVER}/rest/scroll-versions/1.0/publish/${SOURCE_SPACE_KEY}/to_new/publish?os_username=${USERNAME}&os_password=${PASSWORD}" \ --data '{ "versionId":"9C8CC11601610D3E794E334A746E61SD", "targetSpaceKey":"pro60", "targetSpaceName":"Pro 60", "treeProviderName":"Pro 2017", "languageKey":"all", "copyLabels":"false", "keepAuthorsAndDates":"false", "removeAttachments":"false", "sendEmail":"false", "keepPermalinks":"false", "onlyPagesInFinalState":"false", "onlyPagesInFinalStateProcessChildren":"false", "publishHierarchy":"false" }') # 分离响应体和状态码 HTTP_CODE=$(echo "$RESPONSE" | tail -n1) RESPONSE_BODY=$(echo "$RESPONSE" | sed '$d') if [ "$HTTP_CODE" != "202" ]; then echo "发布请求失败!状态码:$HTTP_CODE,响应内容:$RESPONSE_BODY" exit 1 fi # 解析任务ID TASK_ID=$(echo "$RESPONSE_BODY" | jq -r '.taskId') echo "发布任务已触发,任务ID:$TASK_ID" # 2. 轮询任务状态 echo "开始轮询任务状态..." while true; do TASK_RESPONSE=$(curl -s -w "%{http_code}" -H "Accept:application/json" \ "${SERVER}/rest/scroll-versions/1.0/async-tasks/${TASK_ID}?os_username=${USERNAME}&os_password=${PASSWORD}") TASK_HTTP_CODE=$(echo "$TASK_RESPONSE" | tail -n1) TASK_RESPONSE_BODY=$(echo "$TASK_RESPONSE" | sed '$d') if [ "$TASK_HTTP_CODE" == "201" ]; then echo "任务完成!结果已保存到${LOG_FILE}" echo "$TASK_RESPONSE_BODY" > "${LOG_FILE}" break elif [ "$TASK_HTTP_CODE" != "202" ]; then echo "任务执行出错!状态码:$TASK_HTTP_CODE,响应内容:$TASK_RESPONSE_BODY" exit 1 fi echo "任务仍在执行中,10秒后重试..." sleep 10 done
三、关键注意事项
- 参数替换:一定要把脚本开头的
SERVER、SOURCE_SPACE_KEY等参数换成你自己的Confluence服务器信息和账号信息 - JSON格式:原来的curl命令里
--data后面的JSON没有加引号,这在shell里会报错,脚本里用单引号把整个JSON包起来解决了这个问题 - 密码安全:如果你的Confluence是新版(7.10+),建议用API Token代替明文密码,避免泄露风险
- 轮询间隔:脚本里设置的是10秒重试一次,你可以根据任务耗时调整
sleep的时间 - 日志路径:默认日志保存在当前目录的
confluence_publish.log,你可以修改LOG_FILE变量指定其他路径
四、使用方法
- 给脚本添加执行权限:
chmod +x publish_confluence_space.sh - 运行脚本:
./publish_confluence_space.sh
内容的提问来源于stack exchange,提问作者Kaps
相关产品推荐
相关产品推荐

