Android 托管 Github Action 发布 Github Packages ,实现 Mvn 免费自动化托管
自从多年前 JCenter 关闭服务之后,GSY 项目版本就一直发布在 Jitpack 上,如今每个月也都有大概 10w+ 左右下载,但是近年来时不时就会出现历史版本丢失的问题,而且有时候还不是某个具体版本丢失,而是版本里的某几个依赖突然 404 了,例如 #6645 / #5973 问题所示,所以在找不到原因的情况,只能寻找多一个版本托管的平台做 backup。

在对比了 MavenCenter 和 Github Packages 之后,感觉还是 Github Packages 更加符合我这个懒人的要求,首先不需要注册新平台帐号,体系还在 Github 内,通过 Github Action 就可以实现自动构建,之后根据 tag 将 aar 包发布到 Github Packages ,整体来说还是比较轻量。
昨天评论区有人说介绍下这个流程,所以这里就简单梳理一下,其实并不复杂。
开始
使用 Github Action 我记得以前也介绍过,相对来说也挺简单,只需要在自己 Github 的开源项目下创建 .github/workflows 目录,然后编写脚本就可以完成接入,另外针对 Github Actions 官方还提供了 marketplace 用于开发者提交或者引用别人写好的 aciton ,所以很多时候开发者在使用 Github Actions 时,其实会变成了在 marketplace 里挑选和组合 action 的场景。
以下是 GSY 项目在 .github/workflows/release.yml 下的 action 配置,这里简单介绍一下:
- on push tags :表示在提交任意 tag 时触发 action 执行,你也可以自己定制规则
- jobs 下有两个任务,一个是 release 用于构建一个 demo apk,一个是 publish 用于发布 Github Packages
- release 下:
runs-on: ubuntu-latest指定运行环境- 使用
actions/checkout@v3切换到指定 tag - 使用
actions/setup-java@v3指定 jdk 版本 - 使用
gradle/gradle-build-action@v2指定 gradle 环境并执行命令app:assembleRelease - 使用
ncipollo/release-action@v1将编译好的 apk 发布到 github release
- publish 下:
- 给予同样逻辑,不同之处在于通过 gradle 环境,直接执行
./gradlew publish将 library aar 发布到 github packags 的 mvn
- 给予同样逻辑,不同之处在于通过 gradle 环境,直接执行
name: Releaseon:push:tags:- '*'jobs:release:name: Github Releaseruns-on: ubuntu-lateststeps:- uses: actions/checkout@v3- uses: actions/setup-java@v3with:distribution: 'zulu'java-version: 21- name: Build APKuses: gradle/gradle-build-action@v2with:arguments: app:assembleRelease- name: Create Releaseuses: ncipollo/release-action@v1with:artifacts: "app/build/outputs/apk/release/app-release.apk"token: ${{ secrets.GITHUB_TOKEN }}publish:name: Publish To Github Packagesruns-on: ubuntu-latestpermissions:contents: readpackages: writesteps:- uses: actions/checkout@v4- uses: actions/setup-java@v4with:distribution: 'zulu'java-version: 21- uses: gradle/gradle-build-action@v2- name: Publish Packagerun: ./gradlew publishenv:GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
上述的
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}是通过 github 通用 ci 的automatic-token-authentication实现 ,在每个 workflow job 执行时,GitHub 会自动创建一个唯一的GITHUB_TOKEN密钥在 workflow 中进行身份验证,Token 的权限仅限于包含workflow 的仓库。
可以看到一套下下来,基本不需要你写什么 action 脚本,之后就是在每个需要发布的 library 的 build.gralde 添加脚本 ,例如这里 https://maven.pkg.github.com/ 是固定前缀,用户是 CarGuo,repo 名为 GSYVideoPlayer 的 publishing 配置,而 credentials 只需要在 action 运行时读取系统变量配置即可:
apply plugin: "maven-publish"publishing {repositories {maven {name = "gsyvideoplayer"url = "https://maven.pkg.github.com/CarGuo/GSYVideoPlayer"credentials {username = System.getenv("GITHUB_ACTOR")password = System.getenv("GITHUB_TOKEN")}}}
}
剩下的就是发布 mvn 的常规配置,这部分应该无需多言了,简单举个例子,例如写一个通用的 publish.gradle 读取 gradle.properties 配置,然后将这个 publish.gradle apply 到上面的 build.gralde 脚本里:
apply plugin: "maven-publish"android {publishing {singleVariant('release') {withSourcesJar()withJavadocJar()}}
}afterEvaluate {publishing {publications {release(MavenPublication) {from components.releasegroup = PROJ_GROUPartifactId = PROJ_ARTIFACTIDversion = PROJ_VERSIONpom {name = PROJ_NAMEdescription = PROJ_DESCRIPTIONurl = PROJ_VCSURLlicenses {license {name = "The Apache License, Version 2.0"url = "https://www.apache.org/licenses/LICENSE-2.0.txt"}}developers {developer {id = DEVELOPER_IDname = DEVELOPER_NAME}}scm {connection = PROJ_ISSUETRACKERURLdeveloperConnection = PROJ_VCSURLurl = PROJ_WEBSITEURL}}}}}
}
以下就是对应上述 publish.gradle 的根目录下的 gradle.properties 配置,核心就是前面四个参数,简单来说就是 com.shuyu:gsyvideoplayer:10.0.0 这样的对应
PROJ_GROUP=com.shuyu
PROJ_VERSION=10.0.0PROJ_NAME=gsyvideoplayer
PROJ_ARTIFACTID=gsyvideoplayerPROJ_WEBSITEURL=https://github.com/CarGuo/GSYVideoPlayer
PROJ_ISSUETRACKERURL=https://github.com/CarGuo/GSYVideoPlayer/issues
PROJ_VCSURL=https://github.com/CarGuo/GSYVideoPlayer.git
PROJ_DESCRIPTION=android video player
PROJ_USER_MAVEN=GSYVideoPlayerDEVELOPER_ID=guo
DEVELOPER_NAME=guoshuyu
DEVELOPER_EMAIL=xxxxxx@.com
如果一个 project 有多个 module 需要发布定义,可以在每个 moudle 的
gradle.properties配置单独配置PROJ_NAME和PROJ_ARTIFACTID变量
在此之后只需要在 git 提交时提交某个 tag ,github 就会自动触发 action 执行,然后构建 aar 包并发布到 github packages 。
当然,这里有一个很让人菊紧的问题,那就是 PROJ_NAME 和 PROJ_ARTIFACTID 必须是小写,别问我为什么,我也不知道,stackoverflow 上大家都这么说,如果有大写,会出现如图 Received status code 422 from server: Unprocessable Entity 这样的错误,改成全小写才成功通过:

