經過GitHub Action自動部署Maven項目

前言

要把本身的 JAVA 項目發佈到 Maven 中央倉庫上,這個過程很是的麻煩,並且因爲 Maven 中央倉庫的嚴謹性,每次發佈都須要登陸到Nexus網站手動進行流程確認,並不支持純命令行式的部署,致使沒法作到真正的CI/CD,爲了彌補這一點,我抓包分析了一下Nexus API而且開發了一個Github Action(maven-nexus-release)用於自動的CloseRelease,從而達到真正的全自動部署。前端

  • 效果圖
已經有發佈 jar 包到中央倉庫的老司機應該都明白髮布 jar 包有多麻煩,沒有發佈過可是想把本身開源項目發佈到 Maven中央倉庫的能夠先參考下我以前的一篇文章: 發佈 jar 包到 maven 中央倉庫

使用

首先最好是對 Github Action 有必定的瞭解,若是不瞭解也不要緊,能夠經過我以前的文章快速過一遍:Github Actions 嚐鮮java

準備

託管在 Github 上的 Maven 項目

須要調整pom.xmlmaven-gpg-plugin插件的配置,示例:git

<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的帳號和密碼。github

gpg private key

Base64編碼的 gpg 私鑰,經過命令行導出:docker

  • 列出祕鑰
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,這裏示例中的是2A6B618785DD7899apache

  • 導出私鑰
gpg --armo --export-secret-keys 2A6B618785DD7899

注意私鑰是從-----BEGIN PGP PRIVATE KEY BLOCK-----一直到-----END PGP PRIVATE KEY BLOCK-----,而不是僅僅是中間這一段文本。ubuntu

gpg passphrase

在生成 gpg 祕鑰的時候會須要輸入一個短密碼,應該還記得吧。服務器

將祕鑰配置到 Github Secrets 中

  1. 進入 Github 項目主頁,而後找到 Settings 選項。
  2. 進入Secrets菜單
  3. 把剛剛準備好的祕鑰一一建立
    在右邊有New secret按鈕用於建立祕鑰,將剛剛的祕鑰內容建立並給定對應的名稱,示例:

最終 Secrets 以下:
maven

編寫 Github Action 配置文件

在項目根目錄下新建.github/workflows/deploy.yml文件,內容以下:oop

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,而且支持HTTPHTTPS抓包,感興趣的能夠 Star 一下。

我是 MonkeyWie,歡迎掃碼👇👇關注!不按期在公衆號中分享 JAVAGolang前端dockerk8s等乾貨知識。

wechat

相關文章
相關標籤/搜索