使用Maven构建Java应用

本教程介绍如何使用Jenkins和Maven构建简单的Java应用。

如果你使用Maven开发Java应用,但刚接触CI/CD;或者已经了解这些概念,却不知道如何用Jenkins构建应用,本教程适合你。

GitHub中的示例Java应用输出Hello world!,并附带用于确认主程序行为的单元测试。测试结果保存为JUnit XML报告。

预计时间:满足下面的准备条件后,完成教程约需20到40分钟。实际时间取决于机器速度,以及是否已经安装Docker和Docker Compose。

可以随时暂停教程,之后从上次位置继续。

确保本机已安装Git。

准备条件

需要以下环境:

  • 一台运行macOS、Linux、Windows或带Linux的Chromebook的机器,至少具备:

    • 2GB内存。

    • 2GB用于Jenkins的磁盘空间。

  • 安装以下软件:

Fork并克隆示例仓库

将示例Java应用的源码仓库Fork到自己的GitHub账户,再将Fork克隆到本地,以取得“Hello world!”应用。

  1. 确保已登录GitHub。没有账户时,可在GitHub免费注册。

  2. 将simple-java-maven-app Fork到自己的GitHub账户。需要帮助时,参阅GitHub的Fork仓库文档。

  3. 将Fork后的simple-java-maven-app克隆到本机。下面两种方式任选其一,其中<your-username>表示操作系统用户名。

    • 如果已安装GitHub Desktop:

      1. 在GitHub的Fork仓库中选择Code → Open with GitHub Desktop。

      2. 在GitHub Desktop的Clone a Repository窗口点击Clone前,按操作系统确认Local Path:

        • macOS:/Users/<your-username>/Documents/GitHub/simple-java-maven-app

        • Linux:/home/<your-username>/GitHub/simple-java-maven-app

        • Windows:C:\Users\<your-username>\Documents\GitHub\simple-java-maven-app

    • 或者使用命令行:

      1. 打开终端,使用cd进入对应目录:

        • macOS:/Users/<your-username>/Documents/GitHub/

        • Linux:/home/<your-username>/GitHub/

        • Windows:C:\Users\<your-username>\Documents\GitHub\。这里使用Git Bash窗口,不使用普通Microsoft命令提示符。

      2. 运行以下命令克隆Fork,将YOUR-GITHUB-ACCOUNT-NAME替换为自己的GitHub账户名:

        git clone https://github.com/YOUR-GITHUB-ACCOUNT-NAME/simple-java-maven-app

启动Jenkins控制器

  1. 克隆quickstart-tutorials仓库,取得为本教程定制的Jenkins部署。

  2. 克隆后进入quickstart-tutorials目录,执行:

    docker compose --profile maven up -d

    以运行本例。

  3. 容器成功运行后,可用docker compose ps确认,通过http://localhost:8080访问控制器。

如果无法在本机安装Docker Compose,原文还提供以下云端运行方案:

  • GitHub Codespaces(原文推荐):在quickstart-tutorials仓库点击Code → Codespaces → Create codespace on master。原文列出的免费额度为每月60小时;实际额度以服务条款为准。Codespace启动后自动执行设置,并显示包含操作指引的欢迎消息。

  • GitPod:通过此链接打开工作区,并关联GitHub账户。原文列出的额度为每月50小时免费使用;实际额度以服务条款为准。

使用本教程环境的用户名admin和密码admin登录。

在Jenkins中创建流水线项目

  1. 在Jenkins左上角Dashboard下选择New Item。

  2. 在Enter an item name中填写流水线项目名。

  3. 必要时向下滚动,选择Pipeline,再点击页面末尾的OK。

  4. 可选填写流水线Description。

  5. 在左侧选择Pipeline。

  6. 将Definition设为Pipeline script from SCM,指示Jenkins从源码管理系统取得流水线,即你Fork后的Git仓库。

  7. 在SCM中选择Git。

  8. 在Repositories/Repository URL填写仓库URL,可从GitHub仓库主页的绿色Code按钮取得。

  9. 点击页面末尾的Save。接下来创建Jenkinsfile,并提交到本地克隆的Git仓库。

使用Jenkinsfile创建初始流水线

现在创建流水线,让Jenkins通过Maven自动构建Java应用。

流水线保存在Jenkinsfile中,并提交到本地simple-java-maven-app仓库。

这就是“流水线即代码”的基础:将持续交付流水线视为应用的一部分,像其他代码一样版本管理和评审。更多内容见用户手册的Pipeline和使用Jenkinsfile章节。

先创建初始流水线:下载Maven Docker镜像,将其作为容器运行,并构建Java应用。加入Build阶段来编排这一过程。

  1. 用文本编辑器或IDE,在本地simple-java-maven-app仓库根目录创建并保存Jenkinsfile。

  2. 将以下声明式流水线代码复制到文件中:

    pipeline {
        agent any
        stages {
            stage('Build') { (1)
                steps {
                    sh 'mvn -B -DskipTests clean package' (2)
                }
            }
        }
    }
    1 定义名为Build的stage指令,它会显示在Jenkins界面中。
    2 此sh步骤运行Maven命令,执行干净构建,但不运行测试。
  3. 保存Jenkinsfile并提交。在simple-java-maven-app目录运行:

    1. git add .

    2. git commit -m "Add initial Jenkinsfile"

    3. 运行git push,把更改推送到GitHub上的Fork,以供Jenkins读取。

  4. 在项目左侧选择Build Now。Jenkins克隆simple-java-maven-app仓库后会:

  5. 先将项目排队,等待在代理上运行。

  6. 在代理上执行Jenkinsfile中的Build阶段。

