Bruno测试完成后integration-tests.sh脚本中断,无法执行清理步骤
问题:Bruno测试完成后脚本中断,无法执行后续清理命令
问题现象
执行integration-tests.sh脚本时,Bruno测试完成后脚本直接退出,无法执行后续的"Cleaning..."及资源清理命令。
现有脚本内容
integration-tests.sh
#!/bin/sh set -e if [ "$1" = "build" ]; then docker build -f ../docker/cir/Dockerfile -t registry.{url}/cir2 .. docker build -f ../docker/db-restorer/Dockerfile -t registry.{url}/cir-db-restorer ../docker/db-restorer docker build -f ../tests/scripts/Dockerfile -t registry.{url}/pester.tests ../tests/scripts docker build -f ../tests/bruno/Dockerfile -t registry.{url}/cir-bruno-tests ../tests/bruno fi key=$(uuidgen) echo "" echo "Creating network..." docker network create bridge-$key echo "" echo "Starting MSSQL server..." mkdir -p /mnt/dock-temp/mssql-$key chmod 777 /mnt/dock-temp/mssql-$key mkdir -p /mnt/dock-temp/mssql-$key-backups chmod 777 /mnt/dock-temp/mssql-$key-backups docker run \ -d \ --name mssql-$key \ --hostname mssql \ --privileged \ --restart always \ --pull always \ --network bridge-$key \ -e "ACCEPT_EULA=Y" \ -e "MSSQL_SA_PASSWORD=$key" \ -e "MSSQL_COLLATION=utf8_general_ci" \ -v /mnt/dock-temp/mssql-$key:/var/opt/mssql \ -v /mnt/dock-temp/mssql-$key-backups:/var/backups \ registry.{url}/mssql # sleep 30 echo "" echo "Restoring DB backup from google drive..." docker run \ --rm \ --network bridge-$key \ -v /mnt/dock-temp/mssql-$key-backups:/var/backups \ -e "DB_CIR_BACKUP={url}" \ -e "MSSQL_PASSWORD=$key" \ registry.{url}/cir-db-restorer echo "" echo "Starting CIR2..." docker run \ -d \ --name cir2-$key \ --hostname cir2 \ --network bridge-$key \ --restart always \ -e "DATABASE__CONNECTIONSTRING=Server=mssql; Database=CIR; user id={user}; password=$key; Encrypt=False; App=CIR2" \ -e "ASPNETCORE_ENVIRONMENT=Development" \ registry.{url}/cir2 echo "" echo "Running Integration Tests..." docker run \ --rm \ --network bridge-$key \ -e "REQUEST_DELAY=0" \ -e "API_URI=http://cir2/api/v1" \ -e "DB_CON_STRING=Server=mssql; Database=CIR; user id={user}; password=$key; Encrypt=False; App=CIR_TESTS" \ registry.{url}/pester.tests echo "" echo "Running Bruno Tests..." docker run \ --rm \ --network bridge-$key \ -e "API_URI=http://cir2/api/v1" \ registry.{url}/cir-bruno-tests # <--- 脚本在此处中断退出 ---> echo "" echo "Cleaning..." docker stop cir2-$key 2>/dev/null || true docker rm cir2-$key 2>/dev/null || true docker stop mssql-$key 2>/dev/null || true docker rm mssql-$key 2>/dev/null || true sleep 5 rm -f -r /mnt/dock-temp/mssql-$key-backups rm -f -r /mnt/dock-temp/mssql-$key docker network rm bridge-$key
Bruno测试的Dockerfile
FROM alpine:latest ENV API_URI "" RUN apk add --no-cache \ nodejs npm RUN npm install -g @usebruno/cli COPY /BrunoTests/ /BrunoTests/ WORKDIR /BrunoTests CMD ["bru", "run", "--env", "Env Cir", "--output", "result.json"]
问题原因
脚本开头的set -e配置会让脚本在任何命令返回非0退出码时立即终止。而Bruno的bru run命令如果有测试失败,会返回非0退出码,触发set -e机制导致脚本直接中断,跳过后续清理步骤。
解决方案
方案1:临时关闭set -e执行Bruno测试
保留set -e的同时,临时关闭该机制执行Bruno测试,记录测试结果后再恢复:
echo "" echo "Running Bruno Tests..." # 临时关闭set -e set +e docker run \ --rm \ --network bridge-$key \ -e "API_URI=http://cir2/api/v1" \ registry.{url}/cir-bruno-tests # 记录测试退出码 BRUNO_EXIT_CODE=$? # 恢复set -e set -e # 可选:根据退出码提示测试结果 if [ $BRUNO_EXIT_CODE -ne 0 ]; then echo "Bruno测试执行失败,退出码: $BRUNO_EXIT_CODE" fi
方案2:强制Bruno测试命令返回0
在docker run命令后添加|| true,强制命令无论成功失败都返回0,避免触发set -e:
echo "" echo "Running Bruno Tests..." docker run \ --rm \ --network bridge-$key \ -e "API_URI=http://cir2/api/v1" \ registry.{url}/cir-bruno-tests || true
缺点:无法直接知晓Bruno测试是否真的成功,仅适合不需要关注测试结果的场景。
额外优化:确保清理步骤始终执行
使用trap注册退出清理函数,无论脚本正常/异常退出,都会自动执行资源清理:
在脚本set -e之后添加:
# 定义清理函数 cleanup() { echo "" echo "Cleaning..." docker stop cir2-$key 2>/dev/null || true docker rm cir2-$key 2>/dev/null || true docker stop mssql-$key 2>/dev/null || true docker rm mssql-$key 2>/dev/null || true sleep 5 rm -f -r /mnt/dock-temp/mssql-$key-backups rm -f -r /mnt/dock-temp/mssql-$key docker network rm bridge-$key } # 注册退出信号,触发时执行清理 trap cleanup EXIT
然后删除脚本末尾原有的清理代码即可。
内容的提问来源于stack exchange,提问作者Standej
相关产品推荐
相关产品推荐

