每次手动打包部署Java项目到深夜,你是否渴望有一双自动化之手?Jenkins+Maven就是你的救星。
在深入实战之前,我们先快速了解一下这对黄金搭档。
Jenkins 是一个用Java编写的开源自动化工具,带有用于持续集成的插件。它就像是项目管理的自动化机器人,24小时待命,随时准备处理你的构建、测试和部署任务。
Maven 则是一个项目管理和构建自动化工具,主要用于Java项目。它可以被看作是项目的专业打包工,负责管理依赖、编译代码、运行测试和打包项目。
当Jenkins和Maven结合,就能实现自动化构建、测试和部署,提高开发效率和代码质量。简单来说,Jenkins是大脑,Maven是双手,它们共同协作完成Java项目的自动化构建。
在开始构建我们的自动化流水线之前,需要先准备好以下环境:
安装Jenkins:Jenkins应已安装并运行。可以使用Docker快速安装Jenkins,下面是具体命令:
docker run
--rm
-u root
-p 8080:8080
-v jenkins-data:/var/jenkins_home
-v /var/run/docker.sock:/var/run/docker.sock
-v "$HOME":/home
jenkinsci/blueocean
安装Maven:Maven应已安装并配置好环境变量。配置JDK:确保JDK已安装并配置好环境变量。准备Git仓库:将你的Java代码存放在Git仓库中,Jenkins需要从中拉取代码。
验证环境:在浏览器访问
http://localhost:8080,如果能看到Jenkins页面,说明安装成功。首次访问需要输入初始密码,可通过以下命令查看:
docker exec <container-id> cat /var/jenkins_home/secrets/initialAdminPassword
Jenkins的强大功能很大程度上依赖于插件。对于Java Maven项目,我们需要安装和配置一些必要的插件和工具。
首先,确保Jenkins中安装了Maven插件。
打开Jenkins主页,点击"Manage Jenkins"。选择"Manage Plugins"。在"Available"选项卡中搜索"Maven Integration"插件并安装。如果已经安装,确保插件是最新版本。接下来,在Jenkins中配置Maven。
返回"Manage Jenkins"页面,选择"Global Tool Configuration"。找到"Maven"部分,点击"Add Maven"。设置Maven的名字(如"Maven 3.6")并选择"Maven installations"中的"Install automatically"。选择Maven版本,或者手动配置Maven的路径。确保Jenkins中配置了JDK。
在"Global Tool Configuration"页面,找到"JDK"部分。点击"Add JDK",设置JDK的名字(如"JDK 1.8")。配置JDK的路径,或者选择自动安装。完成这些配置后,你的Jenkins就已经具备了构建Java Maven项目的基本能力。点击保存,我们进入最精彩的部分——创建和配置Maven项目。
这里是教程的核心部分,我们将一步步创建一个Maven项目并配置自动化构建。
例如,配置一个Git仓库:
Repository URL:
https://github.com/yourusername/your-repo.gitCredentials: 添加你的GitHub用户名和密码或SSH密钥
设置构建触发条件,例如定时构建或SCM轮询。
在"Build Triggers"部分,选择合适的触发器。如果选择SCM轮询,设置轮询频率(如
/5 *表示每5分钟检查一次)。
常见的触发器选项:
GitHub hook trigger:当代码推送到GitHub时自动触发构建Poll SCM:定期检查代码库是否有变更Build periodically:按计划定期构建,无论代码是否有变更配置Maven构建步骤。
在"Build"部分,点击"Add build step",选择"Invoke top-level Maven targets"。在"Goals"字段中输入Maven目标,如
clean install。
常用的Maven目标:
clean compile:清理并编译代码
clean test:编译并运行单元测试
clean package:编译、测试并打包项目
clean install:打包并将构件安装到本地仓库
根据需要配置构建后的操作,例如邮件通知或部署。
在"Post-build Actions"部分,选择合适的操作。配置邮件通知,输入收件人地址和邮件服务器配置。例如,可以配置:
E-mail Notification:当构建失败时发送邮件通知相关人员Publish JUnit test result report:发布测试报告Archive the artifacts:存档构建产物,如JAR或WAR文件配置完成后,点击"Save"保存配置。
现在到了最激动人心的时刻——运行我们的第一个自动化构建!
返回项目主页,点击"Build Now"手动触发一次构建。可以在控制台输出中查看构建过程和结果。
点击正在进行的构建,选择"Console Output",你将看到实时构建日志:
Started by user admin
Building in workspace /var/jenkins_home/workspace/my-maven-project
No credentials specified
Cloning the remote Git repository
Cloning repository https://github.com/yourusername/your-repo.git
...
[INFO] Scanning for projects...
[INFO]
[INFO] ------------< com.example:my-java-project >-------------
[INFO] Building my-java-project 1.0-SNAPSHOT
[INFO] --------------------------------[jar]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ my-java-project ---
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ my-java-project ---
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ my-java-project ---
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ my-java-project ---
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ my-java-project ---
[INFO] Building jar: /var/jenkins_home/workspace/my-maven-project/target/my-java-project-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.567 s
[INFO] Finished at: 2023-11-20T12:00:00Z
[INFO] ------------------------------------------------------------------------
Finished: SUCCESS
当你看到"BUILD SUCCESS"时,恭喜你!你的第一个Jenkins Maven自动化构建已经成功完成。
基础构建只是开始,Jenkins还有更多强大功能可以让你的自动化流程更加智能。
Jenkins Pipeline允许你将整个构建流程定义为代码,保存在项目中名为Jenkinsfile的文件里。
这是一个简单的Jenkinsfile示例:
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git 'https://github.com/yourusername/your-repo.git'
}
}
stage('Build') {
steps {
sh 'mvn clean compile'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Package') {
steps {
sh 'mvn package'
}
}
}
post {
always {
emailext (
subject: "构建结果: ${currentBuild.fullDisplayName}",
body: "项目 ${env.JOB_NAME} 构建 ${currentBuild.result}
检查地址: ${env.BUILD_URL}",
to: "team@example.com"
)
}
}
}
使用Pipeline的好处:
构建流程与应用程序代码一起版本化支持复杂的构建流程,包括并行执行、条件判断等更直观的构建流程可视化配置JUnit测试报告可以让Jenkins收集并可视化测试结果。
在"构建后操作"中添加"Publish JUnit test result report",并指定测试报告的文件路径,例如:
**/target/surefire-reports/*.xml。
构建完成后,通常需要将产物部署到远程服务器。使用"Send build artifacts over SSH"插件可以实现这一功能。
配置步骤:
在"构建后操作"部分,点击"添加构建后操作",选择"Send build artifacts over SSH"。配置远程服务器信息: Name:远程服务器的名称Hostname:远程服务器的IP地址或主机名Username:远程服务器的用户名Password or Private Key:远程服务器的密码或私钥 配置传输设置: Source files:
target/*.jarRemove prefix:
target/Remote directory:
/path/to/remote/directory
让我们通过一个完整的示例,将前面学到的所有知识融会贯通。
my-java-project/
├── pom.xml
├── src/
│ ├── main/
│ │ └── java/
│ │ └── com/
│ │ └── example/
│ │ └── App.java
│ └── test/
│ └── java/
│ └── com/
│ └── example/
│ └── AppTest.java
└── Jenkinsfile
pipeline {
agent any
tools {
maven 'Maven 3.6'
jdk 'JDK 1.8'
}
stages {
stage('Checkout') {
steps {
git branch: 'main',
url: 'https://github.com/yourusername/my-java-project.git'
}
}
stage('Build and Test') {
steps {
sh 'mvn clean test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Package') {
steps {
sh 'mvn package -DskipTests'
}
}
stage('Deploy to Staging') {
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'staging-server',
transfers: [
sshTransfer(
sourceFiles: 'target/*.jar',
removePrefix: 'target',
remoteDirectory: '/opt/app',
execCommand: '''
cd /opt/app
./stop-server.sh
./start-server.sh
'''
)
]
)
]
)
}
}
}
post {
success {
emailext (
subject: "构建成功: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
body: "构建成功!
项目: ${env.JOB_NAME}
构建号: ${env.BUILD_NUMBER}
详情: ${env.BUILD_URL}",
to: 'dev-team@example.com'
)
}
failure {
emailext (
subject: "构建失败: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
body: "构建失败!
项目: ${env.JOB_NAME}
构建号: ${env.BUILD_NUMBER}
详情: ${env.BUILD_URL}",
to: 'dev-team@example.com'
)
}
}
}
Jenkinsfile
运行构建
保存配置后,点击"立即构建"Jenkins会自动从仓库拉取代码并按照Jenkinsfile定义的流程执行
这个示例展示了完整的CI/CD流程,包括代码拉取、编译、测试、打包和部署到 staging 环境,并在构建完成后通知团队。
在实际使用中,你可能会遇到一些常见问题,这里分享一些解决技巧。
构建失败:找不到依赖 确保Maven配置正确,能够访问所需的Maven仓库检查pom.xml中的依赖配置是否正确 内存不足错误 增加Jenkins容器的内存分配在Maven构建中添加内存参数:
export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m"
权限问题
确保Jenkins有访问Git仓库的权限检查文件系统权限,确保Jenkins可以读写工作空间
构建不稳定
检查测试用例,确保所有测试都能通过配置合适的测试失败策略
提高构建速度
使用Maven的并行构建:
mvn -T 1C clean install配置Maven镜像仓库,使用国内镜像可以显著提高下载速度使用Jenkins缓存,避免每次构建都下载所有依赖
通过本教程,你已经掌握了如何使用Jenkins和Maven自动化构建Java项目。从环境准备、插件安装、项目配置到高级的Pipeline使用,你现在应该能够:
设置Jenkins和Maven环境配置基本的Maven项目使用Pipeline作为代码定义复杂构建流程部署构建产物到远程服务器排查常见的构建问题自动化构建不仅节省时间,更重要的是提高了软件质量和开发流程的可重复性。随着项目规模扩大,这种自动化的价值会愈加明显。
现在,是时候将你手中的Java项目从繁琐的手动构建中解放出来了。选择一个简单的项目开始,配置你的第一个Jenkins任务,亲身体验自动化构建带来的便利吧!
如果你在实践过程中遇到任何问题,或者有更高级的使用技巧想要分享,欢迎在评论区交流讨论。