成功发布后,就可以在你的 Packages 上看到提交的包了,之后就可以开始引用,不过 github packags 引用 mvn 也有一个让人菊紧的问题。

引用 github mvn ,主要是需要在你的 allprojects{ repositories { 下增加 https://maven.pkg.github.com 的引用,如下代码所示,这里主要是需要 credentials 授权,是的,github packages 上就算你的 mvn 包是 public 的,它也需要你授权,而且目前 github 的口径是,不考虑不授权支持,而授权主要是通过生成一个用户 token 来完成。
maven {url 'https://maven.pkg.github.com/CarGuo/GSYVideoPlayer'credentials {username = '你的github账户'password = '你的生成 token'}
}
生成 token 理论上就是在 Github 右上角点击头像,然后 Settings - Developer Settings - Personal access tokens - tokens (classic) - Generate new token(classic 即可生成,这里需要注意:
- 记得过期时间选择永久
- 如果只是为了 mvn,就选一个
read:packages即可


详细生成自己 token 的方式可见:https://docs.github.com/zh/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens
到这里基本完成了 github ci 发布 mvn 和引用的工作了,其实抛开 gradle mvn 配置部分,其实整个流程还是简单的,首先 github 账号和 github 项目本来就存在的,只需要配置下 action 和 gradle 指向 github pkg 即可完成发布,之后只需要在每次需要发布时提交 tag 即可实现自动发布,除了引用麻烦一些,其实整体都还不错。
相关文章:
Android 托管 Github Action 发布 Github Packages ,实现 Mvn 免费自动化托管
自从多年前 JCenter 关闭服务之后,GSY 项目版本就一直发布在 Jitpack 上,如今每个月也都有大概 10w 左右下载,但是近年来时不时就会出现历史版本丢失的问题,而且有时候还不是某个具体版本丢失,而是版本里的某几个依赖突…...
火山引擎VeDI数据服务平台:在电商场景中,如何解决API编排问题?
01 平台介绍 数据服务平台可以在保证服务高可靠性和高安全性的同时,为各业务线搭建数据服务统一出口,促进数据共享,为数据和应用之间建立了一座“沟通桥梁”。 同时,解决数据理解困难、异构、重复建设、审计运维困难等问题&#x…...
【每日C/C++问题】
一、 结构体和联合体有什么区别?能否在声明过程当中缺省名字?(需要写清楚使用方法) 结构体的各个成员占用不同的内存空间,总大小是所有成员大小之和(结构体字节对齐): typedef str…...
layaair做帧动画,等待一秒之后移动坐标,坐标位置明明相同,执行的时候却会抖动。
如下图:我将1秒后面的位置与0秒的坐标位置设置为一样,然后再第二秒的时候再设置位置移动。也就是想实现这个效果,小狗先停在这里一秒,然后再开始行走。现在的问题是停在这里依然抖动一下,也就是根本就停不住。还是会变…...
SAP分包业务中能否应用后继物料?
近期物流用户在工作中遇到新的问题。在分包业务中的原材料后继(物料主数据设定非连续标识及后继物料)不成功问题。对于未知应用,需要先研究期可行性,与问题或故障不同,如果系统本身就不支持,再多分析测试也…...
【数据结构】二叉树——判断是否为完全二叉树
一、思路 有完全二叉树的解释 我们想要判断二叉树是否为完全二叉树 我们可以用队列来实现 我们先将根节点入队列 再将根节点出队列,判断取出节点是否为空、 若不为空将该节点的左右节点入队列 左右节点为空也入队列 若为空则停止入队列 然后判断队列中是否有 NUL…...
FFmpeg 4.3 音视频-多路H265监控录放C++开发十. 多线程控制帧率。循环播放,QT connect 细节,
在前面,我们总结一下前面的代码。 在 FactoryModeForAVFrameShowSDL 构造函数中 init SDL。 通过 QT timerevent机制,通过startTimer(10);每隔10ms,就会调用timerEvent事件。 在timerEvent事件中,真正的去 读取数据,…...
近百万奖金!2024 Web3.0 创新大赛重磅来袭!
10月30日,中国互联网协会与香港Web3.0协会共同组织举办的2024 Web3.0 创新大赛在上海举行启动会,宣布大赛正式在DataFountain竞赛平台(简称DF平台,http://www.datafountain.cn)启动上线。 大赛面向社会各界征集参赛团队…...
gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架
背景介绍 gRPC 是一种现代开源高性能远程过程调用 (RPC) 可以在任何环境中运行的框架。它可以有效地连接服务 在数据中心内和数据中心之间,具有对负载平衡、跟踪、 运行状况检查和身份验证。它也适用于最后一英里 分布式计算,用于…...
cmake系列-怎么构建不同的C++程序目标文件(可执行程序、动态库、静态库)
目录 生成可执行程序生成动态库生成静态库 我们编写的C代码不仅仅只是为了生成可执行程序,有的时候可能是为了生成动态库或者静态库,那么如果用cmake来构建的话,应该怎么做呢,怎么指定是生成可执行程序,还是生成动态库…...
使用ffmpeg和mediamtx模拟多通道rtsp相机
首先下载ffmpeg,在windows系统上直接下载可执行文件,并配置环境变量即可在命令行当中调用执行。 下载地址: https://ffmpeg.org/再在github上下载mediamtx搭建rtsp服务器,使用ffmpeg将码流推流到rtsp服务器。 下载地址࿱…...
windows系统类似于linux的nohup命令后台启动jar服务
一、首先新建一个后缀名为.bat文件 二、将jar包放在与jar包同一个路径下 三、编写.bat文件 echo off start javaw -Xms512m -Xmx1024m -XX:PermSize256m -XX:MaxPermSize512m -XX:MaxNewSize512m -jar xxxxx-22900.jar >> StartupLog.log 2>&1 & exit 四…...
2024 Rust现代实用教程 流程控制与函数
文章目录 一、if流程控制与match模式匹配1.流程控制2. IF流程控制3.match 表达式 二、循环与break continue以及与迭代的区别1.Rust中的循环Loops2.break && continue3.迭代4.循环与迭代的不同 三、函数基础与Copy值参数传递1.函数的基础知识2.Copy by value 四、函数值…...
stm32入门教程--USART外设 超详细!!!
目录 简介 什么是UART? 什么是USART? 简介 USART(Universal Synchron /Asynchronous Receiver /Transmitter)通用同步/异步收发器 1、USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧…...
再探“构造函数”(2)友元and内部类
文章目录 一. 友元‘全局函数’作友元‘成员函数’作友元‘类‘作友元 内部类 一. 友元 何时会用到友元呢? 当想让(类外面的某个函数/其它的类)访问 某个类里面的(私有或保护的)内容时,可以选择使用友元。 友元提供了一种突破&a…...
ffmpeg+vue2
一、安装依赖 npm install ffmpeg/core ffmpeg/ffmpeg "ffmpeg/core": "^0.10.0", "ffmpeg/ffmpeg": "^0.10.1",二、配置ffmpeg 安装好插件以后,需要配置一下代码,否则会报错: 1、在vue.config.js…...
基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法
基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法 基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法引言YOLOv10简介目标检测轨迹跟踪测距算法实际应用结论 基于深度学习YOLOv10的电动二轮车目标检测、轨迹跟踪、测距算法 二轮电动车的目标检测、跟踪…...
鸿蒙ArkTS中的image组件
开发文档很详尽,就在DevEco中的API参考,可以随时调出来进行学习。 在鸿蒙官网也有非常详尽的资料,地址:开发说明-API参考概述 - 华为HarmonyOS开发者 (huawei.com) 这里,就学习image组件的一般用法以及使用SVG图标和字…...
LeetCode 684.冗余连接:拓扑排序+哈希表(O(n)) 或 并查集(O(nlog n)-O(nα(n)))
【LetMeFly】684.冗余连接:拓扑排序哈希表(O(n)) 或 并查集(O(nlog n)-O(nα(n))) 力扣题目链接:https://leetcode.cn/problems/redundant-connection/ 树可以看成是一个连通且 无环 的 无向 图。 给定往…...
让空气净化器“很听话”-置入NRK3502离线语音控制芯片
一、产品市场 随着智能家居的快速发展,人们对家居环境的舒适度与健康性要求日益提升,空气净化器作为改善室内空气质量的重要设备,其智能化升级变得尤为关键。让空气净化器“很听话”,不再仅仅是一个遥不可及的设想,而…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
