You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:42:52