Gradle + GitHub Actions 自動發佈項目至 Maven 倉庫

摘要

文章內容核心是使用 Gradle 整合 GitHub Actions 自動化發佈 Java 項目至 Maven 倉庫。文章內是將項目發佈至 sonatype 提供的倉庫中。若是你須要自動化發佈,或者須要將項目同步至 Maven 中央倉庫請仔細閱讀。html

前期準備

  1. 可同步 Maven 中央倉庫的門票,在 Issues Sonatype 上申請;
  2. OpenPGP 證書,須要同步至公共的服務器;
  3. 一個 Java Project;
  4. GitHub

關於同步門票部分可參考提供的連接,文章內主要敘述證書相關的內容。java

OpenPGP 證書

因我使用的 Windows 操做系統這裏使用 Gpg4win 工具生成同步證書。若是你使用的是 Mac 或者 Linux 操做系統可以使用其它 GPG 工具如 GnuPGgit

安裝 Gpg4win

下載地址 Gpg4wingithub

生成證書

$ gpg --full-generate-key

運行上面的命令按照指示生成 RSA 的證書。redis

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 命令查詢證書列表。shell

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/ 網站搜索本身發佈的證書。ubuntu

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 發佈的倉庫配置;ssh

    • 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 中配置一些必要的參數。

Secret Parameters

以上的全部參數後面都會在 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 我的博客

相關文章
相關標籤/搜索