本教程将向你展示如何使用Jenkins编排并构建一个使用Maven管理的简单Java应用程序。

如果你是使用Maven的Java开发人员,并且对CI/CD概念不熟悉,或者你可能熟悉这些概念,但不知道如何使用Jenkins实现构建应用程序,那么本教程适合你。

你将在Github示例仓库中获取一个输出"Hello world!"字符串的简单Java应用,该应用还包含若干单元测试,用于检查main方法。 测试结果保存在JUnit XML报告中。

耗时: 假如你的机器符合配置要求,完成本教程需要20-40分钟。准确的耗时取决于你机器的性能, 以及你是否完成过在Docker中运行Jenkins教程,请参考另一个教程.

你可以在任何时候停止本教程,并从你离开的地方继续。

若你已经完成了另一个教程,可以跳过配置要求和在Docker中运行Jenkins章节, 继续阅读fork示例仓库(确保你本地安装了Git)。 如果你需要重启Jenkins,请参考停止和重启Jenkins.

配置要求

对于本教程,您将需要:

  • 安装有macOS,Linux或Windows操作系统的机器,并拥有以下配置:

    • 最小256MB内存, 推荐512MB以上。

    • 10GB硬盘空间, 用于安装Jenkins,您的Docker镜像和容器。

  • 安装有以下软件:

    • Docker - 在安装Jenkins页面的安装Docker章节信息。
      注意: 如果您使用Linux,本教程假定您没有以root用户的身份运行Docker命令,而是使用单个用户帐户访问本教程中使用的其他工具。

    • Git和GitHub Desktop.

在 Docker中运行Jenkins

在本教程中, 将Jenkins作为 Docker 容器并从 jenkinsci/blueocean Docker 镜像中运行。

要在 Docker中运行Jenkins, 请遵循下面的macOS 和 Linux 或 Windows相关文档说明进行操作。 .

你可以在 Docker和 Installing Jenkins 页面的 Downloading and running Jenkins in Docker部分有关Docker容器和镜像概念的信息。

在 macOS 和 Linux 系统上

  1. 打开终端窗口

  2. 使用下面的 docker run 命令运行 jenkinsci/blueocean 镜像作为Docker中的一个容器(记住,如果本地没有镜像,这个命令会自动下载):

    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
    将容器中的 /var/jenkins_home 目录映射到 Docker volume ,并将其命名为 jenkins-data。如果该卷不存在, 那么 docker run 命令会自动为你创建卷。
    将主机上的`$HOME` 目录 (即你的本地)映射到 (通常是 /Users/<your-username> 目录) 到容器的 /home 目录。

    Note: 如果复制或粘贴上面的命令片段不起作用, 尝试复制和粘贴这个没有注释的版本:

    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
  3. 继续 安装向导。

在 Windows 系统

  1. 打开命令提示窗口。

  2. 使用下面的 docker run 命令运行 jenkinsci/blueocean 镜像作为Docker中的一个容器(记住,如果本地没有镜像,这个命令会自动下载):

    docker run ^--rm ^-u root ^-p 8080:8080 ^-v jenkins-data:/var/jenkins_home ^-v /var/run/docker.sock:/var/run/docker.sock ^-v "%HOMEPATH%":/home ^jenkinsci/blueocean

    对这些选项的解释, 请参考上面的 macOS 和 Linux 说明。

  3. 继续安装向导。

访问 Jenkins/Blue Ocean Docker 容器

如果你有一些使用 Docker 的经验,希望或需要使用 docker exec 命令通过一个终端/命令提示符来访问 Jenkins/Blue Ocean Docker 容器, 你可以添加如 --name jenkins-tutorials 选项(与上面的 docker run ), 这将会给Jenkins/Blue Ocean Docker容器一个名字 "jenkins-tutorials"。

这意味着你可以通过 docker exec 命令访问Jenkins/Blue Ocean 容器(通过一个单独的终端 /命令提示窗口) ,例如:

docker exec -it jenkins-tutorials bash

安装向导

在你访问 Jenkins之前, 你需要执行一些快速的 "一次性" 步骤。

解锁 Jenkins

当你第一次访问一个新的 Jenkins 实例时, 要求你使用自动生成的密码对其进行解锁。

  1. 当在终端/命令提示窗口出现两组星号时, 浏览 http://localhost:8080 并等待 Unlock Jenkins 页面出现。

  2. 再次从终端/命令提示窗口, 复制自动生成的字母数字密码(在两组星号之间)。 

  3. 在 Unlock Jenkins 页面, 粘贴该密码到 Administrator password 字段并点击 Continue

