Jenkins入门教程(十):使用Jenkins构建Java/Maven项目

Java是企业应用最常用的语言之一,本文将详细介绍如何使用Jenkins构建Maven管理的Java项目,包括完整的Pipeline示例和执行过程。

配置Maven

在全局工具配置中添加Maven安装:

  • 进入系统管理 > 全局工具配置
  • 找到Maven部分,点击新增Maven
  • 名称:Maven3
  • 选择自动安装或指定MAVEN_HOME路径

完整Maven构建Pipeline

pipeline {
    agent any
    
    tools {
        maven 'Maven3'
        jdk 'JDK17'
    }
    
    environment {
        MAVEN_OPTS = '-Xmx1024m'
    }
    
    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/spring-projects/spring-petclinic.git'
            }
        }
        
        stage('Check Environment') {
            steps {
                sh '''
                    echo "=== Java Version ==="
                    java -version
                    
                    echo ""
                    echo "=== Maven Version ==="
                    mvn -version
                    
                    echo ""
                    echo "=== Environment Variables ==="
                    echo "JAVA_HOME: $JAVA_HOME"
                    echo "M2_HOME: $M2_HOME"
                    echo "MAVEN_OPTS: $MAVEN_OPTS"
                '''
            }
        }
        
        stage('Clean') {
            steps {
                sh 'mvn clean'
            }
        }
        
        stage('Compile') {
            steps {
                sh 'mvn compile'
            }
        }
        
        stage('Test') {
            steps {
                sh 'mvn test'
            }
            post {
                always {
                    junit testResults: 'target/surefire-reports/*.xml', allowEmptyResults: true
                }
            }
        }
        
        stage('Package') {
            steps {
                sh 'mvn package -DskipTests'
                
                // 显示构建产物
                sh '''
                    echo "=== Build Artifacts ==="
                    ls -lh target/*.jar
                '''
            }
        }
        
        stage('Archive') {
            steps {
                archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
            }
        }
    }
    
    post {
        success {
            echo 'Maven build completed successfully!'
        }
        failure {
            echo 'Maven build failed!'
        }
    }
}

执行结果示例

[Pipeline] stage
[Pipeline] { (Check Environment)
[Pipeline] sh
+ echo '=== Java Version ==='
=== Java Version ===
+ java -version
openjdk version "17.0.9" 2023-10-17
OpenJDK Runtime Environment (build 17.0.9+9)
OpenJDK 64-Bit Server VM (build 17.0.9+9, mixed mode, sharing)

+ echo '=== Maven Version ==='
=== Maven Version ===
+ mvn -version
Apache Maven 3.8.7 (b89d5959fcde851dcb1c8946a785a163f14e1e29)
Maven home: /var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/Maven3
Java version: 17.0.9, vendor: Eclipse Adoptium
...

[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] sh
+ mvn test
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building petclinic 3.0.0
[INFO] ------------------------------------------------------------------------
[INFO] --- maven-surefire-plugin:3.0.0:test (default-test) @ spring-petclinic ---
[INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.springframework.samples.petclinic.PetclinicIntegrationTests
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.123 s
[INFO] Running org.springframework.samples.petclinic.owner.OwnerControllerTests
[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.234 s
...
[INFO] Results:
[INFO] 
[INFO] Tests run: 42, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

[Pipeline] stage
[Pipeline] { (Package)
[Pipeline] sh
+ mvn package -DskipTests
[INFO] Building jar: /var/lib/jenkins/workspace/maven-demo/target/spring-petclinic-3.0.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

+ echo '=== Build Artifacts ==='
=== Build Artifacts ===
+ ls -lh target/*.jar
-rw-r--r-- 1 jenkins jenkins 48M Feb  8 12:30 target/spring-petclinic-3.0.0.jar

使用Docker构建Maven项目

使用Docker容器提供Maven环境,更加一致和可控:

pipeline {
    agent {
        docker {
            image 'maven:3.8-openjdk-17'
            args '-v $HOME/.m2:/root/.m2'  // 缓存依赖
        }
    }
    
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean package'
            }
        }
    }
}

配置Maven仓库

使用configFileProvider配置自定义settings.xml:

pipeline {
    agent any
    
    stages {
        stage('Build with Custom Settings') {
            steps {
                configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) {
                    sh 'mvn -s $MAVEN_SETTINGS clean deploy'
                }
            }
        }
    }
}

代码覆盖率报告

集成JaCoCo生成代码覆盖率报告:

pipeline {
    agent any
    
    stages {
        stage('Test with Coverage') {
            steps {
                sh 'mvn clean verify -Pcoverage'
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml'
                    
                    // JaCoCo覆盖率报告
                    jacoco(
                        execPattern: 'target/jacoco.exec',
                        classPattern: 'target/classes',
                        sourcePattern: 'src/main/java',
                        exclusionPattern: 'src/test*'
                    )
                }
            }
        }
    }
}

pom.xml中配置JaCoCo插件:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.10</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>verify</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

并行构建加速

使用Maven的并行构建选项加速:

# 使用4个线程并行构建
mvn -T 4 clean install

# 每个CPU核心一个线程
mvn -T 1C clean install

# 在Pipeline中
sh 'mvn -T 1C clean package -DskipTests'

发布到Nexus/Artifactory

pipeline {
    agent any
    
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean package -DskipTests'
            }
        }
        
        stage('Deploy to Nexus') {
            when {
                branch 'main'
            }
            steps {
                withCredentials([usernamePassword(
                    credentialsId: 'nexus-creds',
                    usernameVariable: 'NEXUS_USER',
                    passwordVariable: 'NEXUS_PASS'
                )]) {
                    sh '''
                        mvn deploy \
                            -DskipTests \
                            -DaltDeploymentRepository=nexus::default::https://nexus.example.com/repository/maven-releases/ \
                            -Dusername=$NEXUS_USER \
                            -Dpassword=$NEXUS_PASS
                    '''
                }
            }
        }
    }
}

常用Maven命令

# 常用Maven生命周期命令
mvn clean          # 清理target目录
mvn compile        # 编译源代码
mvn test           # 运行单元测试
mvn package        # 打包(JAR/WAR)
mvn verify         # 运行集成测试
mvn install        # 安装到本地仓库
mvn deploy         # 部署到远程仓库

# 常用选项
mvn -DskipTests    # 跳过测试
mvn -Dmaven.test.skip=true  # 跳过测试编译和执行
mvn -U             # 强制更新依赖
mvn -o             # 离线模式
mvn -X             # 调试模式

总结

本文详细介绍了使用Jenkins构建Maven项目的完整流程,包括环境配置、测试报告、代码覆盖率、并行构建等内容。

下一篇我们将学习使用Jenkins构建前端项目。

发表回复

后才能评论