102 lines
2.9 KiB
YAML
102 lines
2.9 KiB
YAML
kind: pipeline
|
||
type: docker
|
||
name: nodejs-host-network-pipeline
|
||
|
||
steps:
|
||
# 步骤0:清理残留容器和镜像(优先执行)
|
||
- name: cleanup-resources
|
||
image: docker:20.10
|
||
volumes:
|
||
- name: docker-socket
|
||
path: /var/run/docker.sock
|
||
commands:
|
||
- |
|
||
echo "开始清理残留资源..."
|
||
|
||
# 1. 停止并删除正在运行的旧容器
|
||
if [ "$(docker ps -q -f name=node-app-prod)" ]; then
|
||
echo "停止并删除运行中的容器: node-app-prod"
|
||
docker stop node-app-prod || true
|
||
docker rm node-app-prod || true
|
||
else
|
||
echo "没有运行中的 node-app-prod 容器"
|
||
fi
|
||
|
||
# 2. 删除同前缀的旧镜像(排除当前构建标签)
|
||
echo "清理旧镜像..."
|
||
# 只处理有ID和标签的镜像,跳过空值
|
||
docker images --filter "reference=node-app:*" --format "{{.ID}} {{.Tag}}" | \
|
||
while read -r image_id tag; do
|
||
# 检查image_id和tag是否有效
|
||
if [ -n "$image_id" ] && [ -n "$tag" ] && [ "$tag" != "${DRONE_COMMIT_SHA:0:8}" ] && [ "$tag" != "<none>" ]; then
|
||
echo "删除旧镜像: node-app:${tag} (ID: ${image_id})"
|
||
docker rmi -f "${image_id}" || true
|
||
else
|
||
echo "跳过无效镜像: ID=${image_id}, Tag=${tag}"
|
||
fi
|
||
done
|
||
|
||
# 3. 清理悬空镜像(构建失败产生的none标签镜像)
|
||
echo "清理悬空镜像..."
|
||
dangling_images=$(docker images -f "dangling=true" -q)
|
||
if [ -n "$dangling_images" ]; then
|
||
# 确保只传递非空ID
|
||
echo "$dangling_images" | xargs -I {} docker rmi -f {} || true
|
||
else
|
||
echo "没有悬空镜像需要清理"
|
||
fi
|
||
|
||
# 第一步:准备环境并安装依赖
|
||
- name: install-dependencies
|
||
image: node:18-bullseye
|
||
commands:
|
||
- apt-get update && apt-get install -y iproute2
|
||
- ip -V
|
||
- npm install
|
||
volumes:
|
||
- name: node_modules
|
||
path: /app/node_modules
|
||
|
||
# 第三步:构建Docker镜像
|
||
- name: build-image
|
||
image: docker:20.10
|
||
volumes:
|
||
- name: docker-socket
|
||
path: /var/run/docker.sock
|
||
- name: node_modules
|
||
path: /app/node_modules
|
||
commands:
|
||
- docker build -t node-app:${DRONE_COMMIT_SHA:0:8} -f Dockerfile .
|
||
|
||
# 第四步:使用host网络运行应用
|
||
- name: run-with-host-network
|
||
image: docker:20.10
|
||
volumes:
|
||
- name: docker-socket
|
||
path: /var/run/docker.sock
|
||
commands:
|
||
- |
|
||
docker run -d \
|
||
--restart always \
|
||
--network host \
|
||
--name node-app-prod \
|
||
node-app:${DRONE_COMMIT_SHA:0:8}
|
||
when:
|
||
branch:
|
||
- main
|
||
|
||
volumes:
|
||
- name: node_modules
|
||
temp: {}
|
||
- name: docker-socket
|
||
host:
|
||
path: /var/run/docker.sock
|
||
|
||
trigger:
|
||
branch:
|
||
- main
|
||
- develop
|
||
event:
|
||
- push
|
||
- pull_request
|
||
|