Gradle + GitHub Actions 自动发布项目至 Maven 仓库
摘要
文章内容核心是使用 Gradle 整合 GitHub Actions 自动化发布 Java 项目至 Maven 仓库。文章内是将项目发布至 sonatype 提供的仓库中。如果你需要自动化发布,或者需要将项目同步至 Maven 中央仓库请仔细阅读。
前期准备
- 可同步 Maven 中央仓库的门票,在 Issues Sonatype 上申请;
- OpenPGP 证书,需要同步至公共的服务器;
- 一个 Java Project;
- 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
中配置一些必要的参数。
以上的所有参数后面都会在 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]
其中 2B89E19F
为 SIGNING_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 仓库中确认是否已经发布成功。
项目链接

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
技术总监的忠告:精通那么多技术,你为何还是受不到重用?
这篇文章我们继续说架构师大刘的故事: 老田升职了,年薪涨到了百万级别! 这是大刘在加班搞技术攻坚的时候,听别的同事聊了那么一嘴。 大刘心里不是滋味儿。老田和大刘其实在这家公司之前就是同事了,老田能到这家公司,说起来还是大刘推荐的。 但是,在公司的这几年,老田越来越受领导赏识,到如今,晋升成功,赫然成了大刘的上司。大刘百思不得其解。 大刘和老田本身在前家公司都是高级程序员,前后脚跳槽到了现在这家公司。 大刘来的早,成了架构师。老田呢,技术本就不如大刘,被大刘拉来后,先是当了个高级工程师,只是为了避嫌,没跟大刘一个团队。 后来,老田被那时候的 Leader 赏识,做了带项目的组长,再后来,就是现在成功的晋升总监了。而大刘,好几年了却依然在架构师这岗位原地踏步,动弹不得。 大刘陷入了浓浓的迷茫,他自问自己工作态度毫无问题,做事情也兢兢业业。公司的技术攻关,经常也是大刘牵头搞定。公司的技术培训,作为架构师的大刘俨然是一个非常权威的大牛讲师。 就算是老田,也需要时不时去找大刘请教一些技术难题和技术方向。可是,即使这样,在公司技术领域造诣很深的大刘,却依然没有获得进身之阶,被老田压了一头。 大刘没...
- 下一篇
“12306”的架构到底有多牛逼?
关注我们,设为星标,每天7:30不见不散,架构路上与您共享 回复"架构师"获取资源 作者丨绘你一世倾城 来源:https://juejin.im/post/5d84e21f6fb9a06ac8248149 “ 每到节假日期间,一二线城市返乡、外出游玩的人们几乎都面临着一个问题:抢火车票! 12306 抢票,极限并发带来的思考 虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场景,相信大家都深有体会。 尤其是春节期间,大家不仅使用 12306,还会考虑“智行”和其他的抢票软件,全国上下几亿人在这段时间都在抢票。 “12306 服务”承受着这个世界上任何秒杀系统都无法超越的 QPS,上百万的并发再正常不过了! 笔者专门研究了一下“12306”的服务端架构,学习到了其系统设计上很多亮点,在这里和大家分享一下并模拟一个例子:如何在 100 万人同时抢 1 万张火车票时,系统提供正常、稳定的服务。 Github代码地址: https://github.com/GuoZhaoran/spikeSystem 大型高并发系统架构 高并发的系统架构都会采用分布式集群部署,服务上层有着层层负载均衡,并...
相关文章
文章评论
共有0条评论来说两句吧...