用 Github 实现组件自动发布

2022-03-26 09:57:15 浏览数 (1)

大家肯定都有这样的需求,将自己的组件发布出去给开发者使用,但苦于经常使用的 JCenter 已挂,自己搭个 Nexus 还要买服务器,看了 MavenCentral 的发布流程,简直痛苦到发麻,现在的 JitPack 还可以凑合着用用,但是发布要去网站手动点 Get it,而且最近还遇到了在 JitPack 发布插件无法发布的问题,种种问题都让我觉得现在的组件发布都非常的蛋疼。

我们这次的目标是:在有限的资源里把事情做到极致!!!

一、Github 现有方案

Github 是可以通过仓库来充当 Maven 镜像源的,只需要将 aar 上传到仓库。例如,我们的仓库地址是 https://github.com/MRwangqi/Maven,并且 aar 是放置在 main 分支,则 Maven 镜像地址为

https://raw.githubusercontent.com/MRwangqi/Maven/main

我们只需要在项目的 build.gradle 按如下进行引入镜像源即可:

代码语言:javascript复制
repositories {
   google()
   // 引入 github 仓库的镜像源
   maven{
        url "https://raw.githubusercontent.com/MRwangqi/Maven/main"
   }
}

然后再引入自己的依赖即可愉快的进行玩耍了,我的 checkPlugin 插件就是这么玩的

二、方案

看了上述 Github 的现有方案,是不是觉得很麻烦? 他有如下几个问题:

  1. 需要先将组件发布到本地
  2. 然后将组件复制拷贝到 Maven 仓库
  3. 然后 git 提交组件到仓库

解决这些问题之前,我们需要了解一下 Github Actions :

GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可让您自动化构建、测试和部署

我们可以通过自动化构建的方式,构建出 aar,然后将 aar 发布到 maven 那个仓库,思路已经定下来了,那就开干。

1、创建 Actions

Github Actions 提供了很多现成的模板,我们可以创建个Android CI 的模板来看看构建一个 apk 需要做哪些操作

在点击 Configure 即可进入 yml 配置界面:

这里我不会去讲解 workflow 的用法,因为讲解太多就脱离了文章的主题,如果要学习语法作用的话,建议移步至 workflow 文档

其实我们根据上图的命令就能看出来, run 后面的就是执行命令,./gradlew build 就是构建我们项目的命令,那我们替换成 ./gradlew assembleDebug 不就是执行打包构建了吗?确实,构建项目就是这么如此的简单。

2、构建组件

从上面创建 Android CI 了解到,执行命令即可执行构建,那么,我们构建组件不就可以通过 ./gradlew publish来发布了嘛!确实如此,我们只需要对组件进行小小的改造,打开组件的 build.gradle,进行如下的配置:

代码语言:javascript复制
plugins {
    ...
    id 'maven-publish'
}

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                from components.release
                // 配置组件的 GAV
                groupId = 'com.codelang.jitpack'
                artifactId = 'hook-test'
                version = '1.0'
            }
        }
        repositories {
            maven {
                // 指明组件发布到项目工程的 /build/repo 目录
                url = "../build/repo"
            }
        }
    }
}

这其实是一个很基本的组件发布配置,但这里我指明了下发布组件的位置,目的是在组件发布后可以通过相对路径拿到组件,进行接下来的组件上传操作。

那么,我们的 workflow 就可以改成:

接下来,我们要寻找一下,如何将构建后的组件发布到另一个仓库

3、组件发布

敲起我的键盘就在 google 一阵乱搜 Actions,别说,还真搜到一个,https://github.com/s0/git-publish-subdir-action ,该库介绍:

This GitHub Action will take any subdirectory in your repository, and push it as the contents of a git branch to a repository and branch of your choosing, either over SSH or to the current repo.

简单来讲就是该 Action 可以将当前仓库指定的某个目录下的文件上传到另一个仓库

这不就巧了嘛,正好上面构建组件的时候指定了路径为 build/repo,然后再根据该库提供的示例 demo,那么我们的 workflow 就可以写成:

很 nice,写起来简直没压力,但这个地方需要配置一下私钥,如何生成 git ssh 可以查看该文章 https://www.jianshu.com/p/0a41903252a3,根据该文章将自己的公钥配置到 Github,然后查看下私钥 id_rsa 的内容:

需要注意的是,---BESIN RSA 这些也是要复制的,然后我们打开组件仓库对 SSH_PRIVATE_KEY 进行如下配置:

接下来,我们只需要 run workflow 即可:

我们可以查看 build 的整个过程,在 Deploy 发布过程中可以看见,我们已经发布成功:

然后我们去 https://github.com/MRwangqi/Maven 仓库看下,aar 已经成功被成功发布:

需要注意的是:

  • git-publish-subdir-action 一定要配置下 CLEAR_GLOBS_FILE: ".clear-target-files",不然,默认情况下,他会删除你 maven 仓库里面非 git 目录的所有文件,.clear-target-files 文件的内容为需要删除的目录,我是随意配置了个目录

三、总结

我们可以给 Github Actions 配置触发规则,不过默认的 Android CI 配置就有,只要 Push 代码到仓库就会执行该 workflow,然后发布组件到指定的目录,然后将目录下的所有文件提交到远程仓库,即实现了自动发布组件的功能。

大家可以直接抄我的 workflow 部分,然后只需要更改下 repo 地址是你们自己的仓库地址,然后配置下 SSH_PRIVATE_KEY 私钥即可,还有记住,不要忘了在组件仓库配 .clear-target-files 文件

我的 workflow 文件地址:https://github.com/MRwangqi/MessageHook/blob/master/.github/workflows/android.yml

0 人点赞