【Github-Action】GithubAction 环境下,如何将临时生成的文件推送至指定分支。

通过这篇文章你可以掌握如何将github action 环境下临时生成的文件推送至指定分支,并且可以打开利用github开放的api做各种强大或有趣的事情的视野和思路。

如果你对github-action感兴趣,还可以看这篇文章, 这篇文章教会你如何开发Github Action,并且让你明白它是什么,怎么用,如何做到的。如何开发一个action

如何将临时生成的文件推送至指定分支

  • 场景分析
  • 核心代码
  • 检查action 运行的历史
  • 前置知识
  • 开发步骤详解
    • 1. 获取特定分支的最后一次提交 SHA
    • 2. 创建 Blobs(base64 编码)
    • 3. 创建一个定义了文件夹结构的树
    • 4. 创建提交
    • 5. 更新分支引用
  • 最后

场景分析

  • 问题:什么时候需要这样子的功能?
  • 解答:当时我开发社区贡献统计Action的时候,会生成一个svg图片,但是为了让更多人能够复用这个工具,又节约一笔服务器的运营成本。

核心代码

先抛出全部代码,然后在后续把这段代码的实现讲清楚。

 try {// 1. 获取特定分支的最后一次提交 SHAconst branchResponse = await Axios.get(`/branches/${branch}`);const lastCommitSHA = branchResponse.data.commit.sha;console.log("lastCommitSHA", lastCommitSHA);// 2. 创建 Blobs(base64 编码)const createBlob = async (content, encoding) => {const blobResponse = await Axios.post("/git/blobs", {content: content,encoding: encoding});return blobResponse.data.sha;};const jsonSHA = await createBlob(Buffer.from(JSON.stringify(contributors)).toString("base64"),"base64");const pngSHA = await createBlob(imageContent.toString("base64"), "base64");// 3. 创建一个定义了文件夹结构的树const createTree = async (baseTreeSHA, blobs) => {const tree = blobs.map(blob => {return {path: blob.path,mode: "100644",type: "blob",sha: blob.sha};});const treeResponse = await Axios.post("/git/trees", {base_tree: baseTreeSHA,tree: tree});return treeResponse.data.sha;};const treeSHA = await createTree(lastCommitSHA, [{ path: pngPath, sha: pngSHA },{ path: jsonPath, sha: jsonSHA }]);console.log("treeSHA", treeSHA);// 4. 创建提交const createCommit = async treeSHA => {const commitResponse = await Axios.post("/git/commits", {message: commitMessage,author: {name: committerName,email: committerEmail},parents: [lastCommitSHA],tree: treeSHA});return commitResponse.data.sha;};const newCommitSHA = await createCommit(treeSHA);// 5. 更新分支引用await Axios.patch(`/git/refs/heads/${branch}`, {sha: newCommitSHA});} catch (error) {console.log("遇到错误", error);}

检查action 运行的历史

历史信息地址

在这里插入图片描述

前置知识

每一个接口都可以翻阅文档来查看参数配置。

https://docs.github.com/en/rest/git/refs?apiVersion=2022-11-28在这里插入图片描述以下两种接口的写法是等价的。

await octokit.request('PATCH /repos/{owner}/{repo}/git/refs/{ref}', {owner: 'OWNER',repo: 'REPO',ref: 'REF',sha: 'aa218f56b14c9653891f9e74264a383fa43fefbd',force: true,headers: {'X-GitHub-Api-Version': '2022-11-28'}
})
 await Axios.patch(`/git/refs/heads/${branch}`, {sha: newCommitSHA});

开发步骤详解

1. 获取特定分支的最后一次提交 SHA

console.log("lastCommitSHA", lastCommitSHA);

2. 创建 Blobs(base64 编码)

封装了一个createBlob 函数,用于将图片文件和json文件生成blob

    const createBlob = async (content, encoding) => {return sha;};const jsonSHA = await createBlob(Buffer.from(JSON.stringify(contributors)).toString("base64"),"base64");const pngSHA = await createBlob(imageContent.toString("base64"), "base64");

3. 创建一个定义了文件夹结构的树

创建我们需要提交的commit,指定这个commit需要提交的文件变更。
treeSHA里面包含了两个文件,以数组的形式配置sha和path。
在这里插入图片描述

    const createTree = async (baseTreeSHA, blobs) => {return sha;};const treeSHA = await createTree(lastCommitSHA, [{ path: pngPath, sha: pngSHA },{ path: jsonPath, sha: jsonSHA }]);console.log("treeSHA", treeSHA);

4. 创建提交

这边就是配置几个参数,就跟我们平常的git提交习惯差不多,需要有账号邮箱,message信息。只是我们不需要关心变更的文件tree以及parentCommitSha,通过第一步的lastCommitSHA,拿来直接用就好了。

   console.log("lastCommitSHA", lastCommitSHA);
  const createCommit = async treeSHA => {const commitResponse = await Axios.post("/git/commits", {message: commitMessage,author: {name: committerName,email: committerEmail},parents: [lastCommitSHA],tree: treeSHA});return commitResponse.data.sha;};const newCommitSHA = await createCommit(treeSHA);

5. 更新分支引用

这边的branch可以暴露可配置的变量,

  await Axios.patch(`/git/refs/heads/${branch}`, {sha: newCommitSHA});

最后

写的够详细了吧,绝对有用吧,写了也是花了不少精力的,文章和你看了这么久的仓库总该点赞吧。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JaveWeb教程】(18) MySQL数据库开发之 MySQL数据库设计-DDL 如何查询、创建、使用、删除数据库数据表 详细代码示例讲解

目录 2. 数据库设计-DDL2.1 项目开发流程2.2 数据库操作2.2.1 查询数据库2.2.2 创建数据库2.2.3 使用数据库2.2.4 删除数据库 2.3 图形化工具2.3.1 介绍2.3.2 安装2.3.3 使用2.2.3.1 连接数据库2.2.3.2 操作数据库 2.3 表操作2.3.1 创建2.3.1.1 语法2.3.1.2 约束2.3.1.3 数据类…

064:vue中一维数组的全选、全不选、反选(图文示例)

第061个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

Type-C PD充电器受电端sink诱骗取电汇总:小家电应用5V9V12V15V20V28V

小家电产品、美容产品、电动产品等升级采用Type-C接口,在Type-C接口上使用Type-C取电芯片,即可使用快速充电器的5V、9V、12V、15V、20V供电,无需再配充电器,各类品牌的充电器都可以支持。目前充电器常见的USB-PD功率为&#xff1a…

k8s的存储卷、数据卷

容器内的目录和宿主机目录进行挂载。 容器在系统上的生命周期是短暂的。 k8s用控制器创建的pod。delete相当于重启。容器的状态也会恢复到初始状态。一旦恢复到初始状态,所有的后天编辑的文件都会消失 容器和节点之间创建一个可以持久化保存容器内文件的存储卷。…

QML实现的图片浏览器

很久之前实现了一个QWidget版本的图片浏览器:基于Qt5的图片浏览器QHImageViewer 今天用QML也实现一个,功能差不多: ●悬浮工具栏 ●支持图片缩放、旋转、还原、旋转、拖动。 ●拖动图片时,释放鼠标图片会惯性滑动。 ●支持左右翻页查看文件夹中的图片。 ●支持保存图片至本…

Linux网络编程(一-网络相关知识点)

目录 一、网络相关知识简介 二、网络协议的分层模型 2.1 OSI七层模型 2.2 TCP/IP五层模型 2.3 协议层报文间的封装与拆封 三、IP协议 3.1 MAC地址 3.2 IP地址 3.3 MAC地址与IP地址区别 一、网络相关知识简介 互联网通信的本质是数字通信,任何数字通信都离…

D55XT100-ASEMI电机专用整流桥D55XT100

编辑:ll D55XT100-ASEMI电机专用整流桥D55XT100 型号:D55XT100 品牌:ASEMI 封装:DXT-4 平均正向整流电流(Id):55A 最大反向击穿电压(VRM):1000V 产品引…

02.构建和使用的大型语言模型(LLMs)阶段

我们为什么要建立自己的LLMs?LLM从头开始编码是了解其机制和局限性的绝佳练习。此外,它还为我们提供了必要的知识,可以保留或微调现有的开源LLM架构,以适应我们自己的特定领域的数据集或任务。 研究表明,在建模性能方面,定制(LLMs为特定任务或领域量身定制的)可以胜过…

最新版CleanMyMac X4.14.7智能清理mac磁盘垃圾工具

CleanMyMac X是一款专业的Mac清理软件,可智能清理mac磁盘垃圾和多余语言安装包,快速释放电脑内存,轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件,修复系统漏洞,一键扫描和优化Mac系统,…

RPA财务机器人在厦门市海沧医院财务管理流程优化汇总的应用RPA全球生态 2024-01-05 17:27 发表于河北

目前国内外研究人员对于RPA机器人在财务管理流程优化领域中的应用研究层出不穷,但现有研究成果主要集中在财务业务单一领域,缺乏财务管理整体流程一体化管控的研究。RPA机器人的功能绝非单一的财务业务处理,无论从自身技术发展,或…

112.Qt中的窗口类

我们在通过Qt向导窗口基于窗口的应用程序的项目过程中倒数第二步让我们选择跟随项目创建的第一个窗口的基类, 下拉菜单中有三个选项, 分别为: QMainWindow、QDialog、QWidget如下图: 常用的窗口类有3个 在创建Qt窗口的时候, 需要让自己的窗口类继承上述三个窗口类的…

软路由之爱快基于L2TP 实现

申明:本文仅针对国内SSTP,适用于国内的游戏加速,禁止一切利用该技术的翻墙行为。 相信很多接触过爱快的人都需要连接L2TP或PPTP,本文主要介绍通过爱快iKuai的L2TP 来实现异地组网。 一、准备工作 1、爱快 v3.x 2个(免…