GitHub Actions 之自动化发布 Maven 项目

news2025/2/28 15:39:14

开发开源数据中台项目 datacap 时,之前发布版本都是通过在本地编译并部署到 maven 中央仓库中,这样就导致是非自动化工程,于是通过搜索发现 samuelmeuli/action-maven-publish 这个 github 自动化工具可以帮助我们来做这些事情,本文主要详细讲解如何通过它进行自动化发布 maven 项目到 maven 中央仓库中。

必要条件

  1. 已经获得发布到中央仓库中的授权
  2. 在 github 代码仓库中包含授权的仓库
  3. OSSRH 相关的账号和密码
  4. GPG 签名
修改项目 pom 文件支持发布到中央仓库

假设我们已经在 github 中已经包含仓库,我们需要修改项目的 pom.xml 文件来支持发布,需要添加以下依赖:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>${plugin.maven.source.version}</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>jar-no-fork</goal>
            </goals>
        </execution>
    </executions>
</plugin>

使用 maven-source-plugin 可以帮助确保项目的源代码能够方便地被其他人获取和使用,从而促进了项目的协作和可维护性。发布到中央仓库中也是需要对 source 做一些检查,如果没有将无法进行发布成功。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>${plugin.maven.javadoc.version}</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <tags>
            <tag>
                <name>Description</name>
                <placement>test</placement>
                <head>description</head>
            </tag>
        </tags>
        <additionalOptions>-Xdoclint:none</additionalOptions>
        <failOnError>false</failOnError>
    </configuration>
</plugin>

使用 maven-javadoc-plugin 可以帮助确保项目的 API 文档能够方便地被其他人获取和使用,发布到中央仓库中也是需要对文档做一些检查,如果没有将无法进行发布成功。

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

使用 maven-gpg-plugin 可以提高项目的安全性和可信度,特别是在开源项目中,数字签名可以帮助用户验证下载的文件是否经过篡改。这一点尤为重要,每次的发布是签名是必须要通过的。

⚠️ 需要注意的是:在使用自动化工具的时候一定要配置

<configuration>
    <!-- Prevent `gpg` from using pinentry programs -->
    <gpgArguments>
        <arg>--pinentry-mode</arg>
        <arg>loopback</arg>
    </gpgArguments>
</configuration>

这样的话自动化工具才可以跳过手动输入签名密码的步骤,方便签名成功

<plugin>
    <groupId>org.sonatype.plugins</groupId>
    <artifactId>nexus-staging-maven-plugin</artifactId>
    <version>${plugin.maven.nexus.version}</version>
    <extensions>true</extensions>
    <configuration>
        <serverId>ossrh</serverId>
        <nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
        <autoReleaseAfterClose>true</autoReleaseAfterClose>
    </configuration>
</plugin>

使用 nexus-staging-maven-plugin 可以帮助你更轻松地管理 Maven 项目的发布,确保项目的发布过程正确、可靠、安全。通过它可以将项目自动化发布到中央仓库。

配置 GPG 签名信息

以下操作需要保证本地已经存在 gpg 签名

通过使用以下命令进行信息获取:

gpg --list-secret-keys

获取成功后返回类似如下代码:

[keyboxd]
---------
sec   ed25519 2023-10-15 [SC]
      E20C364D039BF231FC03BD30AFC85804B60F7E64
uid             [ 绝对 ] qianmoq (Devlive Software Foundation) <shicheng@devlive.org>
ssb   cv25519 2023-10-15 [E]

代码中的 E20C364D039BF231FC03BD30AFC85804B60F7E64 就是我们需要到的签名的 Key

然后通过该 Key 获取私钥,使用以下代码获取:

gpg -a --export-secret-keys E20C364D039BF231FC03BD30AFC85804B60F7E64

执行命令后会返回类似如下内容:

-----BEGIN PGP PRIVATE KEY BLOCK-----

lIYEZS***
=9lTo
-----END PGP PRIVATE KEY BLOCK-----

我们需要将返回的所有内容复制下来需要用到。

在 github 中配置项目信息

我们打开 github 项目,比如我们使用的是 datacap

465B2831-D83D-420C-A404-B095DA203022.png

点击顶部的 Settings 菜单,将会跳转到以下页面

733297B1-F688-4BED-BCB3-CB17E5F64CA6.png

接下来我们点击 Secrets and variables 菜单下的 Actions 进入配置页面

962AD1D2-D061-434A-B917-E782F512E5DC.png

