ci: complete Drone pipeline referencing mediabot (frontend build, docker build, harbor push, deploy)
This commit is contained in:
406
.drone.yml
406
.drone.yml
@@ -1,96 +1,350 @@
|
|||||||
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
type: docker
|
type: docker
|
||||||
name: build
|
name: par-build
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: maven-package
|
|
||||||
image: maven:3-eclipse-temurin-21-alpine
|
|
||||||
volumes:
|
|
||||||
- name: maven-cache
|
|
||||||
path: /root/.m2
|
|
||||||
commands:
|
|
||||||
- mvn clean package -DskipTests -B
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- name: maven-cache
|
- name: maven-cache
|
||||||
host:
|
host:
|
||||||
path: /tmp/drone/cache/maven
|
path: /tmp/drone-maven-cache
|
||||||
|
- name: npm-cache
|
||||||
|
host:
|
||||||
|
path: /tmp/drone-npm-cache
|
||||||
|
- name: dockersock
|
||||||
|
host:
|
||||||
|
path: /var/run/docker.sock
|
||||||
|
|
||||||
trigger:
|
trigger:
|
||||||
branch:
|
event: [push]
|
||||||
- dev
|
branch: [dev, test, main]
|
||||||
- test
|
exclude:
|
||||||
- main
|
commit:
|
||||||
event:
|
- ^\[skip ci\]
|
||||||
- push
|
- ^\[ci skip\]
|
||||||
|
|
||||||
---
|
platform:
|
||||||
|
os: linux
|
||||||
|
arch: amd64
|
||||||
|
|
||||||
kind: pipeline
|
workspace:
|
||||||
type: docker
|
path: /drone/src
|
||||||
name: docker-build-test
|
|
||||||
|
|
||||||
depends_on:
|
environment:
|
||||||
- build
|
# 仓库配置
|
||||||
|
LOCAL_HARBOR_REG: "192.168.31.253"
|
||||||
|
LOCAL_HARBOR_PROJ: "yescent"
|
||||||
|
|
||||||
|
# 镜像/容器通用
|
||||||
|
IMAGE_NAME: "${DRONE_REPO_NAME}"
|
||||||
|
CONTAINER_NAME: "par-server"
|
||||||
|
|
||||||
|
# 部署配置
|
||||||
|
SERVER_PORT: "8080"
|
||||||
|
APP_PORT: "9012"
|
||||||
|
TZ: "Asia/Shanghai"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: docker-build-and-push-test
|
# ===================== 调试信息 =====================
|
||||||
image: plugins/docker
|
- name: print-drone-vars
|
||||||
settings:
|
image: 192.168.31.253/library/alpine:latest
|
||||||
registry: 192.168.31.253
|
commands:
|
||||||
repo: 192.168.31.253/yescent/par
|
- echo "===== ALL DRONE ENV VARIABLES ====="
|
||||||
tags: test
|
- env | grep -i drone | sort
|
||||||
dockerfile: par-api/Dockerfile
|
|
||||||
username:
|
|
||||||
from_secret: harbor_username
|
|
||||||
password:
|
|
||||||
from_secret: harbor_password
|
|
||||||
|
|
||||||
trigger:
|
# ===================== 准备 Maven 缓存 =====================
|
||||||
branch:
|
- name: prepare-cache
|
||||||
- test
|
image: 192.168.31.253/library/maven-java21:3.9.9-alpine
|
||||||
event:
|
volumes:
|
||||||
- push
|
- name: maven-cache
|
||||||
|
path: /host-cache
|
||||||
|
commands:
|
||||||
|
- |
|
||||||
|
echo "正在准备Maven缓存目录..."
|
||||||
|
mkdir -p /host-cache/repository
|
||||||
|
if [ "$(ls -A /host-cache/repository 2>/dev/null)" ]; then
|
||||||
|
CACHE_SIZE=$(du -sh /host-cache/repository | cut -f1)
|
||||||
|
echo "检测到现有缓存,大小: $CACHE_SIZE"
|
||||||
|
echo "CACHE_EXISTS=true" > /drone/src/.cache_info
|
||||||
|
else
|
||||||
|
echo "未发现现有缓存,将初始化新缓存。"
|
||||||
|
echo "CACHE_EXISTS=false" > /drone/src/.cache_info
|
||||||
|
fi
|
||||||
|
|
||||||
---
|
# ===================== 前端构建(npm) =====================
|
||||||
|
- name: frontend-build
|
||||||
|
image: 192.168.31.253/library/node:22-alpine
|
||||||
|
volumes:
|
||||||
|
- name: npm-cache
|
||||||
|
path: /root/.npm
|
||||||
|
commands:
|
||||||
|
- |
|
||||||
|
echo "====== 开始前端构建 ======"
|
||||||
|
cd web
|
||||||
|
npm ci --prefer-offline --ignore-scripts 2>/dev/null || npm install --prefer-offline --ignore-scripts
|
||||||
|
# 确保 rollup 原生绑定可用
|
||||||
|
if [ -f node_modules/@rollup/rollup-linux-x64-musl/package.json ]; then
|
||||||
|
node -e "require('@rollup/rollup-linux-x64-musl/package.json')" 2>/dev/null || npm install @rollup/rollup-linux-x64-musl --ignore-scripts --force
|
||||||
|
fi
|
||||||
|
npm run build
|
||||||
|
echo "前端构建完成,产物列表:"
|
||||||
|
ls -la dist/
|
||||||
|
echo "====== 前端构建结束 ======"
|
||||||
|
|
||||||
kind: pipeline
|
# ===================== Maven 构建(含前端静态资源) =====================
|
||||||
type: docker
|
- name: maven-build
|
||||||
name: docker-build-and-deploy
|
image: 192.168.31.253/library/maven-java21:3.9.9-alpine
|
||||||
|
pull: if-not-exists
|
||||||
|
environment:
|
||||||
|
MAVEN_OPTS: "-Dmaven.repo.local=/root/.m2/repository -Xms256m -Xmx512m"
|
||||||
|
volumes:
|
||||||
|
- name: maven-cache
|
||||||
|
path: /root/.m2
|
||||||
|
commands:
|
||||||
|
- |
|
||||||
|
set -e
|
||||||
|
echo "====== 开始 Maven 构建 ======"
|
||||||
|
|
||||||
depends_on:
|
# 将前端构建产物复制到 static 目录
|
||||||
- build
|
FRONTEND_DIST="/drone/src/web/dist"
|
||||||
|
STATIC_DIR="/drone/src/par-api/src/main/resources/static"
|
||||||
|
if [ -d "$FRONTEND_DIST" ]; then
|
||||||
|
mkdir -p "$STATIC_DIR"
|
||||||
|
cp -r "$FRONTEND_DIST"/* "$STATIC_DIR"/
|
||||||
|
echo "前端产物已复制到 $STATIC_DIR"
|
||||||
|
ls -la "$STATIC_DIR"
|
||||||
|
else
|
||||||
|
echo "警告:未找到前端构建产物 $FRONTEND_DIST,将仅构建后端"
|
||||||
|
fi
|
||||||
|
|
||||||
steps:
|
# 生成版本标签
|
||||||
- name: docker-build-and-push
|
RELEASE_VERSION="v1.0.0"
|
||||||
image: plugins/docker
|
BUILD_VERSION="v1.0.0.${DRONE_BUILD_NUMBER}"
|
||||||
settings:
|
echo "RELEASE_VERSION=$RELEASE_VERSION" > /drone/src/.version.env
|
||||||
registry: 192.168.31.253
|
echo "BUILD_VERSION=$BUILD_VERSION" >> /drone/src/.version.env
|
||||||
repo: 192.168.31.253/yescent/par
|
echo "BUILD_DATE=$(TZ=Asia/Shanghai date +%Y%m%d)" >> /drone/src/.version.env
|
||||||
tags: latest
|
echo "发布版本: $RELEASE_VERSION, 构建版本: $BUILD_VERSION"
|
||||||
dockerfile: par-api/Dockerfile
|
|
||||||
username:
|
|
||||||
from_secret: harbor_username
|
|
||||||
password:
|
|
||||||
from_secret: harbor_password
|
|
||||||
|
|
||||||
- name: deploy
|
# Maven 打包
|
||||||
image: appleboy/drone-ssh
|
mvn -B clean package \
|
||||||
settings:
|
-DskipTests \
|
||||||
host: 192.168.31.252
|
-T 1C \
|
||||||
username:
|
--no-transfer-progress
|
||||||
from_secret: ssh_username
|
|
||||||
password:
|
|
||||||
from_secret: ssh_password
|
|
||||||
port: 22
|
|
||||||
script:
|
|
||||||
- cd /data/par
|
|
||||||
- ./deploy.sh
|
|
||||||
command_timeout: 2m
|
|
||||||
timeout: 2m
|
|
||||||
|
|
||||||
trigger:
|
JAR_FILE=$(ls par-api/target/*.jar | head -1)
|
||||||
branch:
|
echo "构建成功!产物: $JAR_FILE ($(du -sh $JAR_FILE | cut -f1))"
|
||||||
- main
|
depends_on:
|
||||||
event:
|
- prepare-cache
|
||||||
- push
|
- frontend-build
|
||||||
|
|
||||||
|
# ===================== Docker 镜像构建 =====================
|
||||||
|
- name: build-docker-image
|
||||||
|
image: 192.168.31.253/library/docker:cli
|
||||||
|
volumes:
|
||||||
|
- name: dockersock
|
||||||
|
path: /var/run/docker.sock
|
||||||
|
commands:
|
||||||
|
- |
|
||||||
|
echo "====== 开始构建 Docker 镜像 ======"
|
||||||
|
source /drone/src/.version.env
|
||||||
|
# main 分支用干净版本号,test 带 pipeline 号
|
||||||
|
if [ "$DRONE_BRANCH" = "main" ]; then
|
||||||
|
APP_VERSION="$RELEASE_VERSION"
|
||||||
|
else
|
||||||
|
APP_VERSION="$BUILD_VERSION"
|
||||||
|
fi
|
||||||
|
echo "版本: $APP_VERSION"
|
||||||
|
|
||||||
|
docker build \
|
||||||
|
-t "$IMAGE_NAME:$BUILD_VERSION" \
|
||||||
|
-t "$IMAGE_NAME:latest" \
|
||||||
|
--build-arg VERSION="$APP_VERSION" \
|
||||||
|
--build-arg BUILD_TIME="$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M')" \
|
||||||
|
-f par-api/Dockerfile \
|
||||||
|
.
|
||||||
|
|
||||||
|
echo "Docker 镜像构建完成。"
|
||||||
|
docker images | grep "$IMAGE_NAME"
|
||||||
|
depends_on:
|
||||||
|
- maven-build
|
||||||
|
when:
|
||||||
|
branch: [test, main]
|
||||||
|
|
||||||
|
# ===================== Test:推本地 Harbor =====================
|
||||||
|
- name: push-to-harbor
|
||||||
|
image: 192.168.31.253/library/docker:cli
|
||||||
|
network_mode: host
|
||||||
|
volumes:
|
||||||
|
- name: dockersock
|
||||||
|
path: /var/run/docker.sock
|
||||||
|
environment:
|
||||||
|
LOCAL_HARBOR_REG: "192.168.31.253"
|
||||||
|
LOCAL_HARBOR_PROJ: "yescent"
|
||||||
|
LOCAL_REGISTRY_USER:
|
||||||
|
from_secret: local_registry_user
|
||||||
|
LOCAL_REGISTRY_PASSWORD:
|
||||||
|
from_secret: local_registry_password
|
||||||
|
commands:
|
||||||
|
- |
|
||||||
|
echo "====== 推送镜像到本地 Harbor ======"
|
||||||
|
source /drone/src/.version.env
|
||||||
|
LOCAL_IMAGE_FULL="$LOCAL_HARBOR_REG/$LOCAL_HARBOR_PROJ/$IMAGE_NAME"
|
||||||
|
LOCAL_IMAGE_TAG="$LOCAL_IMAGE_FULL:$BUILD_VERSION"
|
||||||
|
LOCAL_IMAGE_LATEST="$LOCAL_IMAGE_FULL:latest"
|
||||||
|
|
||||||
|
docker tag "$IMAGE_NAME:$BUILD_VERSION" "$LOCAL_IMAGE_TAG"
|
||||||
|
docker tag "$IMAGE_NAME:latest" "$LOCAL_IMAGE_LATEST"
|
||||||
|
|
||||||
|
echo "$LOCAL_REGISTRY_PASSWORD" | docker login -u "$LOCAL_REGISTRY_USER" --password-stdin $LOCAL_HARBOR_REG
|
||||||
|
docker push "$LOCAL_IMAGE_TAG"
|
||||||
|
docker push "$LOCAL_IMAGE_LATEST"
|
||||||
|
|
||||||
|
docker rmi "$LOCAL_IMAGE_TAG" "$LOCAL_IMAGE_LATEST" || true
|
||||||
|
echo "====== Harbor 推送完成 ======"
|
||||||
|
depends_on:
|
||||||
|
- build-docker-image
|
||||||
|
when:
|
||||||
|
status: success
|
||||||
|
branch: [test]
|
||||||
|
|
||||||
|
# ===================== Test:部署到测试服务器 =====================
|
||||||
|
- name: deploy-test
|
||||||
|
image: 192.168.31.253/library/alpine-openssh:latest
|
||||||
|
environment:
|
||||||
|
DEPLOY_IMAGE: "192.168.31.253/yescent/${DRONE_REPO_NAME}"
|
||||||
|
APP_PORT: "9012"
|
||||||
|
SSH_USER:
|
||||||
|
from_secret: test_ssh_user
|
||||||
|
SSH_HOST:
|
||||||
|
from_secret: test_ssh_host
|
||||||
|
SSH_KEY:
|
||||||
|
from_secret: test_ssh_key
|
||||||
|
commands:
|
||||||
|
- |
|
||||||
|
echo "====== 部署测试环境 ======"
|
||||||
|
source /drone/src/.version.env
|
||||||
|
|
||||||
|
mkdir -p ~/.ssh
|
||||||
|
echo "$SSH_KEY" > ~/.ssh/id_rsa
|
||||||
|
chmod 600 ~/.ssh/id_rsa
|
||||||
|
|
||||||
|
export IMG="$DEPLOY_IMAGE:$BUILD_VERSION"
|
||||||
|
ssh -o StrictHostKeyChecking=no $SSH_USER@$SSH_HOST "
|
||||||
|
docker pull $IMG
|
||||||
|
docker stop par-server 2>/dev/null || true
|
||||||
|
docker rm -f par-server 2>/dev/null || true
|
||||||
|
docker run -d --name par-server --restart always \\
|
||||||
|
--env-file /data/par/db.env \\
|
||||||
|
-p \${APP_PORT:-9012}:8080 \\
|
||||||
|
-v /data/par/logs:/app/logs \\
|
||||||
|
-v /data/par/static:/app/static \\
|
||||||
|
$IMG
|
||||||
|
sleep 10
|
||||||
|
curl -s http://localhost:\${APP_PORT:-9012}/health && echo OK || echo FAIL
|
||||||
|
"
|
||||||
|
echo "====== 部署完成 ======"
|
||||||
|
depends_on:
|
||||||
|
- push-to-harbor
|
||||||
|
when:
|
||||||
|
status: success
|
||||||
|
branch: [test]
|
||||||
|
|
||||||
|
# ===================== Main:推本地 Harbor 并部署 =====================
|
||||||
|
- name: push-to-harbor-main
|
||||||
|
image: 192.168.31.253/library/docker:cli
|
||||||
|
network_mode: host
|
||||||
|
volumes:
|
||||||
|
- name: dockersock
|
||||||
|
path: /var/run/docker.sock
|
||||||
|
environment:
|
||||||
|
LOCAL_HARBOR_REG: "192.168.31.253"
|
||||||
|
LOCAL_HARBOR_PROJ: "yescent"
|
||||||
|
LOCAL_REGISTRY_USER:
|
||||||
|
from_secret: local_registry_user
|
||||||
|
LOCAL_REGISTRY_PASSWORD:
|
||||||
|
from_secret: local_registry_password
|
||||||
|
commands:
|
||||||
|
- |
|
||||||
|
echo "====== 推送镜像到本地 Harbor (main) ======"
|
||||||
|
source /drone/src/.version.env
|
||||||
|
LOCAL_IMAGE_FULL="$LOCAL_HARBOR_REG/$LOCAL_HARBOR_PROJ/$IMAGE_NAME"
|
||||||
|
LOCAL_IMAGE_TAG="$LOCAL_IMAGE_FULL:$BUILD_VERSION"
|
||||||
|
LOCAL_IMAGE_LATEST="$LOCAL_IMAGE_FULL:latest"
|
||||||
|
|
||||||
|
docker tag "$IMAGE_NAME:$BUILD_VERSION" "$LOCAL_IMAGE_TAG"
|
||||||
|
docker tag "$IMAGE_NAME:latest" "$LOCAL_IMAGE_LATEST"
|
||||||
|
|
||||||
|
echo "$LOCAL_REGISTRY_PASSWORD" | docker login -u "$LOCAL_REGISTRY_USER" --password-stdin $LOCAL_HARBOR_REG
|
||||||
|
docker push "$LOCAL_IMAGE_TAG"
|
||||||
|
docker push "$LOCAL_IMAGE_LATEST"
|
||||||
|
|
||||||
|
docker rmi "$LOCAL_IMAGE_TAG" "$LOCAL_IMAGE_LATEST" || true
|
||||||
|
echo "====== Harbor 推送完成 ======"
|
||||||
|
depends_on:
|
||||||
|
- build-docker-image
|
||||||
|
when:
|
||||||
|
status: success
|
||||||
|
branch: [main]
|
||||||
|
|
||||||
|
- name: deploy-main
|
||||||
|
image: 192.168.31.253/library/alpine-openssh:latest
|
||||||
|
environment:
|
||||||
|
DEPLOY_IMAGE: "192.168.31.253/yescent/${DRONE_REPO_NAME}"
|
||||||
|
APP_PORT: "9012"
|
||||||
|
SSH_USER:
|
||||||
|
from_secret: prod_ssh_user
|
||||||
|
SSH_HOST:
|
||||||
|
from_secret: prod_ssh_host
|
||||||
|
SSH_KEY:
|
||||||
|
from_secret: prod_ssh_key
|
||||||
|
commands:
|
||||||
|
- |
|
||||||
|
echo "====== 部署生产环境 ======"
|
||||||
|
source /drone/src/.version.env
|
||||||
|
|
||||||
|
mkdir -p ~/.ssh
|
||||||
|
echo "$SSH_KEY" > ~/.ssh/id_rsa
|
||||||
|
chmod 600 ~/.ssh/id_rsa
|
||||||
|
|
||||||
|
export IMG="$DEPLOY_IMAGE:$BUILD_VERSION"
|
||||||
|
ssh -o StrictHostKeyChecking=no $SSH_USER@$SSH_HOST "
|
||||||
|
docker pull $IMG
|
||||||
|
docker stop par-server 2>/dev/null || true
|
||||||
|
docker rm -f par-server 2>/dev/null || true
|
||||||
|
docker run -d --name par-server --restart always \\
|
||||||
|
--env-file /data/par/db.env \\
|
||||||
|
-p \${APP_PORT:-9012}:8080 \\
|
||||||
|
-v /data/par/logs:/app/logs \\
|
||||||
|
-v /data/par/static:/app/static \\
|
||||||
|
$IMG
|
||||||
|
sleep 10
|
||||||
|
curl -s http://localhost:\${APP_PORT:-9012}/health && echo OK || echo FAIL
|
||||||
|
"
|
||||||
|
echo "====== 部署完成 ======"
|
||||||
|
depends_on:
|
||||||
|
- push-to-harbor-main
|
||||||
|
when:
|
||||||
|
status: success
|
||||||
|
branch: [main]
|
||||||
|
|
||||||
|
# ===================== 构建报告 =====================
|
||||||
|
- name: cache-report
|
||||||
|
image: 192.168.31.253/library/alpine:latest
|
||||||
|
volumes:
|
||||||
|
- name: maven-cache
|
||||||
|
path: /host-cache
|
||||||
|
commands:
|
||||||
|
- |
|
||||||
|
echo "====== 构建流程结束 ======"
|
||||||
|
if [ -d "/host-cache/repository" ]; then
|
||||||
|
CACHE_SIZE=$(du -sh /host-cache/repository 2>/dev/null | cut -f1 || echo "计算失败")
|
||||||
|
echo "Maven缓存大小: $CACHE_SIZE"
|
||||||
|
fi
|
||||||
|
source /drone/src/.version.env 2>/dev/null
|
||||||
|
if [ -n "$BUILD_VERSION" ]; then
|
||||||
|
echo "构建版本: $BUILD_VERSION"
|
||||||
|
fi
|
||||||
|
echo "=============================="
|
||||||
|
when:
|
||||||
|
status: [success, failure]
|
||||||
|
depends_on:
|
||||||
|
- maven-build
|
||||||
|
|||||||
Reference in New Issue
Block a user