期间Maven会下载构建Java应用所需的各种构件,最终保存在Jenkins本地Maven仓库。

Downloading Maven artifacts

点击#1查看构建详情,包括排队时间与运行时间。

Initial Pipeline first run details点击左侧Pipeline Overview查看流水线阶段。

Initial Pipeline runs successfully选择Build阶段查看详情;点击绿色maven区域可查看mvn输出。

Build stage overview点击左上角Maven tutorial,或你实际设置的项目名,返回流水线主页。

添加测试阶段

  1. 回到编辑器或IDE,打开Jenkinsfile。

  2. 在Build阶段之后粘贴以下声明式流水线内容:

            stage('Test') {
                steps {
                    sh 'mvn test'
                }
                post {
                    always {
                        junit 'target/surefire-reports/*.xml'
                    }
                }
            }

    最终文件如下:

    pipeline {
        agent any
        stages {
            stage('Build') {
                steps {
                    sh 'mvn -B -DskipTests clean package'
                }
            }
            stage('Test') { (1)
                steps {
                    sh 'mvn test' (2)
                }
                post {
                    always {
                        junit 'target/surefire-reports/*.xml' (3)
                    }
                }
            }
        }
    }
    1 定义名为Test的stage指令,它会显示在Jenkins界面中。
    2 此sh步骤调用Maven运行单元测试,并生成JUnit XML报告,保存到Jenkins容器的/var/jenkins_home/workspace/simple-java-maven-app目录下的target/surefire-reports。
    3 JUnit插件提供的junit步骤归档mvn test生成的XML报告,并在界面展示结果。post区域中的always确保无论Test阶段成功与否,结束时都执行该步骤。
  3. 保存并提交Jenkinsfile。在仓库目录运行:

    1. git stage .

    2. git commit -m "Add 'Test' stage"

    3. 运行git push将更改推送到GitHub Fork,以供Jenkins读取。

  4. 在Jenkins返回Dashboard,再进入Maven Tutorial,点击Build Now发起构建。

  5. 稍后Stage View会出现新的Test列。

Test stage runs successfully

  1. 在左侧Build History中点击#2或最新构建编号,查看详情。

    若自上次运行流水线后Docker没有重启,Build阶段通常无需再次下载Maven构件,因此这次运行会快得多。

点击Pipeline Overview查看阶段。

Test stage runs successfully

留意新增的Test阶段,点击其勾选标记可查看该阶段输出。

Test stage runs successfully (with output)

添加最终交付阶段

  1. 回到编辑器或IDE,打开Jenkinsfile。

  2. 在Test阶段之后粘贴以下声明式流水线内容:

            stage('Deliver') {
                steps {
                    sh './jenkins/scripts/deliver.sh'
                }
            }

    加入skipStagesAfterUnstable选项,结果如下:

    pipeline {
        agent any
        options {
            skipStagesAfterUnstable()
        }
        stages {
            stage('Build') {
                steps {
                    sh 'mvn -B -DskipTests clean package'
                }
            }
            stage('Test') {
                steps {
                    sh 'mvn test'
                }
                post {
                    always {
                        junit 'target/surefire-reports/*.xml'
                    }
                }
            }
            stage('Deliver') { (1)
                steps {
                    sh './jenkins/scripts/deliver.sh' (2)
                }
            }
        }
    }
    1 定义新的Deliver阶段,显示在Jenkins界面中。
    2 此sh步骤运行仓库根目录下jenkins/scripts/deliver.sh脚本,可查看该文件了解更多。通常应保持Jenkinsfile等流水线代码简洁,将较复杂的构建步骤,尤其包含两步以上操作的阶段,放入独立Shell脚本,例如deliver.sh,以便维护。
  3. 保存更新后的Jenkinsfile,并提交到本地仓库。

    1. git stage .

    2. git commit -m "Add 'Deliver' stage"

    3. 运行git push将更改推送到GitHub Fork,以供Jenkins读取。

  4. 必要时登录Jenkins,返回Dashboard,再进入Maven tutorial;也可直接回到该项目。

  5. 点击左侧Build Now。稍后Stage View会出现Deliver列。

    Deliver stage runs successfully

  6. 在左侧Build History中点击#3或最新构建编号查看详情。

    点击Pipeline Overview,再点击Deliver的绿色勾选标记和第一个绿色区域,应看到类似下面的输出,末尾展示Java应用的执行结果。

    Deliver stage output only

  7. Pipeline overview interface with all previous runs displayed点击左上角Maven tutorial,再点击左侧Stages,可按时间倒序查看历史流水线运行。

总结

至此,已完成用Jenkins和Maven构建简单Java应用的步骤。

Build、Test和Deliver三个阶段,是在Jenkins中构建更复杂Java/Maven应用,以及与其他技术栈集成的基础。

Jenkins具有很强的可扩展性,可以通过修改与配置处理构建编排和自动化的多种需求。

更多内容可查看:

清理环境

完成教程后,应清理环境,避免影响之后的其他教程。

停止容器并移除关联卷:

docker compose --profile maven down -v --remove-orphans

此命令为下一个项目清理环境。

--remove-orphans让Docker Compose移除未在docker-compose.yml中定义、但标记为属于该项目的容器。这有助于清理由其他方式启动、但仍被视为项目组成部分的服务。



原文:使用Maven构建Java应用;作者:Jenkins文档贡献者。版本或日期:官方原文抓取版本。原文及源码权利归相应权利人所有。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容