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: Release

on:
  push:
    tags:
      - '*'

jobs:
  release:
    name: Github Release
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-java@v3
        with:
          distribution: 'zulu'
          java-version: 21
      - name: Build APK
        uses: gradle/gradle-build-action@v2
        with:
          arguments: app:assembleRelease
      - name: Create Release
        uses: ncipollo/release-action@v1
        with:
          artifacts: "app/build/outputs/apk/release/app-release.apk"
          token: ${{ secrets.GITHUB_TOKEN }}

  publish:
    name: Publish To Github Packages
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          distribution: 'zulu'
          java-version: 21
      - uses: gradle/gradle-build-action@v2
      - name: Publish Package
        run: ./gradlew publish
        env:
          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.release

                group = PROJ_GROUP
                artifactId = PROJ_ARTIFACTID
                version = PROJ_VERSION

                pom {
                    name = PROJ_NAME
                    description = PROJ_DESCRIPTION
                    url = PROJ_VCSURL
                    licenses {
                        license {
                            name = "The Apache License, Version 2.0"
                            url = "https://www.apache.org/licenses/LICENSE-2.0.txt"
                        }
                    }
                    developers {
                        developer {
                            id = DEVELOPER_ID
                            name = DEVELOPER_NAME
                        }
                    }
                    scm {
                        connection = PROJ_ISSUETRACKERURL
                        developerConnection = PROJ_VCSURL
                        url = PROJ_WEBSITEURL
                    }
                }
            }
        }
    }
}

以下就是对应上述 publish.gradle 的根目录下的 gradle.properties 配置,核心就是前面四个参数,简单来说就是 com.shuyu:gsyvideoplayer:10.0.0 这样的对应

PROJ_GROUP=com.shuyu
PROJ_VERSION=10.0.0

PROJ_NAME=gsyvideoplayer
PROJ_ARTIFACTID=gsyvideoplayer

PROJ_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=GSYVideoPlayer

DEVELOPER_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 即可实现自动发布,除了引用麻烦一些,其实整体都还不错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/908055.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Javaweb+MySQL实现学生选课系统

