文章內容核心是使用 Gradle 整合 GitHub Actions 自動化發佈 Java 項目至 Maven 倉庫。文章內是將項目發佈至 sonatype 提供的倉庫中。若是你須要自動化發佈,或者須要將項目同步至 Maven 中央倉庫請仔細閱讀。html
關於同步門票部分可參考提供的連接,文章內主要敘述證書相關的內容。java
因我使用的 Windows 操做系統這裏使用 Gpg4win 工具生成同步證書。若是你使用的是 Mac 或者 Linux 操做系統可以使用其它 GPG 工具如 GnuPG。git
下載地址 Gpg4win。github
$ 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
plugins { id "maven-publish" id "signing" }
要使用 Gradle 發佈依賴至 Maven 倉庫你至少須要 maven-publish
插件。若是須要發佈依賴至 Maven 中央倉庫還須要使用 signing
插件對依賴文件進行簽名驗證。緩存
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。signing { sign publishing.publications.mavenJava }
將須要發佈的內容簽名 https://docs.gradle.org/current/userguide/signing_plugin.html。
這裏默認採用 Signatory credentials 簽名認證方式。
首先在 GitHub Project > Settings > Secrets
中配置一些必要的參數。
以上的全部參數後面都會在 GitHub Workflow 中使用到。
OSSRH_USERNAME
是 sonatype 的登陸用戶名;OSSRH_PASSWORD
是 sonatype 的登陸密碼;SIGNING_KEY_ID
是 GPG 證書的 ID;SIGNING_SECRET_KEY_RING_FILE
是 GPG 證書的的祕鑰採用 BASE64 編碼。使用 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
。
將祕鑰導出至文件 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。
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 倉庫中確認是否已經發布成功。