diff --git a/.drone.yml b/.drone.yml index d736b15..e200b9b 100644 --- a/.drone.yml +++ b/.drone.yml @@ -9,41 +9,43 @@ steps: volumes: - name: docker-socket path: /var/run/docker.sock + environment: + # 在这里重新声明以确保优先级 + APP_NAME: node-app + CONTAINER_NAME: node-app-prod commands: - - export APP_NAME="node-app" - - export CONTAINER_NAME="node-app-prod" - - export CURRENT_TAG=$(echo ${DRONE_COMMIT_SHA} | cut -c1-8) + # 直接在命令中设置变量,避免shell解释器问题 + - CURRENT_TAG=$(echo ${DRONE_COMMIT_SHA} | cut -c1-8) + - echo "调试信息: APP_NAME=${APP_NAME}, CONTAINER_NAME=${CONTAINER_NAME}, CURRENT_TAG=${CURRENT_TAG}" + - echo "开始清理残留资源..." + + # 1. 停止并删除正在运行的旧容器 + # 使用默认值作为最后的保障 - | - # 调试输出变量值,确认变量是否正确设置 - echo "调试信息: APP_NAME=${APP_NAME}, CONTAINER_NAME=${CONTAINER_NAME}, CURRENT_TAG=${CURRENT_TAG}" - - echo "开始清理残留资源..." - - # 1. 停止并删除正在运行的旧容器 - # 增强检查:确保CONTAINER_NAME有值 - if [ -n "${CONTAINER_NAME}" ] && [ "$(docker ps -q -f name=${CONTAINER_NAME})" ]; then - echo "停止并删除运行中的容器: ${CONTAINER_NAME}" - docker stop "${CONTAINER_NAME}" || true - docker rm "${CONTAINER_NAME}" || true + SAFE_CONTAINER_NAME=${CONTAINER_NAME:-"node-app-prod-default"} + if [ "$(docker ps -q -f name=${SAFE_CONTAINER_NAME})" ]; then + echo "停止并删除运行中的容器: ${SAFE_CONTAINER_NAME}" + docker stop "${SAFE_CONTAINER_NAME}" || true + docker rm "${SAFE_CONTAINER_NAME}" || true else - echo "没有运行中的 ${CONTAINER_NAME} 容器或容器名称未设置" + echo "没有运行中的 ${SAFE_CONTAINER_NAME} 容器" fi - - # 2. 删除同前缀的旧镜像(排除当前构建标签) + + # 2. 删除同前缀的旧镜像(排除当前构建标签) + - | + SAFE_APP_NAME=${APP_NAME:-"node-app-default"} + SAFE_CURRENT_TAG=${CURRENT_TAG:-"unknown"} echo "清理旧镜像..." - if [ -n "${APP_NAME}" ] && [ -n "${CURRENT_TAG}" ]; then - docker images --filter "reference=${APP_NAME}:*" --format "{{.ID}} {{.Tag}}" | \ - while read -r image_id tag; do - if [ "$tag" != "$CURRENT_TAG" ] && [ "$tag" != "" ]; then - echo "删除旧镜像: ${APP_NAME}:${tag} (ID: ${image_id})" - docker rmi -f ${image_id} || true - fi - done - else - echo "APP_NAME或CURRENT_TAG未设置,跳过镜像清理" - fi - - # 3. 清理悬空镜像(构建失败产生的none标签镜像) + docker images --filter "reference=${SAFE_APP_NAME}:*" --format "{{.ID}} {{.Tag}}" | \ + while read -r image_id tag; do + if [ "$tag" != "$SAFE_CURRENT_TAG" ] && [ "$tag" != "" ]; then + echo "删除旧镜像: ${SAFE_APP_NAME}:${tag} (ID: ${image_id})" + docker rmi -f ${image_id} || true + fi + done + + # 3. 清理悬空镜像 + - | echo "清理悬空镜像..." dangling_images=$(docker images -f "dangling=true" -q) if [ -n "$dangling_images" ]; then @@ -52,7 +54,6 @@ steps: echo "没有悬空镜像需要清理" fi - # 第一步:准备环境并安装依赖 - name: install-dependencies image: node:18-bullseye