本篇主要讲述在多人协作的开发环境下,一人一分支的使用方法。
一、添加插件
到jenkins的插件管理中心下载GitLab Plugin
和 Multibranch Scan Webhook Trigger
插件
如果搜索不到,可能是已经添加过该插件,可以在左侧菜单installed plugins中查看
二、新建任务
三、配置
按照图中的红框内填写内容
仓库地址,凭证
按图中的红框选择,最后Trigger token是自己填写的,建议使用UUD
四、编写Jenkinsfile文件
Jenkinsfile的位置放在根项目下,如果模块中有应该在Jenkins流水线配置中的脚本路径中配置
Jenkins 声明式流水线主要语法块
Jenkinsfile 是一个文本文件,定义了 Jenkins 流水线的执行逻辑。它通常与代码库一起保存在版本控制系统,Jenkins语法分为两种即声明式流水和编程式,这里使用前者
语法块 | 作用 | 示例 | 备注 |
---|---|---|---|
pipeline | 顶层定义块,整个 Jenkinsfile 的根结构 | pipeline { ... } | 所有内容必须写在 pipeline {} 中 |
agent | 指定在哪个节点(Agent)上运行流水线 | agent any agent { label 'docker' } | 支持任意节点、指定标签、自定义 Docker 环境等 |
environment | 定义环境变量,供全局或局部使用 | environment { VAR = 'value' } | 可用于凭据、配置路径等 |
options | 设置流水线的一些可选参数 | buildDiscarder(logRotator(...)) timeout(...) | 比如保留构建记录、设置超时等 |
parameters | 定义构建参数(如输入分支名) | parameters { string(name: 'BRANCH') } | 可用于动态控制构建逻辑 |
triggers | 设置触发器,如定时构建 | triggers { cron('H 2 * * 1-5') } | 支持 CRON 表达式 |
tools | 自动安装并设置构建工具 | tools { maven 'Maven 3.6.3' } | 常用于 Maven、JDK 等工具链配置 |
stages | 用于包含多个构建阶段 | stages { stage('Build') { ... } } | 是流水线的核心流程控制器 |
stage | 单个构建阶段,如构建、测试、部署 | stage('Test') { steps { ... } } | 可以嵌套条件、并发、输入等逻辑 |
steps | 构建步骤,定义实际执行的命令 | steps { sh 'npm install' } | 支持 sh 、bat 、echo 、script 等命令 |
script | 用于在声明式中运行 Groovy 脚本 | script { def x = 1; ... } | 适合复杂条件或逻辑 |
when | 条件判断块,用于控制阶段是否执行 | when { branch 'main' } | 支持多种条件,如分支、表达式、参数等 |
post | 构建后操作块 | post { success { ... } failure { ... } } | 常用于通知、清理、归档等 |
示例
pipeline {
agent any
environment {
// 设置环境变量
GIT_URL = '你的远程仓库地址'
BRANCH_NAME = '分支名'
MODEL_NAME = '模块名' //需要打包的模块名称
CREDENTIALS_ID = 'gitlab'
RUNTIME_DIR = "jar包在服务器的路径"
}
options {
// 配置构建丢弃策略,保留最近的 5 次构建,删除其他构建历史.
buildDiscarder(logRotator(numToKeepStr: '5'))
}
stages {
stage('从Git仓库拉取代码') {
steps {
// 从Git仓库检出指定分支的代码
git branch: BRANCH_NAME,
url: GIT_URL,
credentialsId: CREDENTIALS_ID
}
}
stage('安装依赖') {
steps {
script {
echo "安装项目依赖..."
if (isUnix()) {
// 增加详细日志输出,帮助调试
sh "mvn clean install -pl ${MODEL_NAME} -am -DskipTests"
// 查看目标文件夹位置
echo "当前工作区路径:${WORKSPACE}"
sh "ls -l ${WORKSPACE}" // 查看工作区文件结构
}
}
}
}
stage('启动前检查') {
steps {
script {
// 执行构建命令
if (isUnix()) {
sh "sudo pkill -15 -f java.*${MODEL_NAME}.jar || true"
// 调试输出,查看 `target` 文件夹路径
echo "检查 ${WORKSPACE}/${MODEL_NAME}/target 文件夹是否存在..."
sh """
if [ ! -d "${WORKSPACE}/${MODEL_NAME}/target" ]; then
echo "错误:${WORKSPACE}/${MODEL_NAME}/target 文件夹不存在"
exit 1
fi
echo "检查 ${WORKSPACE}/${MODEL_NAME}/target/${MODEL_NAME}.jar 文件是否存在..."
if [ ! -f "${WORKSPACE}/${MODEL_NAME}/target/${MODEL_NAME}.jar" ]; then
echo "错误:${WORKSPACE}/${MODEL_NAME}/target/${MODEL_NAME}.jar 文件不存在"
exit 1
fi
"""
sh "sudo cp ${WORKSPACE}/${MODEL_NAME}/target/${MODEL_NAME}.jar ${RUNTIME_DIR}"
}
}
}
}
stage('部署') {
steps {
script {
echo '部署到服务器...'
// 部署命令
sh "nohup sudo java -Dspring.profiles.active=test -Xms64m -Xmx128m -jar ${RUNTIME_DIR}/${MODEL_NAME}.jar --server.port=端口号 > ${RUNTIME_DIR}/${MODEL_NAME}.txt 2>&1 &"
// 新增:检查 Java 进程是否启动
echo "检查 ${MODEL_NAME}.jar 是否正在运行..."
def processCheck = sh(script: "ps aux | grep ${MODEL_NAME}.jar | grep -v grep", returnStatus: true)
if (processCheck != 0) {
echo "错误:${MODEL_NAME}.jar 进程未启动,流水线将失败!"
currentBuild.result = 'FAILURE' // 标记构建失败
error "进程未启动" // 终止流水线并标记为失败
}
// 检查 Java 进程
sh "ps aux | grep ${MODEL_NAME}.jar"
}
}
}
}
post {
always {
// 构建完成后清理工作区
cleanWs() // Workspace Cleanup 插件的功能
}
success {
echo "流水线执行成功!"
}
failure {
echo "流水线执行失败!"
}
}
}
如果以上的内容对您有帮助,希望给个免费的赞和关注,共勉!