Maven 简介(二)
八、Maven 版本
Maven 提供了一个发布插件,可以自动完成发布软件的步骤。在我们深入研究 Maven 发布过程之前,我们将设置和配置 Nexus 存储库,并使用 Maven 向 Nexus 发布工件。
与 Nexus 的集成
存储库管理器是企业中 Maven 部署的关键部分。存储库管理人员充当公共存储库的代理,促进工件共享和团队协作,确保构建稳定性,并支持企业中使用的工件的治理。
sonatypeNexusrepository manager 是一款流行的开源软件,允许您维护内部存储库和访问外部存储库。它允许通过单一 URL 对存储库进行分组和访问。这使得存储库管理员能够在后台添加和删除新的存储库,而不需要开发人员更改他们计算机上的配置。此外,它还为使用 Maven 站点和工件搜索功能生成的站点提供托管功能。
在我们研究将 Maven 与 Nexus 集成之前,您需要在本地机器上安装 Nexus。Nexus 是作为一个归档分发的,它与一个 Jetty 实例捆绑在一起。从 Sonatype 的网站 https://help.sonatype.com/repomanager3/download 下载 Nexus 发行版(【Windows 版)。在撰写本文时,Nexus 的 3.18.1-01 版本已经发布。解压缩文件,并将内容放在您的机器上。在本书中,我们假设内容在C:\tools\nexus folder下。
注意
大多数企业通常在中央服务器上安装并提供存储库管理器。如果您已经可以访问存储库管理器,请跳过安装的这一部分。
在管理员模式下启动你的命令行,导航到C:\tools\nexus\nexus-3.18.1-01下的 bin 文件夹。然后运行命令nexus /install Nexus_Repo_Manager。您将看到如图 8-1 所示的成功消息。
图 8-1
安装 Nexus 时的成功消息
注意
Nexus 3.18 需要 JRE 8 才能正常工作。确保您的本地计算机上安装了 JDK/JRE 版本 8。此外,确保JAVA_HOME指向 JDK 的版本 8。
在同一个命令行上,运行命令nexus start来启动 Nexus。图 8-2 显示了运行该命令的结果。
图 8-2
起始关系
默认情况下,Nexus 运行在端口 8081 上。启动网络浏览器并导航至位于http://localhost:8081/的 Nexus。这将需要几分钟,但最终你应该会看到 Nexus 启动屏幕,如图 8-3 所示。
图 8-3
Nexus 启动屏幕
点击右上角的“登录”链接,登录 Nexus。您将看到一个登录模式,其中包含自动生成的管理员密码文件的位置,如图 8-4 所示。
图 8-4
Nexus 登录模式
使用从 admin.password 文件中复制的用户名 admin 和密码登录 Nexus。您将被要求更改密码,如图 8-5 所示。对于本书中的练习,我将密码改为 admin123。
图 8-5
Nexus 更改密码屏幕
现在 Nexus 已经安装并运行了,让我们修改位于C:\apress\gswm-book\chapter8下的gwsm项目。您将从在pom.xml文件中添加一个distributionManagement元素开始,如清单 8-1 所示。该元素用于提供关于项目工件将被部署到哪里的存储库信息。repository子元素指出了发布的工件将被部署的位置。类似地,snapshotRepository元素标识了存储项目快照版本的位置。
<project xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<dependencies>
<!-- Content removed for brevity -->
</dependencies>
<distributionManagement>
<repository>
<id>nexusReleases</id>
<name>Releases</name>
<url>http://localhost:8081/repository/maven-releases</url>
</repository>
<snapshotRepository>
<id>nexusSnapshots</id>
<name>Snapshots</name>
<url>http://localhost:8081/repository/maven-snapshots</url>
</snapshotRepository>
</distributionManagement>
<build>
<!-- Content removed for brevity -->
</build>
</project>
Listing 8-1The pom.xml with distributionManagement
注意
开箱即用,Nexus 自带 R eleases和 S napshots库。默认情况下,快照工件将存储在Snapshots Repository中,而发布工件将存储在Releases存储库中。
像大多数存储库管理器一样,部署到 Nexus 是一个受保护的操作。为了让 Maven 在 Nexus 上交互和部署工件,您需要在 settings.xml 文件中为用户提供正确的访问角色。清单 8-2 显示了带有服务器信息的settings.xml文件。如您所见,我们使用管理员用户信息来连接 Nexus。注意,在服务器标签中声明的 id——nexusReleases和nexusSnapshots—必须与在pom.xml文件中声明的repository和snapshotRepository的 id 相匹配。用清单 8-2 中的代码替换C:\Users\<<USER_NAME>>\.m2文件夹中settings.xml文件的内容。
<?xml version="1.0" encoding="UTF-8" ?>
<settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>nexusReleases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexusSnapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
</settings>
Listing 8-2Settings.xml File with Server Information
与 Nexus 交互的配置步骤到此结束。在命令行,运行目录C:\apress\gswm-book\chapter8\gswm下的命令mvn deploy。成功执行该命令后,您会在http://localhost:8081/#browse/browse:maven-snapshots看到 Nexus 下的快照工件,如图 8-6 所示。
图 8-6
Nexus 下的快照工件
项目发布
发布项目是一个复杂的过程,通常包括以下步骤:
-
验证本地计算机上没有未提交的更改。
-
从
pom.xml文件的版本中删除快照。 -
确保项目没有使用任何快照依赖项。
-
将修改后的
pom.xml文件签入到您的源代码控制中。 -
创建源代码的源代码控制标记。
-
构建工件的新版本,并将其部署到存储库管理器。
-
增加
pom.xml文件中的版本,为下一个开发周期做准备。
Maven 有一个发布插件,它为执行前面的步骤和发布项目工件提供了一个标准机制。正如您所看到的,作为其发布过程的一部分,Maven 与源代码控制系统进行了大量的交互。在本节中,您将使用 Git 作为源代码控制系统,使用 GitHub 作为存储库的远程服务器。Maven 和 GitHub 之间的典型交互如图 8-7 所示。Maven 发布通常在开发人员或构建机器上执行。Maven 要求在这样的机器上安装 Git 客户端。这些命令行工具允许 Maven 与 GitHub 交互,并执行诸如签出代码、创建标签等操作。
图 8-7
Maven 和 GitHub 之间的交互
在我们深入研究 Maven 发布过程之前,您需要通过完成以下步骤来设置环境:
-
在本地机器上安装 Git 客户端。
-
在 GitHub 上创建一个新的远程资源库。
-
将您将要使用的项目登记到远程存储库中。
Git 客户端安装
有几个 Git 客户端使得与 Git 存储库的交互变得很容易。比较流行的有 SourceTree ( www.sourcetreeapp.com/ )和 GitHub Desktop ( https://desktop.github.com/ )。在本书中,我们将使用 Git SCM 发行版附带的客户端。导航到 https://git-scm.com/downloads 并下载 Git 发行版的 Windows 版本。双击下载的 exe 文件,接受默认安装选项。安装完成后,打开一个新的命令行窗口并键入 git - version。您应该会看到类似图 8-8 的消息。
图 8-8
Git 版本
创建 GitHub 存储库
GitHub 是一个协作开发平台,允许您免费托管公共和私有 Git 存储库。在 GitHub 上创建新的资源库之前,您需要在 https://github.com/join 创建一个帐户。使用您的凭证登录 GitHub 后,导航到 https://github.com/new 并创建一个新的存储库,如图 8-9 所示。
图 8-9
新的 GitHub 资源库
签入源代码
让您的环境为 Maven 发布做好准备的最后一步是将C:\apress\gswm-book\chapter8\gswm下的gswm项目签入到新创建的 remove 存储库中。使用您的命令行,导航到C:\apress\gswm-book\chapter8\gswm文件夹,并按顺序运行以下命令。通过在下面的 remote add 命令中替换您的 GitHub 帐户,确保您使用正确的远程存储库 URL:
-
git init -
git add . -
git commit -m "Initial commit" -
git remote add origin https://github.com/<<your_git_hub_account>>/intro-maven.git -
git push -u origin master
Git push 命令将提示您输入 GitHub 用户名和密码。push 命令的成功完成应给出如图 8-10 所示的输出。
图 8-10
来自Git初始提交的输出
使用您的浏览器,导航到您在 GitHub 上的远程存储库,您将看到签入的代码。图 8-11 显示了预期的浏览器屏幕。
图 8-11
项目已签入 GitHub
前面的命令已经将代码推入 GitHub 上的 mater 分支。但是,Maven 发布插件与发布分支中的代码进行交互。因此,这个设置的最后一步是创建一个新的本地发布分支,并通过运行以下命令将其推送到 GitHub:
-
git checkout –b release -
git push origin release
Maven 版本
使用 Maven 的发布过程发布一个工件需要使用两个重要的目标:prepare和perform。此外,release 插件提供了一个clean目标,在出现问题时可以派上用场。
准备目标
顾名思义,prepare目标是为发布准备一个项目。作为该阶段的一部分,Maven 执行以下操作:
-
check-poms :检查
pom.xml文件中的版本是否有快照。 -
scm-check-modifications :检查是否有未提交的变更。
-
check-dependency-snapshots:检查
pom文件,看是否有任何快照依赖。对于您的项目来说,使用已发布的依赖项是一种最佳实践。在pom.xml文件中发现的任何快照依赖关系都将导致发布失败。 -
地图-发布-版本:在交互模式下运行
prepare时,提示用户发布版本。 -
地图-开发-版本:在交互模式下运行
prepare时,提示用户下一个开发版本。 -
生成-发布-poms :生成发布
pom文件。 -
scm-commit-release :向 scm 提交
pom文件的释放。 -
scm-tag :为 scm 中的代码创建一个发布标签。
-
rewrite-poms-for-development:为新的开发周期更新
pom文件。 -
remove-release-poms :删除发布生成的
pom文件。 -
scm-commit-development :提交带有开发版本的
pom.xml文件。 -
最终释放:完成释放的
prepare阶段。
为了方便起见,您应该在项目的pom.xml文件中提供配置管理信息。清单 8-3 显示了带有 SCM 信息的pom.xml文件片段。
<project>
<modelVersion>4.0.0</modelVersion>
<!-- Content removed for brevity -->
<scm>
<connection>scm:git:https://github.com/bava/intro-maven.git</connection>
<developerConnection>scm:git:https://github.com/bava/intro-maven.git</developerConnection>
<url>https://github.com/bava/intro-maven</url>
</scm>
<!-- Content removed for brevity -->
</project>
Listing 8-3The pom.xml with SCM Information
一旦在本地机器上更新了pom.xml文件,通过运行以下命令将修改后的文件提交给 GitHub:
git commit . -m "Added SCM Information"
git push origin release
为了让 Maven 成功地与 GitHub 通信,它需要 GitHub 凭证。您在settings.xml文件中提供这些信息,如清单 8-4 所示。元素的 ID 被声明为GitHub,因为它必须匹配主机名。
<?xml version="1.0" encoding="UTF-8" ?>
<settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>nexusReleases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexusSnapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>github</id>
<username>[your_github_account_name]</username>
<password>[your_github_account_password]</password>
</server>
</servers>
</settings>
Listing 8-4The settings.xml with GitHub Details
现在您已经拥有了 Maven 的prepare目标所需的所有配置。清单 8-5 显示了运行prepare目标的结果。因为prepare目标是在交互模式下运行的,Maven 将提示您发布版本、发布标签和新的开发版本。对于每个提示,按 Enter 键接受 Maven 建议的默认值。
C:\apress\gswm-book\chapter8\gswm>mvn release:prepare
[INFO] Scanning for projects...
[INFO]
[INFO] --------------< com.apress.gswmbook:gswm >--------------
[INFO] Building Getting Started with Maven 1.0.0-SNAPSHOT
[INFO] --- maven-release-plugin:2.5.3:prepare (default-cli) @ gswm ---
[INFO] Verifying that there are no local modifications...
[INFO] Executing: cmd.exe /X /C "git rev-parse --show-toplevel"
[INFO] Working directory: C:\apress\gswm-book\chapter8\gswm
[INFO] Executing: cmd.exe /X /C "git status --porcelain ."
What is the release version for "Getting Started with Maven"? (com.apress.gswmbook:gswm) 1.0.0: :
What is SCM release tag or label for "Getting Started with Maven"? (com.apress.gswmbook:gswm) gswm-1.0.0: :
What is the new development version for "Getting Started with Maven"? (com.apress.gswmbook:gswm) 1.0.1-SNAPSHOT: :
[INFO] Checking in modified POMs...
[INFO] Tagging release with the label gswm-1.0.0...
[INFO] Executing: cmd.exe /X /C "git tag -F C:\Users\bavara\AppData\Local\Temp\maven-scm-73613791.commit gswm-1.0.0"
[INFO] Executing: cmd.exe /X /C "git push https://github.com/bava/intro-maven.git refs/tags/gswm-1.0.0"
[INFO] Release preparation complete.
[INFO] BUILD SUCCESS
Listing 8-5Maven prepare Command
请注意,Git命令作为prepare目标的一部分被执行。成功完成prepare目标将导致 Git 标签的创建,如图 8-12 所示。gswm项目中的pom.xml文件现在将拥有版本 1 . 0 . 1-快照。
图 8-12
在执行prepare时创建的 Git 标签
清扫目标
作为执行的一部分,prepare目标执行许多活动并生成临时文件,如release.properties和pom.xml.releaseBackup。成功完成后,它会清理这些临时文件。有时prepare目标可能会失败(例如,无法连接到 Git)并使项目处于肮脏的状态。这就是发布插件的clean目标出现的地方。顾名思义,它会删除作为发布执行的一部分而生成的任何临时文件。
注意
发布插件的clean目标必须仅在prepare目标失败时使用。
执行目标
perform目标负责从新创建的标签中签出代码,并将发布的代码构建和部署到远程存储库中。
以下阶段是perform目标的一部分:
-
验证-完成-准备-阶段:这验证了在运行
perform目标之前已经执行了一个prepare阶段。 -
check out-project-from-scm:从 SCM 标签中检出发布的代码。
-
运行-执行-目标:执行与
perform相关的目标。默认目标是部署。
在gswm项目上运行perform目标的输出如清单 8-6 所示。
C:\apress\gswm-book\chapter8\gswm>mvn release:perform
[INFO] Scanning for projects...
[INFO] -------------< com.apress.gswmbook:gswm >---------------
[INFO] Building Getting Started with Maven 1.0.1-SNAPSHOT
[INFO] --------------------[ jar ]-----------------------------
[INFO] --- maven-release-plugin:2.5.3:perform (default-cli) @ gswm ---
[INFO] Checking out the project to perform the release ...
[INFO] Executing: cmd.exe /X /C "git clone --branch gswm-1.0.0 https://github.com/bava/intro-maven.git C:\apress\gswm-book\chapter8\gswm\target\checkout"
[INFO] Invoking perform goals in directory C:\apress\gswm-book\chapter8\gswm\target\checkout
[INFO] Executing goals 'deploy'...
[INFO] Building jar: C:\apress\gswm-book\chapter8\gswm\target\checkout\target\gswm-1.0.0-javadoc.jar
[INFO] --- maven-install-plugin:2.4:install (default-install) @ gswm ---
[INFO] Installing C:\apress\gswm-book\chapter8\gswm\target\checkout\target\gswm-1.0.0.jar to C:\Users\bavara\.m2\repository\com\apress\gswmbook\gswm\1.0.0\gswm-1.0.0.jar
[INFO] --- maven-deploy-plugin:2.7:deploy (default-deploy) @ gswm ---
[INFO] Uploading to nexusReleases: http://localhost:8081/repository/maven-releases/com/apress/gswmbook/gswm/1.0.0/gswm-1.0.0.jar
[INFO] Uploaded to nexusReleases: http://localhost:8081/repository/maven-releases/com/apress/gswmbook/gswm/1.0.0/gswm-1.0.0.jar (2.4 kB at 14 kB/s)
[INFO] Uploading to nexusReleases: http://localhost:8081/repository/maven-releases/com/apress/gswmbook/gswm/1.0.0/gswm-1.0.0.pom
[INFO] Uploaded to nexusReleases: http://localhost:8081/repository/maven-releases/com/apress/gswmbook/gswm/1.0.0/gswm-1.0.0-javadoc.jar (22 kB at 84 kB/s)
[INFO] BUILD SUCCESS
Listing 8-6Maven perform Command
这就完成了gswm项目 1.0.0 版本的发布。工件最终出现在 Nexus repository manager 中,如图 8-13 所示。
图 8-13
与发布的工件的关系
摘要
Nexus 等内部存储库管理器允许企业完全采用 Maven。除了充当公共存储库代理之外,它们还支持组件共享和治理。本章介绍了 Maven 与 Nexus 的集成,并向您展示了将工件部署到 Nexus 的过程。您还了解了 Maven 的发布过程及其不同阶段。
在下一章,我们将学习持续集成(CI)的概念,并安装和配置 Jenkins——一个流行的开源 CI 工具。
九、持续集成
持续集成(CI)是一种软件开发最佳实践,开发人员每天数次将对他们代码的更改集成到一个公共存储库中。每一个提交的变更都会导致一个自动构建,这个自动构建会编译代码,运行测试,并生成工件的一个新版本。构建过程中的任何错误都将立即报告给开发团队。这种频繁的代码集成允许开发人员在开发周期的早期发现并解决集成问题。
图 9-1 显示了持续集成以及相关组件的可视化表示。CI 流程从开发人员将她的变更提交给诸如 Git 或 SVN 之类的源代码控制系统开始。CI 服务器会收到通知或观察/查询新的代码变更,一旦发现变更,就会检查源代码并开始构建过程。在成功的构建中,CI 服务器可以将工件发布到存储库或测试服务器。作为最后一步,关于构建状态的通知被发送给开发团队。
图 9-1
CI 组件
Jenkins 是一个流行的开源 CI 服务器,它与 Maven 集成得很好。其他流行的 CI 服务器包括 Bamboo、TeamCity 和 GitLab。在这一章中,我们将安装并配置 Jenkins 来触发基于 Maven 的项目的自动构建。
安装 Jenkins
Jenkins 以几种方式发布——本地安装程序、Docker 容器和可执行的 WAR 文件。在本书中,我们将使用长期支持(LTS)的可执行 WAR 文件版本,您可以在 https://jenkins.io/download/ 下载。将下载的版本保存在 c:\tools\jenkins。
下载完成后,使用命令行导航到下载的文件夹并运行命令:Java–jar Jenkins . war**。**成功执行命令后,打开浏览器并导航至http://localhost:8080。系统将提示您从“initialAdminPassword”文件中找到并输入自动生成的管理员密码。在下一个屏幕上,选择“安装建议的插件”并等待安装程序完成插件安装。在“创建第一个管理员用户”屏幕上,输入“Admin”作为用户名,输入“admin123”作为密码,并填写表格上的其余详细信息。完成 Jenkin 的配置后,您应该会看到类似于图 9-2 的 Jenkins 仪表盘。
图 9-2
詹金斯仪表板
Maven 项目
为了理解 Jenkins 对 Maven 的支持,我们需要一个源代码控制服务器上的示例 Maven 项目。在本章中,我们将使用位于 https://github.com/bava/gswm-jenkins 的 GitHub 上的 gwsm-jenkins 项目。为了让您理解本章的其余部分,您需要将 gswm-jenkins 存储库放在您自己的帐户下。你可以登录 GitHub,点击如图 9-3 所示的分叉按钮。
图 9-3
Fork gswm-jenkins 知识库
配置 Jenkins
要开始 Jenkins 配置,请单击仪表板上的“新项目”链接。在新项目屏幕上,选择自由式项目并输入名称“gswm-jenkins-integration”,如图 9-4 所示。
图 9-4
新项目屏幕
在下一个屏幕上,在 General 部分,选择“GitHub project”复选框并输入项目 URL。这应该是您 GitHub 帐户上分叉项目位置的 URL。
图 9-5
新项目-常规部分
在“源代码管理”部分,选择“Git”单选按钮并输入 GitHub 库的 URL,如图 9-6 所示。这是 GitHub 克隆 URL,您可以通过点击存储库名称下的“克隆或下载”找到它。
图 9-6
新项目源代码管理部分
为了让 Jenkins 检查您的代码,您需要提供您的 GitHub 凭据。您可以点击凭证旁边的“添加”按钮,输入您的用户名和密码,如图 9-7 所示。
图 9-7
GitHub 凭证输入
在“构建触发器”部分,选择“轮询 SCM”选项,并输入“H/15∑∑∑”作为值,如图 9-8 所示。这表明 Jenkins 需要每 15 分钟轮询一次 GitHub repo 的变化。
图 9-8
构建触发器轮询计划
在“构建”部分,点击“添加构建步骤”并选择“调用顶级 Maven 目标”。输入“全新安装”作为目标值,如图 9-9 所示。
图 9-9
Maven 的构建步骤
最后,在 Post-build Actions 部分,点击“Add post-build action”并选择“Archive the artifacts”。输入∫∫/∫。jar 作为要归档文件的值,如图 9-10 所示。
图 9-10
存档工件部分
再次单击“添加构建后操作”按钮,并选择“发布 JUnit 测试结果报告”。输入“target/surefire-reports/*。xml "作为测试报告的 XMLs 值如图 9-11 所示。单击保存保存配置。
图 9-11
发布 JUnit 结果
触发构建作业
我们现在已经做好了让 Jenkins 构建我们项目的一切准备。在“项目作业”页面上,单击“立即构建”链接以触发新的构建。这将启动一个带有数字编号的新构建,您可以从页面左下角的构建历史部分访问该数字编号。单击内部版本号旁边的下拉箭头,并选择“控制台输出”。这将把你带到类似图 9-12 的输出屏幕。
图 9-12
作业控制台输出屏幕
成功完成工作后,您将在项目页面上看到构建的工件,如图 9-13 所示。
图 9-13
Jenkins 项目页面-构建工件
运行的测试结果也可以在项目页面的“最新测试结果”下找到。
摘要
在这一章中,你学习了持续集成和配置 Jenkins 与 Maven 项目交互。
这场讨论将我们带到旅程的终点。在整本书中,你已经学习了 Maven 背后的关键概念。我们希望您将使用您新发现的 Maven 知识来自动化和改进您现有的构建和软件开发过程。