![2ced44d68b50585e1219d2fcef120d01.png](https://i-blog.csdnimg.cn/blog_migrate/f8473a7b4c4bf0c8a3be2cf0461a03a3.jpeg)
在本文中,我们将介绍如何使用Github Actions发布Maven项目包。
Maven
在构建一个CI Pipeline前,我们首先需要配置项目的Maven设置。
入门
Maven引用项目由三组独特的坐标组成:
- Group ID
- Artifact ID
- Version
比如,一个简单的Maven项目的坐标可以如下:
pom.xml
io.github.tinykingsamples1.0-SNAPSHOT
项目打包编译后会生成一个jar文件。
我们一个在项目version中增加一个-SNAPTHOT来标记这个是一个快照版本。快照版本表示该项目版本正在开发中,是一个非正式发布的版本。
一些项目在最终发布之前提供里程碑或发布候选版本。在这种情况下,Maven本身并没有为此提供命名方案。例如,Spring框架将. mx、. rcx和. release附加到版本中。它们不被认为是快照。
版本管理
Maven Release plugin管理发布过程。它提供了两个互补的目标,准备和执行。他们做以下工作:
准备
- 修改pom中版本号,从x-SNAPSHOT修改为一个新的版本
- 转换POM中的SCM信息,以包含标记的最终目的地
- 提交修改后的POM
- 用版本名标记SCM中的代码
- 将POM中的版本修改为一个新值y-SNAPSHOT
- 提交修改后的pom文件
执行
- 从带有可选标签的SCM URL中签出
- 运行预定义的Maven deploy
对于所需的SCM信息,Maven POM提供了一个专门的部分来配置它。
scm:git:https://github.com/tinyking/samples.git
身份认证
上面的代码片段支持不同的协议:git、http、https、ssh,甚至文件。使用git协议进行身份验证需要SSH密钥。
因此,上面的配置片段需要使用http协议。这需要用户/密码对形式的凭据。Maven从跨项目共享的数据(如安全相关数据)中分离出特定项目的数据。POM负责前者,而$HOME/.m2/settings.xml文件保存后者。
每个凭据对都需要一个惟一的标识符。
~/.m2/settings.xml
githubmy_usernammy_password
github是我们配置的一个唯一识别符。
为了在Maven项目中使用中指定的server, 我们需要在pom中增加project.scm.id的属性配置,告诉Maven使用哪个server:
pom.xml
github
这样,我们的Maven项目就会使用settings.xml中配置的id为github的server信息。
Distribution management
Maven作者围绕插件架构设计了Maven。Maven本身只提供一个构建生命周期,以及一组构建阶段。Maven引擎按顺序调用每个阶段;如果没有经历早期阶段,周期就不能进入后期阶段。例如,构建生命周期中的阶段包括编译、测试、集成测试、打包和部署。不先运行编译就不能运行测试。
我们可以将插件目标绑定到特定阶段。默认情况下,Maven绑定两个目标。例如,包阶段绑定maven-jar-plugin:jar目标。运行mvn包将依次执行所有阶段的所有目标限制,直到包结束。
release:perform :启动运行部署阶段的Maven fork。默认情况下,Maven将Maven部署插件的deploy:deploy目标绑定到deploy。这意味着Maven之前已经运行了绑定到包阶段的目标。由于这个原因,构建工件在部署启动时可用。部署意味着Maven将把工件推到需要显式配置的注册中心。
在这个项目的上下文中,制品是一个JAR,注册表是GitHub。这可以转化为下面的配置片段:
githubGitHubhttps://maven.pkg.github.com/tinyking/samples
Maven命令
编译命令需要执行release:prepare和release:perform.
默认情况下,release:prepare是一个交互过程,插件询问发布版本是什么,以及新的快照版本是什么。这在CI的情况下是行不通的,我们需要它们自动执行。
可以使用命令行-B标志以批处理模式运行Maven。在这种情况下,插件会自动推断发布版本和快照版本。
命令如下:
mvn -B release:prepare release:perform
Maven包装
最后的准备步骤是完全独立于Maven版本。
将来,用于构建项目的特定Maven版本可能不再可用。当时可用的版本可能与它不兼容。由于这个原因,Maven插件提供了一个包装器。包装器自可执行的JAR,它可以启动特定版本的mvn工具,而与环境无关。创建这样的包装器很简单:
mvn -N io.takari:maven:wrapper
这会在项目内部创建几个文件,包括.mvn文件夹。您需要在SCM中添加所有这些文件。
从现在开始,您应该使用位于项目根目录的mvnw脚本,而不是使用mvn命令。构建不再需要本地Maven安装。
基于Github构建
现在我们已经配置了POM,现在是时候在GitHub构建中集成Maven了。
现有的CI工具使用存储在存储库根的配置文件:
![93ca5419fcc92b96f8592faef5dfba86.png](https://i-blog.csdnimg.cn/blog_migrate/a940a1f92d9ac3b6512543422062daf7.jpeg)
GitHub的操作也采用类似的方法,但有两个重要的区别:
- 该项目可以使用多个构建文件—称为工作流
- 需要将配置文件放到$PROJECT_ROOT/.github/workflows文件夹中
构建步骤
第一步我们需要签出项目
release.yml
- name: Checkout project uses: actions/checkout@v2
接下来我们需要安装JDK
release.yml
- name: Setup Java JDK uses: actions/setup-java@v1.4.2 with: java-version: 14 server-id: github
因为发布:准备实际提交,有必要配置用户和电子邮件使用:
release.yml
- name: Configure Git user run: | git config user.email "actions@github.com" git config user.name "GitHub Actions"
最后一步实际上是最直接的。只需从上面运行Maven命令。
release.yml
- name: Publish JAR run: ./mvnw -B release:prepare release:perform env: GITHUB_TOKEN: $
验证
当主分支准备好发布时,只需将它推到发布分支:
git push origin master:release
在Action中我们就可以看到执行记录了
![f82f59eea7b9efccc58037d8717cc5a3.png](https://i-blog.csdnimg.cn/blog_migrate/4a91732503ba80e048b3bc5aa3cf8ec2.jpeg)
结论
管理带有GitHub操作的Maven发行版并不是一件简单的事情。然而,它只需要一点经验就可以使它工作。我希望这篇文章能够通过提供这种体验来帮助Maven用户充分利用GitHub动作的强大功能。