agri/Jenkinsfile_bak

146 lines
4.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

pipeline {
// 在任意可用节点执行(你是单机就只有 master/内置节点)
agent any
options {
// 单机一定要禁并发:避免同时构建/部署互相覆盖容器
disableConcurrentBuilds()
// 控制台输出带时间戳,排查问题更方便
timestamps()
}
environment {
// 运行容器的名字:固定一个,方便停旧启新
APP_NAME = "agri"
// 容器内程序监听端口 & 宿主机映射端口(这里同端口)
PORT = "8088"
// <span style="color:#d00;font-weight:700">部署目录</span>:你已经把宿主机 /opt/agri 挂载进 Jenkins 容器了
// 这里常用来放日志、当前版本号等
DEPLOY_DIR = "/opt/agri"
// 镜像仓库名(本机镜像名即可)
// 最终镜像agri-backend:${BUILD_NUMBER}
IMAGE_REPO = "agri-backend"
// 记录“当前部署的构建号”,方便你手动回滚时知道上一版是啥
CURRENT_TAG_FILE = "/opt/agri/current_tag"
// 多模块项目的“真正启动模块”
// 你这个结构里一般就是 agri-admin
BOOT_MODULE = "agri-admin"
}
stages {
stage('Checkout') {
steps {
// 从 Jenkins Job 配置的 SCM 拉代码ssh gitea
checkout scm
}
}
stage('Build Jar (JDK8, multi-module)') {
// 用 Maven+JDK8 的构建容器来编译,避免你在服务器/jenkins里安装 JDK8/Maven
// 注意:这个 stage 运行在一个临时容器里,但 workspace 是共享的
agent {
docker {
// Maven 3.9 + Temurin JDK8
image 'maven:3.9.6-eclipse-temurin-8'
// 挂载 Maven 本地仓库缓存,加速第二次构建
// $HOME 指 Jenkins 容器内的 home通常在 /var/jenkins_home
args '-v $HOME/.m2:/root/.m2'
}
}
steps {
sh '''
set -e
echo "==== Build multi-module boot module: ${BOOT_MODULE} ===="
# -pl ${BOOT_MODULE}:只构建启动模块
# -am同时构建它依赖的其它模块common/framework/system等
# -DskipTests跳过测试加速
mvn -B -DskipTests -pl ${BOOT_MODULE} -am clean package
echo "==== Pick jar from ${BOOT_MODULE}/target ===="
ls -lh ${BOOT_MODULE}/target || true
# 创建根目录 target与 Dockerfile 对齐COPY target/agri.jar
mkdir -p target
# 找一个可运行 jar排除 sources/javadoc如果有 original 也可以再排除)
jar=$(ls -1 ${BOOT_MODULE}/target/*.jar | grep -v 'sources\\|javadoc' | head -n 1)
echo "Selected jar: $jar"
# 统一命名为 target/agri.jar后续 docker build 直接 COPY
cp -f "$jar" target/agri.jar
echo "==== Final artifact ===="
ls -lh target/agri.jar
'''
}
}
stage('Build Image') {
steps {
sh '''
set -e
# 构建镜像agri-backend:${BUILD_NUMBER}
# Dockerfile 会 COPY target/agri.jar
docker build -t ${IMAGE_REPO}:${BUILD_NUMBER} .
echo "Built image: ${IMAGE_REPO}:${BUILD_NUMBER}"
'''
}
}
stage('Deploy') {
steps {
sh '''
set -e
echo "==== Deploy to ${DEPLOY_DIR} ===="
mkdir -p "${DEPLOY_DIR}"
# 1) 停旧容器(不存在也没关系)
docker rm -f ${APP_NAME} >/dev/null 2>&1 || true
# 2) 启新容器
# --restart unless-stopped机器重启后自动起来
# -p 8088:8088把宿主机 8088 映射到容器 8088
# -v /opt/agri/logs:/app/logs把日志落到宿主机 /opt/agri/logs
docker run -d \
--name ${APP_NAME} \
--restart unless-stopped \
-p ${PORT}:${PORT} \
-v ${DEPLOY_DIR}/logs:/app/logs \
${IMAGE_REPO}:${BUILD_NUMBER}
# 记录当前版本号(手动回滚时用)
echo "${BUILD_NUMBER}" > "${CURRENT_TAG_FILE}"
echo "Deployed: ${IMAGE_REPO}:${BUILD_NUMBER}"
echo "Current tag file: ${CURRENT_TAG_FILE} -> $(cat ${CURRENT_TAG_FILE})"
'''
}
}
}
post {
always {
// 每次构建结束都打印一下当前容器状态,排查更方便
sh '''
echo "==== docker ps (agri) ===="
docker ps --filter "name=^/agri$" || true
'''
}
}
}