今日(きょう)(さわ)がしく(たわむ)れ生きる人々の漫画映画(まんがえいが)

Maven Central Publishing

准确来说,这篇文章简要介绍一下使用 Gradle 以及 GitHub Actions 来把 相对简单的 [1] Java 项目打包发布到 Maven Central 上的流程。

域名认证

请跟随 这里的教程 认证自己 Java package 所用到的域名。基本上:

  1. 在 Sonatype 的 JIRA 系统上注册一个账号。

  2. OSSRH [2] 中创建一个 Issue (登录后,用教程里的 这个链接 )。

    1. 之后跟随 Bot 即可。如果你拥有此域名,那么你需要设置一个 TXT 记录; 如果你用的是 io.github.* 之类的,那你需要新建一个 Repo。

      Add a DNS TXT record to your domain with the text: OSSRH-<你的 Issue 编号>.

      Please read https://central.sonatype.org/faq/how-to-set-txt-record/ Edit this ticket and set Status to Open.

      里面的 OSSRH-<你的 Issue 编号> 例如是 OSSRH-78049 ,Bot 都会给出来。

  3. 教程上说需要 less than 2 business days ,我的经历是:

    Created: 02/09/22 04:31 PM

    Resolved: 02/09/22 04:47 PM

    (大概都是 Bot 自动化了。)

    总之等待一封把 Issue 标为 Resolved 的邮件,随后就可以进行下一步了。

Gradle Setup

样例放在这里 Reactor Locks ,是个很小的库,比较适合用作演示。使用的 Gradle 版本为 6.8 。 未说明的话,下面的文件都放在项目根目录下。

添加 Gradle 插件

build.gradle 开头的 plugins 里添加 maven-publishsigning

plugins {
    // ...

    id 'maven-publish'
    id 'signing'

    // ...
}

没有 sourceCompatibilitytargetCompatibility 的请添加上。

Javadoc 配置

Maven Central 强制要求项目提供 Javadoc。

我们将 Gradle 配置分成几个文件,在 build.gradle 最后添加:

apply from: 'javadoc.gradle'

接下来编辑 javadoc.gradle ,我直接抄了 Reactor Core 的写法,这里就不复制粘贴上来了( 抄的内容如链接所示 )。 改完了用 ./gradlew javadoc 或者 ./gradlew javadoc 测试一下。有报错先改过来。

Publishing 配置

配置文件

同样, build.gradle 最后添加 publish.gradle ,然后可以参考 这里的写法 把项目相关信息全部填上。

GPG 密钥

不介绍太多,可参考 Working with PGP Signatures 。

你需要:

  1. 安装 GPG

  2. 使用 gpg --gen-key 命令生成一个密钥对。

  3. 找到生成的密钥对的 keyid 。可用 gpg --list-keys <密钥对应的邮箱> 命令查看,例如:

    $ gpg --list-keys 'central@example.com'
    pub   rsa3072 2021-06-23 [SC] [expires: 2023-06-23]
    CA925CD6C9E8D064FF05B4728190C4130ABA0F98
    uid           [ultimate] Central Repo Test <central@example.com>
    sub   rsa3072 2021-06-23 [E] [expires: 2023-06-23]
    

    里面的例如 CA925CD6C9E8D064FF05B4728190C4130ABA0F98 这一串就是 keyid

  4. 将公钥上传到 key server:

    $ gpg --keyserver keyserver.ubuntu.com --send-keys CA925CD6C9E8D064FF05B4728190C4130ABA0F98
    
  5. 在使用 GitHub Actions 时我们需要导出私钥,这里先不介绍。

GitHub Actions 配置

可参考 这里的 build.yml ,需要更改的地方是 JDK 的版本( java-version: 一行)。

注意我们这里用到了 environment: 'Maven Publishing' ,环境名需要严格对应之后创建的 Environment。 另外,此实例配置将 Actions 限制到了 release 分支上,并且只能手动到 Actions 里 Run workflow。

创建 Environment

到 GitHub 项目的 Settings -> Environments -> New environment 输入上面的环境名。

创建后,在 Deployment branches 里让环境可以并仅可应用于 release 分支。

随后我们要向环境里添加 MAVEN_USERNAME MAVEN_PASSWORD SIGNING_KEY_ID SIGNING_PASSPHRASE SIGNING_SECRET_KEY 这五个环境变量。

前两个的话,请在 https://s01.oss.sonatype.org (或是其它网址,如果仓库又迁移了的话)登录。 右上角用户名点开,从 Profile 里进到 User Token 界面。点击 Access User Token 创建新的 Token, 把用户名(短的一串?)作为 MAVEN_USERNAME 添加到环境中,长的一串 MAVEN_PASSWORD

后三个的话,还记得 GPGkeyid 吗? SIGNING_KEY_IDkeyid后八位 , 例如 CA925CD6C9E8D064FF05B4728190C4130ABA0F980ABA0F98SIGNING_PASSPHRASE 如果在生成密钥时指定了 pass phrase 的话请填进去。

SIGNING_SECRET_KEY 需要导出。使用命令:

$ gpg --export-secret-keys --armor CA925CD6C9E8D064FF05B4728190C4130ABA0F98
-----BEGIN PGP PRIVATE KEY BLOCK-----

1234567890Abc...
...
-----END PGP PRIVATE KEY BLOCK-----

请把 CA925CD6C9E8D064FF05B4728190C4130ABA0F98 换为对应的 keyid ,将输出的从 -----BEGIN PGP PRIVATE KEY BLOCK----------END PGP PRIVATE KEY BLOCK----- (包括) 复制,作为 SIGNING_SECRET_KEY

测试

把项目 build.gradle 里的 version 设为 SNAPSHOT(即 0.1.0-SNAPSHOT 诸如此类,只需以 -SNAPSHOT 结尾均可)。 Push 到 release 分支上,到 GitHub 项目上的 Actions 页面。 All workflows -> Build and Publish 然后 Run workflow 选择 Branch: release ,点 Run workflow

正式发布

同上。 Push 到 release 分支上,到 GitHub 项目上的 Actions 页面。 All workflows -> Build and Publish 然后 Run workflow 选择 Branch: release ,点 Run workflow

但是,在 Workflow 跑完之后,我们还需要到 https://s01.oss.sonatype.org (或是其它网址,如果仓库又迁移了的话) 里面去 Close 然后 Release。

评论