优秀的编程知识分享平台

网站首页 > 技术文章 正文

基于Github Actions发布Maven包(github maven仓库)

nanyue 2024-08-19 19:02:08 技术文章 5 ℃


在本文中,我们将介绍如何使用Github Actions发布Maven项目包。

Maven

在构建一个CI Pipeline前,我们首先需要配置项目的Maven设置。

入门

Maven引用项目由三组独特的坐标组成:

  1. Group ID
  2. Artifact ID
  3. Version

比如,一个简单的Maven项目的坐标可以如下:

pom.xml

<groupId>io.github.tinyking</groupId>
<artifactId>samples</artifactId>
<version>1.0-SNAPSHOT</version>

项目打包编译后会生成一个jar文件。

我们一个在项目version中增加一个-SNAPTHOT来标记这个是一个快照版本。快照版本表示该项目版本正在开发中,是一个非正式发布的版本。

一些项目在最终发布之前提供里程碑或发布候选版本。在这种情况下,Maven本身并没有为此提供命名方案。例如,Spring框架将. mx、. rcx和. release附加到版本中。它们不被认为是快照。

版本管理

Maven Release plugin管理发布过程。它提供了两个互补的目标,准备和执行。他们做以下工作:

准备

  1. 修改pom中版本号,从x-SNAPSHOT修改为一个新的版本
  2. 转换POM中的SCM信息,以包含标记的最终目的地
  3. 提交修改后的POM
  4. 用版本名标记SCM中的代码
  5. 将POM中的版本修改为一个新值y-SNAPSHOT
  6. 提交修改后的pom文件

执行

  1. 从带有可选标签的SCM URL中签出
  2. 运行预定义的Maven deploy

对于所需的SCM信息,Maven POM提供了一个专门的部分来配置它。

<scm>
  <developerConnection>scm:git:https://github.com/tinyking/samples.git</developerConnection>
</scm>

身份认证

上面的代码片段支持不同的协议:git、http、https、ssh,甚至文件。使用git协议进行身份验证需要SSH密钥。

因此,上面的配置片段需要使用http协议。这需要用户/密码对形式的凭据。Maven从跨项目共享的数据(如安全相关数据)中分离出特定项目的数据。POM负责前者,而$HOME/.m2/settings.xml文件保存后者。

每个凭据对都需要一个惟一的标识符。

~/.m2/settings.xml

<settings>
  <servers>
    <server>
      <id>github</id>                     
      <username>my_usernam</username>
      <password>my_password</password>
    </server>
  </servers>
</settings>

<id>github</id>是我们配置的一个唯一识别符。

为了在Maven项目中使用中指定的server, 我们需要在pom中增加project.scm.id的属性配置,告诉Maven使用哪个server:

pom.xml

<properties>
  <project.scm.id>github</project.scm.id>  
</properties>

这样,我们的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。这可以转化为下面的配置片段:

<distributionManagement>
  <repository>
    <id>github</id>
    <name>GitHub</name>
    <url>https://maven.pkg.github.com/tinyking/samples</url>  
  </repository>
</distributionManagement>

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工具使用存储在存储库根的配置文件:



GitHub的操作也采用类似的方法,但有两个重要的区别:

  1. 该项目可以使用多个构建文件—称为工作流
  2. 需要将配置文件放到$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中我们就可以看到执行记录了



结论

管理带有GitHub操作的Maven发行版并不是一件简单的事情。然而,它只需要一点经验就可以使它工作。我希望这篇文章能够通过提供这种体验来帮助Maven用户充分利用GitHub动作的强大功能。

最近发表
标签列表