08_使用Jenkinsfile构建多环境Pipeline部署流程
在日常的持续集成与部署(CI/CD)流程中,使用 Jenkinsfile 来定义 Pipeline 是一种非常优雅且易于版本控制的方式。本文将带大家一步步实现在 Jenkins 中配置 Maven 环境,并编写一个支持"选择部署环境(测试/正式)"的自动化部署 Pipeline。
一、 准备工作:配置 Maven 环境
因为我们的 Pipeline 涉及对 Java 项目进行 Maven 打包,所以首先需要确保 Jenkins 环境中已经正确安装并配置了 Maven。
1. 手动安装与挂载 Maven
如果你使用的是 Docker 部署的 Jenkins,可以采用手动安装的方式。将本机中下载并解压好的 maven 文件夹,完整复制到 Jenkins 的工作目录(例如 E:\docker\jenkins2\jenkins_home)下:

2. 修改 Maven 配置文件
复制完成后,需要修改 Maven 的 conf/settings.xml 配置文件。主要是调整本地仓库的地址,请根据你运行 Jenkins 容器时指定的路径挂载关系进行相应配置:

3. 在 Jenkins 控制面板中配置 Maven
接下来,进入 Jenkins 的图形化管理界面进行关联配置。
依次点击左侧菜单栏的 Manage Jenkins (系统管理) -> Tools (全局工具配置):

找到 Maven 配置区域,设置 Maven 的名称以及 settings.xml 的具体挂载路径,如下图所示:

配置完成后,滑动到页面最底部,点击 Save (保存) 即可:

二、 编写 Jenkinsfile:实现参数化多环境部署
环境准备就绪后,我们就可以开始编写 Jenkinsfile 了。
下面提供了一个完整的 Pipeline 示例。这个脚本的最大亮点在于:支持在触发构建时,通过下拉框选择将要部署的环境(测试环境 test 或正式环境 prod),并根据选择动态切换目标服务器 IP 和 SSH 凭证。
触发构建时的效果如下:

完整 Jenkinsfile 脚本
groovy
pipeline {
agent any
// 1. 定义构建参数:在点击 "Build" 时会出现下拉框选择
parameters {
choice(
name: 'DEPLOY_ENV',
choices: ['prod', 'test'],
description: '选择部署环境:test(测试环境) / prod(正式环境)'
)
}
environment {
// 这里定义通用的变量,IP 等具体变量在下方的 Setup 阶段动态赋值
TARGET_DIR = '/root/your_project/build/' //通用部署路径
// TARGET_DIR="" 也可以像这样给个空值, 然后根据不同环境指定不同路径
}
tools {
maven 'Maven 3.9.11'
}
stages {
// 阶段 1: 初始化阶段,根据选择的参数设置对应的 IP 和 凭证
stage('Initialize Environment') {
steps {
script {
echo "当前选择的部署环境是: ${params.DEPLOY_ENV}"
if (params.DEPLOY_ENV == 'prod') {
// --- 正式环境配置 ---
env.REMOTE_HOST = '192.168.x.x' // 正式服 IP
env.SSH_CRED_ID = 'prod_ssh_secret' // 正式服的凭证ID
echo "已切换至 -> 正式环境 (Prod)"
} else if (params.DEPLOY_ENV == 'test') {
// --- 测试环境配置 ---
env.REMOTE_HOST = '192.168.y.y' // 测试服 IP
env.SSH_CRED_ID = 'test_ssh_secret' // 测试服的凭证ID
echo "已切换至 -> 测试环境 (Test)"
} else {
error("无效的部署环境: ${params.DEPLOY_ENV}")
}
}
}
}
// 阶段 2: 拉取代码
stage('Checkout Code') {
steps {
// 因为参数值现在就是真实分支名 (test/prod),可以直接用 checkout scm
checkout scm
script {
echo "已拉取分支 (用户选择环境时的参数): ${params.DEPLOY_ENV}"
}
}
}
// 阶段 3: 编译打包
stage('Maven Build') {
steps {
echo "开始编译打包..."
sh 'mvn clean package -Dmaven.test.skip=true'
}
}
// 阶段 4: 传输文件
stage('Transfer Files') {
steps {
// 使用动态设置的凭证 ID 进行 SSH 登录
sshagent(credentials: ["${env.SSH_CRED_ID}"]) {
script {
echo "向 ${env.REMOTE_HOST} 传输文件..."
// 请根据实际项目结构修改 jar 包所在的目录名
sh "scp -o StrictHostKeyChecking=no your-module/target/*.jar root@${env.REMOTE_HOST}:${env.TARGET_DIR}"
}
}
}
}
// 阶段 5: 执行部署
stage('Execute Deploy') {
steps {
sshagent(credentials: ["${env.SSH_CRED_ID}"]) {
script {
echo "正在远程执行脚本..."
sh "ssh -o StrictHostKeyChecking=no root@${env.REMOTE_HOST} 'cd ${env.TARGET_DIR} && ./build.sh'"
}
}
}
}
}
}
注意:如果没有服务器凭据,需要在此处创建:
${env.TARGET_DIR} && ./build.sh'"
}
}
}
}
}
}
注意:如果没有服务器凭据,需要在此处创建:
