大家肯定都有这样的需求,将自己的组件发布出去给开发者使用,但苦于经常使用的 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 的现有方案,是不是觉得很麻烦? 他有如下几个问题:
- 需要先将组件发布到本地
- 然后将组件复制拷贝到 Maven 仓库
- 然后 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,进行如下的配置:
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