使用插件自定义 Jenkins

在 解锁 Jenkins后, Customize Jenkins 页面出现。

在该页面,点击 Install suggested plugins

安装向导显示了正在配置的Jenkins的进程,以及建议安装的插件。这个过程肯需要几分钟。

创建第一个管理员用户

最后, Jenkins 要求创建你的第一个管理员用户。

  1. 当 Create First Admin User 页面出现, 在相应的字段中指定你的详细消息并点击 Save and Finish

  2. 当 Jenkins is ready 页面出现, 点击 Start using Jenkins
    Notes:

    • 该页面可能表明 Jenkins is almost ready! 如果相反, 点击 Restart.

    • 如果该页面在一分钟后没有自动刷新, 使用你的web浏览器手动刷新。

  3. 如果需要,登录 Jenkins , 你就可以开始使用 Jenkins了!

停止和重启 Jenkins

在本教程的其余部分, 你可以通过在终端/命令提示窗口输入 Ctrl-C`停止 Jenkins/Blue Ocean Docker 容器,你可以从中运行<<run-jenkins-in-docker,上面>>的 `docker run ... 命令。

要重启Jenkins/Blue Ocean Docker 容器:

  1. 在上面的 macOS,Linux 或 Windows上运行相同的 docker run ... 命令 。
    Note: 如果有更新的话,该进程会更新 jenkinsci/blueocean Docker 镜像。

  2. 浏览`http://localhost:8080`。

  3. 等待直到登录页面出现并登陆。

Fork 和 clone GitHub示例仓库

通过将应用程序源代码所在的示例仓库fork到你自己的Github账号中, 并clone到本地,你就可以获取一个"Hello world!"简单Java应用程序。

  1. 请确保你登陆了你的GitHub账户。如果你还没有Github账户,你可以在 GitHub网站 免费注册一个账户。

  2. 将示例仓库 simple-java-maven-app fork到你的账户的Github仓库中。在此过程中,如果你需要帮助,请参考 Fork A Repo 文档。

  3. 将你的GitHub账户中的 simple-java-maven-app 仓库clone到你的本地机器。 根据你的情况完成以下步骤之一(其中 <your-username> 是你的操作系统用户账户名称):

    • 如果你的机器安装了Github Desktop:

      1. 在GitHub网站上,点击绿色的 Clone or download 按钮,再点击 Open in Desktop.

      2. 在Github桌面版中,在点击 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. 运行以下命令完成仓库的clone:
        git clone https://github.com/YOUR-GITHUB-ACCOUNT-NAME/simple-java-maven-app
        其中 YOUR-GITHUB-ACCOUNT-NAME 是你的Github账户的名称。