点击 New repository secret 分别添加以下 4 个配置:

  • GPG_SECRET
  • GPG_PASSWORD
  • OSSRH_USERNAME
  • OSSRH_TOKEN

GPG_SECRET 中添加签名获取到的私钥,也就是 gpg -a --export-secret-keys E20C364D039BF231FC03BD30AFC85804B60F7E64 返回的结果

GPG_PASSWORD 输入 GPG 签名的密码(这个是在生成 GPG 签名填写的密码)

OSSRH_USERNAME 输入在 OSSRH 中的用户名

OSSRH_TOKEN 输入在 OSSRH 中的密码

编写发布 maven 自动化脚本

通过以上配置完成后,我们使用以下代码可以实现自动化发布项目的 maven 中央仓库

name: Publish via Maven Central

on:
  release:
    types: [ published ]

jobs:
  publish-maven-central:
    runs-on: ubuntu-latest
    steps:
      - name: Check out Git repository
        uses: actions/checkout@v4

      - name: Install Java and Maven
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'temurin'

      - name: Publish to the Maven Central Repository
        uses: samuelmeuli/action-maven-publish@v1
        with:
          maven_profiles: 'deploy'
          maven_goals_phases: 'clean deploy'
          maven_args: '-DskipTests'
          gpg_private_key: ${{ secrets.GPG_SECRET }}
          gpg_passphrase: ${{ secrets.GPG_PASSWORD }}
          nexus_username: ${{ secrets.OSSRH_USERNAME }}
          nexus_password: ${{ secrets.OSSRH_TOKEN }}

在以上脚本中我们使用的是在 github 中构建 Releases 的时候才会触发,当然用户可以根据自己的想法去改变触发时机,只需要修改

on:
  release:
    types: [ published ]

至此 GitHub Actions 之自动化发布 Maven 项目已经完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1280076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第 374 场 LeetCode 周赛题解

