原文发布于 https://seriouszyx.com/archives/37/

“如何发布 Java 包到 Maven 中央仓库” 讲解了本地将 Java 包发布到 Maven 中央库的全过程。但在开源项目中,一般通过 GitHub 进行代码托管,并在 GitHub 的 Release 中进行发版并写明更新日志,还可能在 README 中添加 Maven 中央库的徽章。这一过程固定又繁琐,本文通过 maven-semantic-release 和 GitHub Actions 进行自动化操作,完成上述的整套流程。

演示仓库位于 https://github.com/seriouszyx/maven-release-example。

GitHub Actions

GitHub 提供了一个 Maven 工作流的模板,在项目根目录创建 .github/workflows/maven-ci.yml 文件,添加工作流的配置文件。

name: Java CIon:push:branches: [master]pull_request:branches: [master]jobs:build:runs-on: ubuntu-lateststeps:- name: Checkoutuses: actions/checkout@v2- name: Set up JDK 1.8uses: actions/setup-java@v1with:java-version: 1.8- name: Build with Mavenrun: mvn clean test

工作流执行了下面几步。

  • checkout 将存储库的副本下载到运行的服务器上
  • setup-java 配置了 JDK11
  • Build with Maven 进行构建和测试

maven-gpg-plugin 添加 configuration,用于 GPG 非交互式密码输入。

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-gpg-plugin</artifactId><version>1.5</version><executions><execution><id>sign-artifacts</id><phase>verify</phase><goals><goal>sign</goal></goals></execution></executions><configuration><!-- Prevent gpg from using pinentry programs --><gpgArguments><arg>--pinentry-mode</arg><arg>loopback</arg></gpgArguments></configuration>
</plugin>

maven-semantic-release

semantic-release 会根据规范化的 commit 信息生成发布日志,默认使用 angular 规则,其他规则可以配置插件完成。

semantic-release 大致的工作流如下:

  • 提交到特定的分支触发 release 流程
  • 验证 commit 信息,生成 release note,打 git tag
  • 其他后续流程,如生成 CHANGELOG.mdnpm publish 等等(通过插件完成)

maven-semantic-release 是官方文档列出的针对 Maven 的第三方工具,它将部署一个 Maven 项目到 Maven 中央库,而 semantic-release 则是部署一个 node.js 项目到 npm。

前文中 JIRA 和 GPG 的配置信息全都存放在本地,可以将其配置在 GitHub Secrets 中,以供 GitHub Actions 自动构建过程中使用。

需要提前准备好的是 JIRA 的用户名(OSSRH_JIRA_USERNAME)和密码(OSSRH_JIRA_PASSWORD),GPG 的 key 名(GPG_KEY_NAME)、私钥(GPG_PRIVATE_KEY)和生成键值对时输入的密码(GPG_PASSPHRASE)。

其中,GPG 的 key 名可以通过以下命令获得,我的是 89985FBD3651A87B

C:\Users\Yixiang Zhao>gpg --list-secret-keys --keyid-format LONG
C:/Users/Yixiang Zhao/AppData/Roaming/gnupg/pubring.kbx
-------------------------------------------------------
sec   rsa3072/89985FBD3651A87B 2021-10-14 [SC] [expires: 2023-10-14]444D548E4E29746B4E2C89FC89985FBD3651A87B
uid                 [ultimate] Yixiang Zhao <seriouszyx@gmail.com>
ssb   rsa3072/1613CEA56E822D62 2021-10-14 [E] [expires: 2023-10-14]

GPG 的私钥可以通过 gpg --armo --export-secret-keys 89985FBD3651A87B 命令获得,最后的参数是 key 名。注意私钥是从 -----BEGIN PGP PRIVATE KEY BLOCK----- 一直到 -----END PGP PRIVATE KEY BLOCK-----,而不是仅仅是中间这一段文本。

将这些配置信息添加到 Settings->Secrets->Repository secrets 中。

补充 maven-ci.yml 文件,添加 maven-semantic-release 配置。

name: Java CIon:push:branches: [master]pull_request:branches: [master]jobs:build:runs-on: ubuntu-lateststeps:- name: Checkoutuses: actions/checkout@v2- name: Set up JDK 1.8uses: actions/setup-java@v1with:java-version: 1.8server-username: OSSRH_JIRA_USERNAMEserver-password: OSSRH_JIRA_PASSWORDgpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}gpg-passphrase: GPG_PASSPHRASE- name: Build with Mavenrun: mvn clean test- name: Set up Node.jsuses: actions/setup-node@v2with:node-version: 16- name: Sematic Releaserun: |npm install -g @conveyal/maven-semantic-release semantic-releasesemantic-release --prepare @conveyal/maven-semantic-release --publish @semantic-release/github,@conveyal/maven-semantic-release --verify-conditions @semantic-release/github,@conveyal/maven-semantic-release --verify-release @conveyal/maven-semantic-releaseenv:GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}GPG_KEY_NAME: ${{ secrets.GPG_KEY_NAME }}GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}OSSRH_JIRA_USERNAME: ${{ secrets.OSSRH_JIRA_USERNAME }}OSSRH_JIRA_PASSWORD: ${{ secrets.OSSRH_JIRA_PASSWORD }}

前文在本地 maven 的 settings.xml 文件中配置的信息,转移到项目根目录下的 maven-settings.xml 中。

