前言
要把自己的 JAVA 專案釋出到 Maven 中央倉庫上,這個過程非常的麻煩,而且由於 Maven 中央倉庫的嚴謹性,每次釋出都需要登入到Nexus
網站手動進行流程確認,並不支援純命令列式的部署,導致無法做到真正的CI/CD
,為了彌補這一點,我抓包分析了一下Nexus API
並且開發了一個Github Action
(maven-nexus-release)用於自動的Close
和Release
,從而達到真正的全自動部署。
- 效果圖
已經有釋出 jar 包到中央倉庫的老司機應該都明白髮布 jar 包有多麻煩,沒有釋出過但是想把自己開源專案釋出到Maven
中央倉庫的可以先參考下我之前的一篇文章:釋出 jar 包到 maven 中央倉庫
使用
首先最好是對 Github Action 有一定的瞭解,如果不瞭解也沒關係,可以通過我之前的文章快速過一遍:Github Actions 嚐鮮
準備
託管在 Github 上的 Maven 專案
需要調整pom.xml
中maven-gpg-plugin
外掛的配置,示例:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 這個configuration必須配置,用於gpg非互動式密碼輸入 -->
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</plugin>
Nexus 使用者名稱和密碼
登入到https://oss.sonatype.org
的賬號和密碼。
gpg private key
Base64
編碼的 gpg 私鑰,通過命令列匯出:
- 列出祕鑰
gpg --list-secret-keys --keyid-format LONG
------------------------------------------------
sec rsa4096/2A6B618785DD7899 2020-11-05 [SC]
992BB9305698C72B846EF4982A6B618785DD7899
uid [ultimate] monkeyWie <liwei-8466@qq.com>
ssb rsa4096/F8E9F8CBD90028C5 2020-11-05 [E]
找到用於釋出 jar 包的 key,這裡示例中的是2A6B618785DD7899
。
- 匯出私鑰
gpg --armo --export-secret-keys 2A6B618785DD7899
注意私鑰是從-----BEGIN PGP PRIVATE KEY BLOCK-----
一直到-----END PGP PRIVATE KEY BLOCK-----
,而不是僅僅是中間這一段文字。
gpg passphrase
在生成 gpg 祕鑰的時候會需要輸入一個短密碼,應該還記得吧。
將祕鑰配置到 Github Secrets 中
- 進入 Github 專案主頁,然後找到 Settings 選項。
- 進入
Secrets
選單 - 把剛剛準備好的祕鑰一一建立
在右邊有New secret
按鈕用於建立祕鑰,將剛剛的祕鑰內容建立並給定對應的名稱,示例:
最終 Secrets 如下:
編寫 Github Action 配置檔案
在專案根目錄下新建.github/workflows/deploy.yml
檔案,內容如下:
name: deploy
on:
# 支援手動觸發構建
workflow_dispatch:
release:
# 建立release的時候觸發
types: [published]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# 拉取原始碼
- uses: actions/checkout@v2
# 安裝JDK環境
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
# 設定Maven中央倉庫配置
- name: Set up Apache Maven Central
uses: actions/setup-java@v1
with:
java-version: 1.8
server-id: releases
# Nexus使用者名稱環境變數
server-username: MAVEN_USERNAME
# Nexus密碼環境變數
server-password: MAVEN_CENTRAL_TOKEN
# gpg短密碼環境變數
gpg-passphrase: MAVEN_GPG_PASSPHRASE
# gpg私鑰
gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }}
# 推送jar包至maven中央倉庫
- name: Publish to Apache Maven Central
# 執行maven deploy命令
run: mvn clean deploy
# 環境變數設定
env:
# Nexus使用者名稱,如果覺得不想暴露也可以配置到secrets中
MAVEN_USERNAME: xxx
# Nexus密碼
MAVEN_CENTRAL_TOKEN: ${{ secrets.MAVEN_CENTRAL_TOKEN }}
# gpg短密碼
MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
# Nexus自動部署
- name: Release on nexus
uses: monkeyWie/maven-nexus-release@v1
with:
# Nexus使用者名稱
maven-repo-server-username: xxx
# Nexus密碼
maven-repo-server-password: ${{ secrets.MAVEN_CENTRAL_TOKEN }}
把程式碼推送到 Github 上,就可以看到對應的Action
了,上面示例中有兩種方式來觸發構建:
- 手動觸發
通過 Github 可以手動的觸發構建,方便測試,操作如下圖: - 釋出 release 時自動觸發
在 Github 專案中建立 release,會自動的觸發構建,適用於專案穩定之後。
後記
以上步驟都在我的專案proxyee中通過驗證,另外maven-nexus-release專案還是剛起步,功能可能不夠完善,大家如果有什麼好的想法和建議歡迎提出 issue 和 pr。
順便小小的安利下proxyee
,它是基於netty
編寫的 HTTP 代理伺服器,支援代理HTTP
+HTTPS
+WebSocket
,並且支援HTTP
和HTTPS
抓包,感興趣的可以 Star 一下。
我是MonkeyWie,歡迎掃碼??關注!不定期在公眾號中分享JAVA
、Golang
、前端
、docker
、k8s
等乾貨知識。