Gradle + GitHub Actions 自动发布项目至 Maven 仓库

Stella981
• 阅读 1075

摘要

文章内容核心是使用 Gradle 整合 GitHub Actions 自动化发布 Java 项目至 Maven 仓库。文章内是将项目发布至 sonatype 提供的仓库中。如果你需要自动化发布,或者需要将项目同步至 Maven 中央仓库请仔细阅读。

前期准备

  1. 可同步 Maven 中央仓库的门票,在 Issues Sonatype 上申请;
  2. OpenPGP 证书,需要同步至公共的服务器;
  3. 一个 Java Project;
  4. GitHub

关于同步门票部分可参考提供的链接,文章内主要叙述证书相关的内容。

OpenPGP 证书

因我使用的 Windows 操作系统这里使用 Gpg4win 工具生成同步证书。如果你使用的是 Mac 或者 Linux 操作系统可使用其它 GPG 工具如 GnuPG

安装 Gpg4win

下载地址 Gpg4win

生成证书

$ gpg --full-generate-key

运行上面的命令按照指示生成 RSA 的证书。

C:\Users\admin>gpg --full-generate-key
gpg (GnuPG) 2.2.23; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

... 省略部分 ...

public and secret key created and signed.

pub   rsa3072 2020-11-10 [SC] [expires: 2021-11-10]
      449B75F00B2DA482AB8D03E8493DA88E2B89E19F
uid                      kk70-blog (blog) <kevinz@weghst.com>
sub   rsa3072 2020-11-10 [E] [expires: 2021-11-10]

浏览证书

可以使用 gpg --list-secret-keys --keyid-format SHORT 命令查询证书列表。

C:\Users\admin>gpg --list-secret-keys --keyid-format SHORT
C:/Users/admin/AppData/Roaming/gnupg/pubring.kbx
------------------------------------------------
sec   rsa3072/2B89E19F 2020-11-10 [SC] [expires: 2021-11-10]
      449B75F00B2DA482AB8D03E8493DA88E2B89E19F
uid         [ultimate] kk70-blog (blog) <kevinz@weghst.com>
ssb   rsa3072/6B7BF2DA 2020-11-10 [E] [expires: 2021-11-10]

发布证书

gpg --keyserver hkps.pool.sks-keyservers.net --send-keys 2B89E19F

使用 gpg 命令将证书发布到公共服务器 2B89E19F 替换为自己证书的 keyid。可在 http://keys.gnupg.net/ 网站搜索自己发布的证书。

Gradle 项目配置

配置 Gradle 插件

plugins {
  id "maven-publish"
  id "signing"
}

要使用 Gradle 发布依赖至 Maven 仓库你至少需要 maven-publish 插件。如果需要发布依赖至 Maven 中央仓库还需要使用 signing 插件对依赖文件进行签名验证。

Gradle Publish 配置

ext {
  isReleasedVersion = !project.version.endsWith("-SNAPSHOT")
}

publishing {
  publications {
    mavenJava(MavenPublication) {
      from components.java
      artifact sourcesJar
      artifact javadocJar

      pom {
        description = "Yein Chaos Core"
        scm {
          connection = "scm:git:git@github.com:kevin70/chaos.git"
          developerConnection = "scm:git:ssh://github.com/kevin70/chaos.git"
          url = "https://github.com/kevin70/chaos"
        }
      }
    }
  }

  repositories {
    maven {
      credentials {
        username findProperty("ossrhUsername") ?: System.getenv("OSSRH_USERNAME")
        password findProperty("ossrhPassword") ?: System.getenv("OSSRH_PASSWORD")
      }

      if (!isReleasedVersion) {
        url "https://oss.sonatype.org/content/repositories/snapshots"
      } else {
        url "https://oss.sonatype.org/service/local/staging/deploy/maven2"
      }
    }
  }
}
  • isReleasedVersion 将快照版本与正式版本分开提交至不同的 Maven 仓库;
  • publishing.publications.mavenJava 需要同步的依赖资源;
    • artifact sourcesJar 需要发布的源码 jar 包;
    • artifact javadocJar 需要发布的 javadoc jar 包;
    • pom 自定义 pom.xml 文件内容。
  • publishing.repositories 发布的仓库配置;
    • maven.credentials Maven 仓库的认证信息;
    • maven.url Maven 仓库的 URL。

Gradle Singing 配置

signing {
  sign publishing.publications.mavenJava
}

将需要发布的内容签名 https://docs.gradle.org/current/userguide/signing_plugin.html

这里默认采用 Signatory credentials 签名认证方式。

Github Actions 配置

首先在 GitHub Project > Settings > Secrets 中配置一些必要的参数。

Gradle + GitHub Actions 自动发布项目至 Maven 仓库

以上的所有参数后面都会在 GitHub Workflow 中使用到。

  • OSSRH_USERNAME 是 sonatype 的登录用户名;
  • OSSRH_PASSWORD 是 sonatype 的登录密码;
  • SIGNING_KEY_ID 是 GPG 证书的 ID;
  • SIGNING_SECRET_KEY_RING_FILE 是 GPG 证书的的秘钥采用 BASE64 编码。

获取 SIGNING_KEY_ID

使用 gpg --list-secret-keys --keyid-format SHORT 命令获取 SIGNING_KEY_ID

$ gpg --list-secret-keys --keyid-format SHORT