A 找出峰值 枚举 class Solution { public:vector<int> findPeaks(vector<int> &mountain) {int n mountain.size();vector<int> res;for (int i 1; i < n - 1; i)if (mountain[i] > mountain[i - 1] && mountain[i] > mountain[i 1…

基于搜索协议实现工业设备升级

目录 1、背景引入 2、技术分析 3、过程概述 4、服务器端流程 5、客户端流程 6、效果展示 7、源码 7.1 master&#xff08;主控&#xff09; 7.2 device&#xff08;设备&#xff09; 8、注意事项 1、背景引入 在工业生产中&#xff0c;设备的升级和维护是非常重要的…

JavaScript学习-1

01 基础用法 //index.html <body><!-- 行内JS --><button type"button" onclick"alert(hello)">按钮</button><!--内部JS--><script type"text/javascript">alert("你好");</script><…

Unity C++交互

一、设置Dll输出。 两种方式&#xff1a; 第一&#xff1a;直接创建动态链接库工程第二&#xff1a;创建的是可执行程序&#xff0c;在visual studio&#xff0c;右键项目->属性(由exe改成dll) 二、生成Dll 根据选项Release或Debug&#xff0c;运行完上面的生成解决方案后…

计网Lesson6 - IP 地址分类管理

文章目录 1. I P IP IP 地址定义2. I P v 4 IPv4 IPv4 的表示方法2.1 I P v 4 IPv4 IPv4 的分类编址法2.2 I P v 4 IPv4 IPv4 的划分子网法2.2.1 如何划分子网2.2.2 如何确定子网的借位数2.2.3 总结2.2.4 题目练习 2.3 I P v 4 IPv4 IPv4 的无分类编址法 1. I P IP IP 地…

kafka3.6.0部署

部署zk https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.9.1/apache-zookeeper-3.9.1.tar.gz tar -xf apache-zookeeper-3.9.1.tar.gz -C /apps cd /apps/ && ln -s apache-zookeeper-3.9.1 zookeeper 修改配置bash grep -vE ^$|^# conf/zo…

代码随想录算法训练营第四十一天 _ 动态规划_343. 整数拆分、96.不同的二叉搜索树、01背包问题。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 343. 整数拆分 动态规划五步曲&…

【接口测试】Apifox实用技巧干货分享

前言 不知道有多少人和我有着这样相似的经历&#xff1a;从写程序只要不报错就不测试&#x1f60a;&#xff0c;到写了程序若是有bug就debug甚至写单元测试&#xff0c;然后到了真实开发场景&#xff0c;大哥和你说&#xff0c;你负责的功能模块的所有接口写完要测试一遍无误在…

python——进程常用功能

Python的multiprocessing模块提供了强大的并行处理能力&#xff0c;以下是几个功能的详细解释&#xff1a; join(): 在multiprocessing中&#xff0c;join方法用于阻塞主进程直到指定的进程终止。这对于确保所有子进程在程序结束前完成其工作是很有用的。deamon(): 在multipro…

16.字符串处理函数——字符串长度函数

文章目录 前言一、题目描述 二、解题 程序运行代码 总结 前言 本系列为字符串处理函数编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 二、解题 程序运行代码 #include<stdio.h> #include<string.h> int main() {char str[ ]"0123\0456…

根据关键词写作文章的软件,根据标题写作文章的工具

在当今信息化时代&#xff0c;人工智能技术的飞速发展&#xff0c;智能AI写作工具逐渐成为文案创作者的得力助手。这些工具不仅能够根据标题迅速生成文章&#xff0c;而且在提高创作效率的同时&#xff0c;也为我们节省了大量时间和精力。 人工智能的基本原理&#xff1a;人工智…

如何查看Microsoft Office 使用期限

1.进入到 Office 软件的安装目录&#xff08;******\Microsoft Office\Office&#xff09; ## 以管理员身份打开 Windows PowerShell输入以下命令&#xff0c;回车 cscript ospp.vbs /dstatusREMAINING GRACE 一行表示激活剩余天数&#xff08;括号内是换算成的剩余分钟数…

15.字符串处理函数——字符串连接函数

文章目录 前言一、题目描述 二、解题 程序运行代码 总结 前言 本系列为字符串处理函数编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 二、解题 程序运行代码 #include<stdio.h> #include<string.h> int main() {char dest[20] "12345…

【Linux】第二十五站:深入理解文件系统

文章目录 一、前言二、认识硬件----磁盘1.基本介绍2.磁盘的存储构成3.磁盘的逻辑结构4.回归到硬件 三、文件系统1.划分2.Block group(1)Data blocks(2)inode Table(3)Block Bitmap(4)inode Bitmap(5)Group Descriptor Table(GDT)(6)Super Block 3.总结4.一些其他问题5.如何理解…

音视频的功耗优化

前言 在应用中&#xff0c;录制与音视频模块往往是高耗能的模块&#xff0c;设备容易发热&#xff0c;影响体验。 什么是功耗优化 手机有多个耗电模块&#xff0c; SOC(CPU&#xff0c;GPU&#xff0c;DDR)&#xff0c;Display&#xff0c;Audio&#xff0c;Video&#xff0…

loguru的简单使用

详细使用&#xff1a;Table of contents — loguru documentation 【1】日志的级别 日志级别默认分为6种 1、NOTSET (0)2、DEBUG (1)3、INFO (2)4、WARNING (3)5、ERROR (4)6、CRITICAL (5) logging 执行时输出大于等于设置的日志级别的日志信息&#xff0c;如设置日…

zemax之初级像差理论与像差校正——慧差

通过上节介绍&#xff0c;我们已经知道在轴上视场产生的球差是旋转对称的像差。在进行光学系统设计时&#xff0c;同时需要保证轴上物点和轴外物点的成像质量。轴外物点成像时会引入轴外像差&#xff0c;即轴外视场产生的慧差&#xff08;coma aberration&#xff09; 1.慧差概…

STM32-SPI 中断

SPI协议 1.1 SPI总线介绍 SPI接口是Motorola &#xff08;motorola | Smartphones, Accessories & Smart Home Devices&#xff09;首先提出的全双工三线/四线同步串行外围接口采用主从模式&#xff08;Master Slave&#xff09;架构。 时钟由Master控制&#xff0c;在时钟…

采购业务中的主数据

目录 一、维护BP主数据业务伙伴BP的概念业务伙伴涉及的表业务伙伴维护操作一次性客商数据 二、维护物料主数据三、维护采购信息记录四、与FI相关集成点物料主数据的价格控制评估类与科目确定 一、维护BP主数据 业务伙伴BP的概念 在S/4HANA中&#xff0c;SAP引入了BP(Business…

【最通用版FPGA 实现 SPI 驱动】

最近研究了一下SPI协议的FPGA实现&#xff0c;发现网上很多大佬分享的方法都是针对某一特定的flash芯片或者某一传感器芯片来设计电路结构的。所以想根据SPI&#xff08;Serial Peripheral Interface&#xff09;的基本通讯协议实现一个通用版的SPI Master驱动。SPI在嵌入式领域…