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 脚本
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'// 正式服 IPenv.SSH_CRED_ID='prod_ssh_secret'// 正式服的凭证IDecho"已切换至 -> 正式环境 (Prod)"}elseif(params.DEPLOY_ENV=='test'){// --- 测试环境配置 ---env.REMOTE_HOST='192.168.y.y'// 测试服 IPenv.SSH_CRED_ID='test_ssh_secret'// 测试服的凭证IDecho"已切换至 -> 测试环境 (Test)"}else{error("无效的部署环境:${params.DEPLOY_ENV}")}}}}// 阶段 2: 拉取代码stage('Checkout Code'){steps{// 因为参数值现在就是真实分支名 (test/prod),可以直接用 checkout scmcheckout 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'"}}}}}}注意:如果没有服务器凭据,需要在此处创建:
这里可以创建 Domain,Domain是 Jenkins「凭据管理(Credentials)」中的概念,不是我们平时理解的“域名 domain”。它的主要作用是:
对 Jenkins 中的 Credentials(账号、密码、SSH Key、Token 等)进行分类和匹配限制。
简单理解:
- Credential= 密钥/账号密码
- Domain= 给这些 Credential 分组,并规定它们适用于什么场景
2.创建凭证,ID是某凭证的唯一标识,如果不设置,Jenkins会随机生成,在 Jenkinsfile 中 SSH_CRED_ID 对应的就是这个凭据ID。