128 lines
4.3 KiB
YAML
128 lines
4.3 KiB
YAML
when:
|
|
event: tag
|
|
|
|
clone:
|
|
git:
|
|
image: woodpeckerci/plugin-git
|
|
settings:
|
|
remote: http://10.10.10.128:3000/becomer/likedream.git
|
|
|
|
steps:
|
|
build-image:
|
|
image: docker
|
|
commands:
|
|
- docker build -t likedream-go:latest .
|
|
- docker tag likedream-go:latest likedream-go:${CI_COMMIT_TAG:-${CI_COMMIT_SHA:0:8}}
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock
|
|
|
|
deploy:
|
|
image: docker
|
|
commands: |
|
|
# ============================================================
|
|
# 蓝绿部署:零宕机切换 likedream-go 容器
|
|
# 判断当前代理使用的端口,另一个作为备用
|
|
# ============================================================
|
|
|
|
set -e
|
|
|
|
IMAGE_TAG="$CI_COMMIT_TAG"
|
|
if [ -z "$IMAGE_TAG" ]; then IMAGE_TAG="latest"; fi
|
|
|
|
# 确保网络存在
|
|
docker network create likedream-net 2>/dev/null || true
|
|
|
|
# 读取 1Panel 当前代理端口
|
|
CURRENT_PORT=$(docker exec 1Panel-openresty-ESmn \
|
|
grep -o 'proxy_pass http://10.10.10.128:[0-9]\+' \
|
|
/www/sites/tianshen/proxy/api.conf | grep -o '[0-9]\+$')
|
|
echo "=== 当前 1Panel 反代端口: $CURRENT_PORT ==="
|
|
|
|
if [ "$CURRENT_PORT" = "8091" ]; then
|
|
PORT_ACTIVE=8091
|
|
PORT_STANDBY=8092
|
|
elif [ "$CURRENT_PORT" = "8092" ]; then
|
|
PORT_ACTIVE=8092
|
|
PORT_STANDBY=8091
|
|
else
|
|
echo "未知当前端口 $CURRENT_PORT,默认使用 8091/8092"
|
|
PORT_ACTIVE=8091
|
|
PORT_STANDBY=8092
|
|
fi
|
|
echo " 活跃: $PORT_ACTIVE | 备用: $PORT_STANDBY"
|
|
|
|
# 清理之前可能残留的临时容器
|
|
docker rm -f likedream-go-new 2>/dev/null || true
|
|
|
|
echo "=== 蓝绿部署: 启动新容器 on :$PORT_STANDBY (image: $IMAGE_TAG) ==="
|
|
|
|
docker run -d --name likedream-go-new \
|
|
--restart unless-stopped \
|
|
--network likedream-net \
|
|
-p $PORT_STANDBY:8091 \
|
|
-v /opt/likedream-go/config.toml:/app/config.toml:ro \
|
|
likedream-go:$IMAGE_TAG
|
|
|
|
# 健康检查:等待新容器就绪
|
|
HEALTHY=false
|
|
for i in $(seq 1 15); do
|
|
if wget -q --timeout=3 -O /dev/null http://10.10.10.128:$PORT_STANDBY/health 2>/dev/null; then
|
|
HEALTHY=true
|
|
break
|
|
fi
|
|
echo " 等待新容器就绪... ($i/15)"
|
|
sleep 2
|
|
done
|
|
|
|
if [ "$HEALTHY" = false ]; then
|
|
echo "ERROR: 新容器未通过健康检查,回滚"
|
|
docker stop likedream-go-new
|
|
docker rm likedream-go-new
|
|
exit 1
|
|
fi
|
|
echo " 新容器已就绪 ✓"
|
|
|
|
# 切换 1Panel 代理到备用端口
|
|
echo "=== 切换 1Panel 反代 :$PORT_ACTIVE → :$PORT_STANDBY ==="
|
|
docker exec 1Panel-openresty-ESmn \
|
|
sed -i "s|:$PORT_ACTIVE|:$PORT_STANDBY|g" \
|
|
/www/sites/tianshen/proxy/api.conf
|
|
docker exec 1Panel-openresty-ESmn nginx -s reload
|
|
echo " Nginx 热加载完成(零中断)✓"
|
|
|
|
# 停止旧容器
|
|
echo "=== 清理旧容器 ==="
|
|
docker stop likedream-go 2>/dev/null || true
|
|
docker rm likedream-go 2>/dev/null || true
|
|
|
|
# 在活跃端口启动正式容器
|
|
echo "=== 启动正式容器 on :$PORT_ACTIVE ==="
|
|
docker run -d --name likedream-go \
|
|
--restart unless-stopped \
|
|
--network likedream-net \
|
|
-p $PORT_ACTIVE:8091 \
|
|
-v /opt/likedream-go/config.toml:/app/config.toml:ro \
|
|
likedream-go:$IMAGE_TAG
|
|
|
|
# 连接到验证码服务网络
|
|
docker network connect ocr-go_default likedream-go 2>/dev/null || true
|
|
|
|
# 切回 1Panel 代理到活跃端口
|
|
echo "=== 切回 1Panel 反代 :$PORT_STANDBY → :$PORT_ACTIVE ==="
|
|
docker exec 1Panel-openresty-ESmn \
|
|
sed -i "s|:$PORT_STANDBY|:$PORT_ACTIVE|g" \
|
|
/www/sites/tianshen/proxy/api.conf
|
|
docker exec 1Panel-openresty-ESmn nginx -s reload
|
|
echo " Nginx 热加载完成(零中断)✓"
|
|
|
|
# 清理临时容器和旧镜像
|
|
echo "=== 清理 ==="
|
|
docker rm -f likedream-go-new 2>/dev/null || true
|
|
# 保留 latest 和最近 3 个 tag 镜像
|
|
docker images likedream-go --format '{{.Tag}}' | grep -v latest | head -n -3 | while read tag; do
|
|
docker rmi likedream-go:$tag 2>/dev/null || true
|
|
done
|
|
echo "=== 部署完成 ✓ ==="
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock
|