当前位置: 首页 > news >正文

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
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_NAMEPROJ_ARTIFACTID 变量

在此之后只需要在 git 提交时提交某个 tag ,github 就会自动触发 action 执行,然后构建 aar 包并发布到 github packages 。

当然,这里有一个很让人菊紧的问题,那就是 PROJ_NAMEPROJ_ARTIFACTID 必须是小写,别问我为什么,我也不知道,stackoverflow 上大家都这么说,如果有大写,会出现如图 Received status code 422 from server: Unprocessable Entity 这样的错误,改成全小写才成功通过:

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

image-20241031104914180

引用 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事件中,真正的去 读取数据&#xff0c…...

近百万奖金!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服务器。 下载地址&#xff1…...

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离线语音控制芯片

一、产品市场 随着智能家居的快速发展,人们对家居环境的舒适度与健康性要求日益提升,空气净化器作为改善室内空气质量的重要设备,其智能化升级变得尤为关键。让空气净化器“很听话”,不再仅仅是一个遥不可及的设想,而…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...