C:\Users\admin>gpg --list-secret-keys --keyid-format SHORT
C:/Users/admin/AppData/Roaming/gnupg/pubring.kbx
------------------------------------------------
sec   rsa3072/2B89E19F 2020-11-10 [SC] [expires: 2021-11-10]
      449B75F00B2DA482AB8D03E8493DA88E2B89E19F
uid         [ultimate] kk70-blog (blog) <kevinz@weghst.com>
ssb   rsa3072/6B7BF2DA 2020-11-10 [E] [expires: 2021-11-10]

其中 2B89E19FSIGNING_KEY_ID

获取 SIGNING_SECRET_KEY_RING_FILE

将秘钥导出至文件 secring.gpg

$ gpg --export-secret-keys 2B89E19F > secring.gpg

将秘钥文件是二进制的我们需要将内容编码为 BASE64。因为我使用的 Windows 所以下面这个命令我是在 Git Bash 中运行的,如果你使用的 Mac 或 Linux 也可以直接运行如下的命令。

$ base64 secring.gpg > secring.gpg.b64

将编码好的文件 secring.gpg.b64 中的内容设置在 Secrets 中。

⚠️ 因为我生成的证书未设置密码,所以这里缺少了 passphrase 配置,如果你的证书是有设置密码的需要额外增加 passphrase 的配置。

GitHub Secrets 设置完成,接下来编写 GitHub Action Workflow。

GitHub Action Workflow

name: Chaos CI with Gradle

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      # 运行 JDK 配置
      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11

      # Gradle 缓存配置
      - name: Cache Gradle packages
        uses: actions/cache@v2
        with:
          path: ~/.gradle/caches
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
          restore-keys: ${{ runner.os }}-gradle
    
      # 给 gradlew 文件授权
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
    
      # 构建项目
      - name: Build with Gradle
        run: ./gradlew build

      # 将秘钥解码后将文件放置 ~/.gradle/secring.gpg
      - name: Decode
        run: |
          echo "${{secrets.SIGNING_SECRET_KEY_RING_FILE}}" > ~/.gradle/secring.gpg.b64
          base64 -d ~/.gradle/secring.gpg.b64 > ~/.gradle/secring.gpg
      
      # 发布项目
      - name: Publish
        run: ./gradlew publish -Psigning.keyId=${{secrets.SIGNING_KEY_ID}} -Psigning.password= -Psigning.secretKeyRingFile=$(echo ~/.gradle/secring.gpg)
        env:
          OSSRH_USERNAME: ${{secrets.OSSRH_USERNAME}}
          OSSRH_PASSWORD: ${{secrets.OSSRH_PASSWORD}}

当任务运行完成之后上 Maven 仓库中确认是否已经发布成功。


项目链接

https://github.com/kevin70/chaos

kk70 个人博客

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java中比较两个时间的差值
项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat
Wesley13 Wesley13
3年前
gradle配置本地mavn仓库 mavenLocal() 时的bug
最近在学习Gradle,在配置maven仓库时遇到一个很奇怪的问题。因为之前已经在自己机器上下载了一些maven的本地缓存,所有在使用gradle时想优先从本地的仓库中下载jar,查看了官方的userguide文档,发现其中有这么一段:大概意思是说使用mavenLocal()配置maven的本地仓库后,gradle默认会按以下顺序去查找本地的仓库
Stella981 Stella981
3年前
Maven 国内镜像(Maven下载慢的解决方法)
  Maven是当前流行的项目管理工具,但官方的库在国外经常连不上,连上也下载速度很慢。国内oschina的maven服务器很早之前就关了。今天发现阿里云的一个中央仓库,亲测可用。1<mirror2<idalimaven</id3<mirrorOfcentral</mirrorOf4
Stella981 Stella981
3年前
Maven命令将本地jar打包到maven仓库
一、背景日常开发中,常见的一种情况是在java项目的pom.xml文件中引入依赖版本信息,由于maven中央仓库没有这个jar,我们可以从其他地方下载下来,然后再使用打包方式将下载下来的jar包打包到maven仓库。二、示例1\.依赖ojabc6引入!在这里插入图片描述(https:/
Stella981 Stella981
3年前
Docker搭建私有镜像仓库
docker仓库的工作原理和maven的类似,他们都提供了提供了一个中央仓库,允许用户科技直接从中央仓库下载,同时我们也可以搭建自己的本地私有仓库。docker本地私有镜像仓库的优点:1.从私有仓库中下载节省网络带宽;2.从私有仓库中下载速度快,一般都是局域网络内部署;3.托管不对外的内部镜像;下面我们将完整的说明使用docker
Stella981 Stella981
3年前
Centos下运行gpg
在发布maven中央仓库的时候,需要gpg对jar进行签名其中用到gpg。在运行gpg–genkey命令时候卡主。Weneedtogeneratealotofrandombytes.Itisagoodideatoperformsomeotheraction(typeonthekeyboa
Wesley13 Wesley13
3年前
2分钟快速发布自己的项目供别人在pom里依赖
大家经常会在maven、gradle里依赖别人的项目或模块。大家知道,别人的项目都是发布在maven中央仓库的,要经历一系列的步骤方能上传成功,才能供别人依赖。!(https://static.oschina.net/uploads/img/202007/06131557_Knx5.png)这里要说一种简单方式,2分钟就让你的项目可以供大家使用。