Android 托管 Github Action 发布 Github Packages ,实现 Mvn 免费自动化托管

news2024/11/7 22:44:42

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB中pinv函数用法

目录 语法 说明 示例 使用伪逆求解线性方程组 pinv的功能是得到矩阵的Moore-Penrose 伪逆。 语法 B pinv(A) B pinv(A,tol) 说明 B pinv(A) 返回矩阵 A 的 Moore-Penrose 伪逆。 B pinv(A,tol) 指定容差的值。pinv 将 A 中小于容差的奇异值视为零。 示例 使用伪逆…

DP31 买卖股票的最好时机(二)

DP31 买卖股票的最好时机(二) import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n in.nextInt();int [] p new int[n];int sum 0;for…

.NET Core WebApi第5讲:接口传参实现、数据获取流程、204状态码问题

一、接口传参实现 1、引入:通过网址上两个参数mod...和FID....,区分开要的是哪个板块里面的数据​​​​​ 2、传参实现:在方法的参数处定义STRING字符串 (1)传1个参数 2>运行代码,在网页上输入以“点…

为什么一定要学AI(Stable Diffusion)做设计?

在当今数字化时代,人工智能技术正在以前所未有的速度和规模改变着各行各业的工作方式和流程。 更多实操教程可以扫描下方,免费获取 而室内设计领域中,AI技术也正在迅速崛起,为设计师们带来了前所未有的便利和创作可能性&#xff0…

mysql密码过期问题处理

链接mysql报错 Your password has expired. To log in you must change it using a client that supports expired passwords; 1、打开mysql链接工具 LINUV bin目录 windows 打开mysql client 2、进入mysql命令框 输入旧密码 3、执行 mysql> set passwordpassword(12345…

灵动AI视频 —— 创意无界,视频新生

在这个瞬息万变的数字时代,每一帧画面都蕴含着无限可能。灵动AI视频,作为一款集智能、高效、创意于一体的视频编辑神器,正引领着视频创作的新潮流。 灵动ai视频用户端:灵动 AI-新一代AI创意生产力平台​编辑https://one.genceai.…

SPA——MVC 与 MVVM - 2024最新版前端秋招面试短期突击面试题【100道】

SPA——MVC 与 MVVM - 2024最新版前端秋招面试短期突击面试题【100道】 🌐 在现代前端开发中,单页面应用(SPA)以及不同的架构模式(如MVC和MVVM)是实现用户交互的关键概念。了解它们的优缺点以及如何应用&a…

Vue3+TypeScript+Vite 后台管理项目

一、前言 我将使用当前最新版本完成项目搭建,我会尽量将每个操作细节记录下来,并且解释原因,标明依据出处,这样即使大家脱离当前这个版本,跟着文章依然可以完成项目搭建,这篇文章也依然有他的价值&#xf…

知识竞赛活动用什么样的话筒或麦克风好呢

搞知识竞赛活动,话筒一般是需要的,从选手到主持人、评委甚至有些观众,每场活动用量不少。 市场上的麦克风五花八门,从价格低廉的入门款到高端专业设备,不胜枚举。这让很多用户在选择时感到无从下手。如何在众多产品中…

面向对象编程中类与类之间的关系(二)

目录 1.引言 2.泛化(继承)关系 3.实现关系 4.聚合关系 5.组合关系 6.依赖关系 7.关联关系 7.1. 单向关联 7.2. 双向关联 7.3.自关联 8.总结 1.引言 在面向对象设计模式中,类与类之间主要有6种关系,他们分别是&#xff…

贪心算法入门(一)

1.什么是贪心算法? 贪心算法是一种解决问题的策略,它将复杂的问题分解为若干个步骤,并在每一步都选择当前最优的解决方案,最终希望能得到全局最优解。这种策略的核心在于“最优”二字,意味着我们追求的是以最少的时间和…

MATLAB发票识别系统

课题介绍 该课题为基于MATLAB的发票识别系统。主要识别发票的编号。可定做发票的日期,金额等字段的识别。通过输入图片,校正,定位目标区域,分割,字符分割,模板匹配识别,得出结果。整个设计包含…

spark==windows启动spark集群

下载hadoop3.0.0 https://archive.apache.org/dist/hadoop/core/hadoop-3.0.0/ 下载spark3.5.3 Index of /dist/spark/spark-3.5.0 添加环境变量 HADOOP_HOME SPARK_HOME PATH中添加%HADOOP_HOME%\bin,%HADOOP_HOME%\sbin, %SPARK_HOME%\bin,%SPARK_HOME%\sbin, 启动mast…

(实战)WebApi第10讲:Swagger配置、RESTful与路由重载

一、Swagger配置 1、导入SwashBuckle.AspNetCore包 2、在.NET Core 5框架里的startup.cs文件里配置swagger 3、在.NET Core 6框架里的Program.cs文件里配置swagger 二、RESTful风格:路由重载,HttpGet()括号中加参数 (1)原则&…

【春秋云镜】CVE-2023-27179

CVE-2023-27179 CVE-2023-27179 是一个影响 Apache Doris 的漏洞。Apache Doris 是一款用于交互式分析的高性能数据库,特别适用于处理大规模的结构化数据。该漏洞属于权限提升漏洞,允许未授权用户以管理员身份执行敏感操作。 具体细节 漏洞类型&#…

chrome编辑替换js文件的图文教程

一、找到要修改替换的js文件 二、将文件保存到本地 三、在本地新建一个文件 路径最好跟你要替换的文件的路径保持一致, 四、选中js文件替换 回到原文件右击选择保存并覆盖 点击完保存并覆盖之后回到替换的新文件中,在自动生成的webpack文件中对文件进…

​CSS之三

CSS三大特性 CSS 有三个非常重要的三个特性:层圣性、继承性、优先级 层叠性 相同选择器给设置相同的样式,此时一个样式就会覆盖(层曼)另一个冲突的样式。层曼性主要解决样式冲突的问题 层叠性原则: - 样式冲突,遵循的原则是就近原则,哪个…

Generating /run/initramfs/rdsosreport.txt

Linux中遇到Generating /run/initramfs/rdsosreport.txt 第一步:首先输入 ls /dev/mapper 第二步:输入 xfs_repair /dev/mapper/centos-root -L 第三步:重启reboot 不说原因了,直接上解决方式: 第一步:首先…

Spark,Anconda在虚拟机实现本地模式部署

如果想要了解模式的概念部分,以及作用请看: Spark学习-CSDN博客 一.在虚拟机安装spark cd /opt/modules 把Anconda和Spark安装包拖拽进去: 解压: tar -zxf spark-3.1.2-bin-hadoop3.2.tgz -C /opt/installs 重命名&#x…

云原生开源开发者沙龙丨AI 应用工程化专场杭州站邀您参会

云原生开源开发者沙龙 AI 原生应用架构专场,邀您一起交流,探索 AI 原生应用的工程化落地! 活动简介 AI 驱动的应用程序开发、部署和运维,给应用带来了新的生命力和想象空间。但大部分开发者对 AI 应用的编程框架、可观测体系、网…