<settings><servers><server><id>ossrh</id><username>${OSSRH_JIRA_USERNAME}</username><password>${OSSRH_JIRA_PASSWORD}</password></server></servers><profiles><profile><id>ossrh</id><activation><activeByDefault>true</activeByDefault></activation><properties><gpg.executable>gpg</gpg.executable><gpg.keyname>${GPG_KEY_NAME}</gpg.keyname><gpg.passphrase>${GPG_PASSPHRASE}</gpg.passphrase></properties></profile></profiles>
</settings>

配置好后,每次 push 或 pull request 到 master 分支时,都会出发 GitHub Actions 自动化构建、测试,并通过 maven-semantic-release 将 jar 上传到 Maven 中央库,并在项目的 GitHub Release 中自动生成更新日志。


  1. semantic-release
  2. 通过 GitHub Action 自动部署 Maven 项目
  3. 团队敏捷实践 —— 使用 semantic-release 自动管理发布版本

使用 maven-semantic-release 实现自动化发版相关推荐

  1. 基于travis和git tag 实现npm自动化发版

    最近又把烂尾的开源项目alfred-femine拾起来了,这个项目旨在开发一系列前端常用的alfred workflow,提供前端开发的查询效率.时隔这么久,再次搞起,希望自己能够一直维护下去,也欢迎 ...

  2. Jenkins 前端 自动化发版/CICD

    核心代码脚本: #!/bin/bash -il echo ${branch} echo ${branch} current=${branch} online="release" i ...

  3. 客户端单周发版下的多分支自动化管理与实践

    背景 目前,互联网产品呈现出高频优化迭代的趋势,需求方希望尽早地看到结果,并给予及时反馈,所以技术团队需要用"小步快跑"的姿势来做产品,尽早地交付新版本.基于以上背景,美团客户端研 ...

  4. Spark Release 2.0.0发版概序

    Spark2.0在2016年7月26日发布,因为工作中经常用到,所以对它关注比较多,正好今天"提前"下班,所以抽空翻译一下spark2.0发版概述,简单的介绍一下spark2.0的 ...

  5. 基于Jenkins和Kubernetes流水线实现应用的自动发版

    本文我们将基于Jenkins和Kubernetes流水线过程实现自动化构建Java应用,即把流水线的过程转换为pipeline语法,实现应用的自动发版. 一. 创建Java测试用例 本书为读者准备了一 ...

  6. 解决jenkins发版报错:JAR will be empty - no content was marked for inclusion

    解决:You have to use a classifier to attach supplemental artifacts to the project instead of replacing ...

  7. 官方剧透:1.11 发版前我们偷看了 Flink 中文社区发起人的聊天记录

    简介:自 2014 年正式开源, Flink 发展非常迅速,在 GitHub 上其访问量在 Apache 项目中位居前三.去年年底 Flink Forward Asia 2019 大会公布,仅仅 20 ...

  8. jenkins中通过git发版操作记录

    之前说到的jenkins自动化构建发版是通过svn方式,今天这里介绍下通过git方式发本的操作记录. 一.不管是通过svn发版还是git发版,都要首先下载svn或git插件. 登陆jenkins,依次 ...

  9. 每次发版都搞到晚上11点,我们能不能……

    " 将四持原则,融入到你的日常工作中,你将不会被「琐事」缠身." 在<持续交付 2.0>一书中,提到改善软件交付能力的「四持原则」. 它们分别是: 坚「持」少做, 「持 ...

最新文章

  1. ELK5.3环境部署
  2. [转]web.xml 中的listener、 filter、servlet 加载顺序及其详解
  3. 框架--NoHttp和OkHttp哪个好用,Volley和NoHttp哪个好用?
  4. 烂泥:mysql数据库使用的基本命令
  5. Linux是命令行吗,你真的了解Linux命令吗?
  6. linux安装最新php版本下载地址,服务器配置-使用Linux编译安装PHP指定版本
  7. 无线WIFI短信认证平台(互亿无线)
  8. 微信小程序登录小实例
  9. Hcse 交换知识点-3
  10. 企业级代码静态测试工具Helix QAC——关键特性
  11. python 查找excel标红的数据_excel表格如何快速给数据标红-如何将查找出的excel内容批量标记为红色?...
  12. 常用短信平台一览,记得收藏哦
  13. oracle-12514,Oracle错误 ORA-12514 解决方法
  14. 企业官网建设需要多少钱
  15. Gradle 1.12用户指南翻译——第五十章. 依赖管理
  16. 我的世界hmcl启动器登录教程
  17. android 下载apk安装后自动启动,下载apk并启动安装
  18. uniapp签到页面
  19. 手机qq java怎么安装不了怎么办啊_联通手机上QQ的方法及安装步骤
  20. 《程序员的自我修养—链接、装载与库》pdf书签,目录分享

热门文章

  1. Android实现有声计算器代码,有声语音计算器效果与代码
  2. Microsoft edge 主页被劫持的处理办法
  3. (转)前端开发面试题搜集大全–刷完能进bat
  4. 从NAACL2021到ACL2022:两个信息抽取SOTA的比较分析(PURE vs PL-Marker)
  5. 深度技术GHOST WIN7 SP1 2013 新春版
  6. 十年一觉电影梦:李安传
  7. ue4设置默认打开的地图和默认游戏模式
  8. linux沙箱隔离_360隔离沙箱在WINDOWS 10 的WSL下的沙箱逃逸
  9. NFT Insider #62:The Sandbox宣布与狮门影业达成合作,红杉资本继续扩大Web3领域投资
  10. HTML5游戏化互动学习平台,h5游戏平台_触摸型互动slg黄油手游