前言

要把本人的 JAVA 我的项目公布到 Maven 地方仓库上,这个过程十分的麻烦,而且因为 Maven 地方仓库的严谨性,每次公布都须要登录到Nexus网站手动进行流程确认,并不反对纯命令行式的部署,导致无奈做到真正的CI/CD,为了补救这一点,我抓包剖析了一下Nexus API并且开发了一个Github Action(maven-nexus-release)用于主动的CloseRelease,从而达到真正的全自动部署。

  • 效果图
曾经有公布 jar 包到地方仓库的老司机应该都明确公布 jar 包有多麻烦,没有公布过然而想把本人开源我的项目公布到Maven地方仓库的能够先参考下我之前的一篇文章:公布 jar 包到 maven 地方仓库

应用

首先最好是对 Github Action 有肯定的理解,如果不理解也没关系,能够通过我之前的文章疾速过一遍:Github Actions 尝鲜

筹备

托管在 Github 上的 Maven 我的项目

须要调整pom.xmlmaven-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]      992BB9305698C72B846EF4982A6B618785DD7899uid                 [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 中

  1. 进入 Github 我的项目主页,而后找到 Settings 选项。
  2. 进入Secrets菜单
  3. 把刚刚筹备好的秘钥一一创立
    在左边有New secret按钮用于创立秘钥,将刚刚的秘钥内容创立并给定对应的名称,示例:

最终 Secrets 如下:

编写 Github Action 配置文件

在我的项目根目录下新建.github/workflows/deploy.yml文件,内容如下:

name: deployon:  # 反对手动触发构建  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等干货常识。