在Jenkins中创建你的流水线项目

  1. 回到Jenkins,如果有必要的话重新登录,点击 Welcome to Jenkins! 下方的 create new jobs
    注意: 如果你无法看见以上内容,点击左上方的 New Item 。

  2. 在 Enter an item name 域中,为新的流水线项目指定名称(例如 simple-java-maven-app)。

  3. 向下滚动并单击 Pipeline,然后单击页面末尾的 OK 。

  4. ( 可选 ) 在下一页中,在 Description 字段中填写流水线的简要描述 (例如 一个演示如何使用Jenkins构建Maven管理的简单Java应用程序的入门级流水线。

  5. 点击页面顶部的 Pipeline 选项卡,向下滚动到 Pipeline 部分。

  6. 在 Definition 域中,选择 Pipeline script from SCM 选项。此选项指示Jenkins从源代码管理(SCM)仓库获取你的流水线, 这里的仓库就是你clone到本地的Git仓库。

  7. 在 SCM 域中,选择 Git

  8. 在 Repository URL 域中,填写你本地仓库的 目录路径, 这是从你主机上的用户账户home目录映射到Jenkins容器的 /home 目录:

    • MacOS系统 - /home/Documents/GitHub/simple-java-maven-app

    • Linux系统 - /home/GitHub/simple-java-maven-app

    • Windows系统 - /home/Documents/GitHub/simple-java-maven-app

  9. 点击 Save 保存你的流水线项目。你现在可以开始创建你的 Jenkinsfile,这些文件会被添加到你的本地仓库。

将你的初始流水线创建为Jenkinsfile

现在你已准备好创建你的流水线,它将使用Jenkins中的Maven自动构建你的Java应用程序。 你的流水线将被创建为 Jenkinsfile,它将被提交到你本地的Git仓库(simple-java-maven-app)。

这是 "Pipeline-as-Code" 的基础,它将持续交付流水线作为应用程序的一部分,与其他代码一样进行版本控制和审查。 关于 流水线 的信息,以及用户手册中的 使用Jenkinsfile 章节。

首先,创建一个初始流水线来下载Maven Docker镜像,并将其作为Docker容器运行(这将构建你的简单Java应用)。 同时添加一个“构建”阶段到流水线中,用于协调整个过程。

  1. 使用你最称手的文本编辑器或者IDE,在你本地的 simple-java-maven-app Git仓库的根目录创建并保存一个名为 Jenkinsfile 的文本文件。

  2. 复制以下声明式流水线代码并粘贴到 Jenkinsfile 文件中:

    pipeline {agent {docker {image 'maven:3-alpine' args '-v /root/.m2:/root/.m2' }}stages {stage('Build') { steps {sh 'mvn -B -DskipTests clean package' }}}
    }
    这里的 image 参数(参考 agent 章节的 docker 参数) 是用来下载 maven:3-apline Docker镜像 (如果你的机器还没下载过它)并将该镜像作为单独的容器运行。这意味着:

    • 你将在Docker中本地运行相互独立的Jenkins和Maven容器。

    • Maven容器成为了Jenkins用来运行你的流水线项目的 agent。 这个容器寿命很短——它的寿命只是你的流水线的执行时间。

    这里的 args 参数在暂时部署的Maven Docker容器的 /root/.m2 (即Maven仓库)目录 和Docker主机文件系统的对应目录之间创建了一个相互映射。这背后的实现细节超出了本教程的范围,在此不做解释。 但是,这样做的主要原因是,在Maven容器的生命周期结束后,构建Java应用程序所需的工件 (Maven在流水线执行时进行下载)能够保留在Maven存储库中。这避免了在后续的流水线执行过程中, Maven反复下载相同的工件。请注意,不同于你为 jenkins-data 创建的Docker数据卷,Docker主机的文件系统在每次重启Docker时都会被清除。 这意味着每次Docker重新启动时,都会丢失下载的Maven仓库工件。
    定义了一个名为 Build 的 stage,之后会出现在Jenkins UI上。
    这里的 sh step(参考 steps 章节)运行Maven命令干净地构建你的Java应用(不运行任何tests)。
  3. 保存对 Jenkinsfile 的修改并且将其提交到你本地的 simple-java-maven-app Git仓库。例如,在 simple-java-maven-app 目录下,运行以下命令:
    git add .
    继续运行
    git commit -m "Add initial Jenkinsfile"

  4. 再次回到Jenkins,如果有必要的话重新登录,点击左侧的 Open Blue Ocean 进入Jenkins的Blue Ocean界面。

  5. 在 This job has not been run 消息框中,点击 Run,然后快速点击右下角出现的 OPEN 链接, 观察Jenkins运行你的流水线项目。如果你不能点击 OPEN 链接,点击Blue Ocean主界面的一行来使用这一特性。
    注意: 你可能需要几分钟时间等待第一次运行完成。在clone了你的本地 simple-java-maven-app Git仓库后, Jenkins接下来做了以下动作:

    1. 将项目排入队列等待在agent上运行。

    2. 下载Maven Docker镜像,并且将其运行在Docker中的一个容器中。

    3. 在Maven容器中运行 Build 阶段 (Jenkinsfile 中所定义的)。在这期间,Maven会下载构建你的Java应用所需的工件, 这些工件最终会被保存在Jenkins的本地Maven仓库中(Docker的主机文件系统)。

    若Jenkins成功构建了你的Java应用,Blue Ocean界面会变为绿色。

  6. 点击右上方的 X 回到Blue Ocean主界面。

为你的流水线增加test阶段

  1. 回到你的文本编辑器/IDE,打开你的 Jenkinsfile

  2. 复制以下声明式流水线代码,并粘贴到 Jenkinsfile 中 Build 阶段的下方:

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

    最终的代码为:

    pipeline {agent {docker {image 'maven:3-alpine'args '-v /root/.m2:/root/.m2'}}stages {stage('Build') {steps {sh 'mvn -B -DskipTests clean package'}}stage('Test') { steps {sh 'mvn test' }post {always {junit 'target/surefire-reports/*.xml' }}}}
    }
    定义了一个名为 Test 的 stage,之后会出现在Jenkins UI上。
    这里的 sh step (参考 steps 章节)执行Maven命令来运行你的Java应用的单元测试。 这个命令还生成一个JUnit XML报告,保存在 target/surefire-reports 目录 (位于Jenkins容器中的 /var/jenkins_home/workspace/simple-java-maven-app 目录)。
    这里的 junit step (由 JUnit Plugin 提供)用于归档JUnit XML报告(由上面的 mvn test 命令生成) 并通过Jenkins接口公开结果。在Blue Ocean中,可以在流水线运行的 Tests 页面获取结果。 post 章节的 always 条件包含了这个 junit step, 保证了这个step 总是 在 Test 阶段 结束后 执行,不论该阶段的运行结果如何。
  3. 保存对 Jenkinsfile 的修改并将其提交到你的本地 simple-java-maven-app Git仓库。例如,在 simple-java-maven-app 目录下,运行以下命令:
    git stage .
    继续运行
    git commit -m "Add 'Test' stage"

  4. 再次回到Jenkins,如果有必要的话重新登录,进入Jenkins的Blue Ocean界面。

  5. 点击左上方的 Run 然后快速点击右下方出现的 OPEN 链接, 观察Jenkins运行你修改过的流水线项目。 如果你不能点击 OPEN 链接,点击Blue Ocean主界面的 top 行来使用这一特性。
    注意: 你会发现本次运行Jenkins不再需要下载Maven Docker镜像。Jenkins只需要从之前下载的Maven镜像运行 一个新的容器。另外,如果最近一次运行 流水线 后,Docker没有重启, 那么在 "Build" 阶段无需下载Maven工件。因此,你的流水线再次运行时速度会更快。
    如果你修改过的流水线运行成功,Blue Ocean界面看起来会像下面这样。注意增加的 "Test" 阶段。 你可以点击之前的 "Build" 阶段来获取阶段输出结果。

  6. 点击右上方的 X 回到Blue Ocean主界面。

为你的流水线增加deliver阶段

  1. 回到你的文本编辑器/IDE,打开你的 Jenkinsfile

  2. 复制以下声明式流水线代码,并粘贴到 Jenkinsfile 中 Test 阶段的下方:

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

    最终的代码为:

    pipeline {agent {docker {image 'maven:3-alpine'args '-v /root/.m2:/root/.m2'}}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') { steps {sh './jenkins/scripts/deliver.sh' }}}
    }
    定义了一个名为 Deliver 的stage,之后会出现在Jenkins UI上。
    这里的 sh step (参考 steps 章节)执行位于 jenkins/scripts 目录下的shell脚本 deliver.sh, 该目录位于 simple-java-maven-app 仓库根目录下。deliver.sh 文件所做动作包含在其自身文本内容中。 一般的原则是,尽量保持你的流水线代码(即 Jenkinsfile)越简洁越好,将更复杂的构建步骤放在多个独立的shell脚本中 (尤其对于那些包含2个以上steps的stage)。这最终会使得维护你的流水线代码变得更容易,特别是当你的流水线变得越来越复杂的时候。
  3. 保存对 Jenkinsfile 的修改并将其提交到你的本地 simple-java-maven-app Git仓库。例如,在 simple-java-maven-app 目录下,运行以下命令:
    git stage .
    继续运行
    git commit -m "Add 'Deliver' stage"

  4. 再次回到Jenkins,如果有必要的话重新登录,进入Jenkins的Blue Ocean界面。

  5. 点击左上方的 Run 然后快速点击右下方出现的 OPEN 链接, 观察Jenkins运行你修改过的流水线项目。 如果你不能点击 OPEN 链接,点击Blue Ocean主界面的 top 行来使用这一特性。
    如果你修改过的流水线运行成功,Blue Ocean界面看起来会像下面这样。注意增加的 "Deliver" 阶段。 你可以点击之前的 "Test" 和 "Build" 阶段来获取阶段输出结果。

    以下是 "Deliver" 阶段的输出应该是什么样子,向你展示最终Java应用程序的执行结果。

  6. 点击右上方的 X 回到Blue Ocean主界面,列表显示流水线历史运行记录,按时间顺序倒序排列。 

总结

做得好!您刚刚使用Jenkins用Maven构建了一个简单的Java应用程序!

您在上面创建的 "Build", "Test" 和 "Deliver" 阶段是使用Jenkins中的Maven构建更复杂的Java应用程序的基础,以及与其他技术栈集成的Java和Maven应用程序。

由于Jenkins具有极高的可扩展性,因此可以对其进行修改和配置,以处理构建协调和自动化的几乎任何方面。

要详细了解Jenkins可以做什么,请查看:

  • 教程概览 页面中的其他介绍教程。

  • 用户手册 使用Jenkins的更多细节,例如 Pipelines (尤其是 Pipeline syntax) 和 Blue Ocean 界面。

  • Jenkins blog 资讯,其他教程和更新。

Jenkins教程(2)使用Maven构建Java应用程序相关推荐

  1. Maven-EclipseEE使用Maven构建Java web项目从0到1

    Maven是什么 安装Maven 解压apache-maven-350-binzip 新建变量M2_HOME配置Maven主目录 在 Path 变量中添加 Maven的bin目录 命令窗口mvn -v ...

  2. myeclipse java maven web 项目结构,Myeclipse 10 Maven 构建 Java Web 项目

    下载 Maven http://maven.apache.org/download.cgi,解压到任意非C盘位置,比如:D:\Java\apache-maven-3.1.0 打开 Myeclipse ...

  3. maven 构建java项目,jdk版本问题

    为什么80%的码农都做不了架构师?>>>    使用maven构建Java项目,默认的 jdk 版本是1.5 详情见官方说明:https://maven.apache.org/plu ...

  4. 使用Maven构建Java项目

    使用Maven构建Java项目 本指南将引导您使用Maven构建一个简单的Java项目. 你会建立什么 您将创建一个提供一天中时间的应用程序,然后使用Maven进行构建. 你需要什么 约15分钟 最喜 ...

  5. Maven构建Java使用代理,请求API接口

    Maven构建Java使用代理,请求API接口 提示:代理请求访问,请合法使用,谢谢 环境: Maven:Maven官网 HuTool:HuTool官网 Java8: Java官网-Oracle Id ...

  6. java yii_构建 Java 应用程序

    构建 Java 应用程序 目标 了解对象或对象集合如何变成应用程序 使用 Eclipse 创建驱动程序类 应用程序入口点 所有 Java 应用程序都需要一个入口点,让 Java 运行时知道将从这里开始 ...

  7. 《Java和Android开发实战详解》——2.2节构建Java应用程序

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.2节构建Java应用程序,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号 ...

  8. 基于gradle构建Java应用程序

    基于gradle构建java应用程序示例 目录 你需要什么 用户手册 初始化项目 项目结构 编译程序 运行程序 总结 源码 你需要什么 大约8分钟 一个文本编辑器 命令行终端 jdk1.7或更高版本 ...

  9. Marven:使用Maven构建Java项目

    一.Maven是什么? Maven 是一个项目管理和构建自动化工具.Maven基于POM(Project object model),能够管理项目的构建.报表.文档等信息. 我们这里主要讲的Maven ...

最新文章

  1. flask+sqlite3+echarts2+ajax数据可视化--静态图
  2. 模拟登录QQ判断是否需要验证码
  3. linux shell之字符串的比较
  4. java中的泛型类型擦除
  5. 跟我学ModelArts丨探索ModelArts平台个性化联邦学习API
  6. 遇上DG挖矿病毒的处理记录
  7. 活灵活现用 Git --技巧篇
  8. 线性方程组迭代解法——雅可比(Jacobi)迭代法,Gauss-Seidel迭代法和超松弛(SOR)迭代法
  9. matlab在高等数学中的应用,Matlab在高等数学中的若干应用
  10. 腾讯通RTX 多文件服务器部署
  11. java怎么查看jar包_怎么查看Jar包源码?如何打开Jar文件?
  12. vue项目退出登录清除 store 数据
  13. RFID 射频识别技术 NFC ISO14443 - A 协议 RC522
  14. AD158A4语音芯片介绍
  15. NR学习之路——3GPP组织介绍
  16. 解决D-LINK DI 504路由器上网掉线问题
  17. “淘宝” 开放平台接口设计思路
  18. 高飞助教介绍的他们所用无人机机架组成
  19. 惠普HP Prime可编程计算器之添加坐标表及写入与读取
  20. 特征选择(过滤法、包装法、嵌入法)

热门文章

  1. 青莲云董方:物联网世界到底是一种什么样的黑
  2. 【布隆过滤器】世界上大概有1 亿种小蛋糕,客户康宝要求这辈子不吃重复的小蛋糕。
  3. 为什么“懂了那么多道理却依然过不好这一生”?
  4. 遗传算法创建初始种群的步骤
  5. tcl电视原生android,TCL Android 电视 adb
  6. 小程序源码:2022虎年背景全新UI头像框制作微信小程序源码下载-多玩法安装简单
  7. 【学术】英文写作中值得参考的语法、句式(三)
  8. 碧兴物联IPO过会:拟募资4亿 预计年净利降幅超10%
  9. 前端面试题全集(html+CSS)
  10. Android 去掉RadioButton水波纹效果