学生选课系统设计报告 一、阶段:开发前的设置和思考 1.1 题目要求: 建立一个学生选课系统, 编写应用程序完成系统开发。 建立基本表: 学生(学号,姓名,性别,年龄,系别&#xff0…

centos7 安装python3.9.4,解决import ssl异常

本篇文章介绍如何在centos7中安装python3.9.4(下文简称python3),解决python3安装后import ssl模块失败问题,为什么我要在centos7中安装python呢,因为我需要在服务器中跑python数据处理脚本。 安装python3同时解决import ssl模块失败问题总共包…

Springboot 整合 Java DL4J 实现情感分析系统

🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,…

计算机网络串联——打开网站的具体步骤

参与浏览网站的重要名词 1、MAC地址也叫硬件地址、物理地址。那这个东西就是设备你出厂的时候就会带有的,详情跳转,其构成如下: MAC地址用16进制表示,就是一共有12位,前六位他们会像一个国际的这种专门组织去申…

<项目代码>YOLOv8 夜间车辆识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

xilinx vitis 更换硬件平台——ZYNQ学习笔记5

1、重新生成硬件信息 2、选择带有bit信息 3、设施路径和名字 4、打开更新硬件选项 5、选择新的硬件信息 6、打开系统工程界面 7、复位硬件信息 更新完毕

【温酒笔记】SPI

1. SPI基础 物理层 片选线 :选中拉低SCK: 时钟线MOSI:主出从入MISO:主入从出 协议层 CPOL:时钟极性:空闲电平高低 CPHA:时钟相位:第一个还是第二个边沿采样 2. 示例SPI-W25Q16 (见模组分类下文章)

Web应用性能测试工具 - httpstat

在数字化时代,网站的性能直接影响用户体验和业务成功。你是否曾经在浏览网页时,遇到加载缓慢的困扰?在这个快速变化的互联网环境中,如何快速诊断和优化Web应用的性能呢?今天,我们将探讨一个强大的工具——h…

Transformer 论文精读与完整代码复现【Attention Is All You Need】

本文将在一开始快速概括模型的主体,论文的贡献以及重要图表,然后使用 PyTorch 复现完整且与原论文对齐的 Transformer(位于后半段)。通过阅读文章能够了解: 单头与多头的区别?掩码到底掩了什么?…

element-plus按需引入报错AutoImport is not a function

官网文档:快速开始 | Element Plus webpack配置 // webpack.config.js const AutoImport require(unplugin-auto-import/webpack) const Components require(unplugin-vue-components/webpack) const { ElementPlusResolver } require(unplugin-vue-components…

《Python网络安全项目实战》项目2 Python基础练习_总复习(2)

《Python网络安全项目实战》项目2 Python基础练习_总复习(2) 期末总复习(2) 班级: 姓名: 实训成绩: 任务单成绩: 利用%d,%f占位符格式化输出。 Name “小明” age 16 height 1.7355774 ___________________________…

自扶正救生艇,保障水上救援的安全卫士_鼎跃安全

在应急事件中,自扶正救生艇能够发挥关键的救援和保障作用,确保救援人员和被困人员的生命安全,尤其在极端天气或突发水上事故中展现出明显优势。 在救援过程中如果遭遇翻船,救生艇能够迅速恢复正常姿态,确保救援人员不会…

SAR_ADC介绍和建模

SAR-ADC介绍以及建模 一、介绍 1、工作原理 采用多个时钟周期,将DAC的模拟输出VDAC逐次逼近此采样模拟输入,获得数字输出结果。采用二进制搜索或者折半查找算法 2、工作过程 1:信号与VREF/2相比,结‘1,代表信号>…

什么是 OpenTelemetry?

OpenTelemetry 定义 OpenTelemetry (OTel) 是一个开源可观测性框架,允许开发团队以单一、统一的格式生成、处理和传输遥测数据(telemetry data)。它由云原生计算基金会 (CNCF) 开发,旨在提供标准化协议和工具,用于收集…

Nginx 实现动态封禁IP,详细教程来了

Nginx 实现动态封禁IP,详细教程来了 需求环境准备设计方案在操作系统层面,配置 iptables,来拦截指定 IP 的网络请求在 Web 服务器层面,通过 Nginx 自身的 deny 选项或者 lua 插件配置 IP 黑名单在应用层面,在处理请求之…

11月3日笔记(根据凭据提权)

用户凭据操作 枚举 Unattended 凭据 无人值守(Unattended)安装允许应用程序在不需要管理员关注下自动安装。无人值守安装的问题是会在系统中残留一些配置文件,其中可能包含本地管理员的用户名和密码,常见的路径如下。 C:\sysprep.inf C:\syspreg\sysp…

如何解决permission denied - invalid PVE ticket (401)

PVE8.2访问出现:permission denied - invalid PVE ticket (401),解决方法: 1、重启动PVE,然后登录。 去浏览器设置页面,清空cokie,然后再登录。如果问题仍然存在,就按下面的方法进一步确定。 2、另外一种…

驱动——线程断链和信息获取

实验环境&#xff1a;win7 x32 断链&#xff1a; #include <ntifs.h>NTSTATUS EnumThread(ULONG ulPid, ULONG ulTid) {PEPROCESS pProcessAddr PsGetCurrentProcess();PLIST_ENTRY pHeadlink (PLIST_ENTRY)((ULONG)pProcessAddr 0xb8);PLIST_ENTRY pNextlink pHead…

打羽毛球为什么要在气膜馆?—轻空间

在现代健身环境中&#xff0c;羽毛球作为一项受欢迎的运动&#xff0c;不仅能够锻炼身体&#xff0c;还能增强社交互动。选择在气膜馆打羽毛球&#xff0c;能为运动爱好者带来全新的体验和诸多优势。 优越的空间设计 气膜馆的最大特点是其独特的空间设计。与传统的体育馆相比&a…

计算机毕业设计Python+大模型新闻自动分类 新闻舆情预测 新闻语料情感分析 新闻推荐系统 朴素贝叶斯分类算法 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…