Node.js + Axios 上传附件到 Gitee 仓库指定 Release

news2024/9/9 0:55:06

在软件开发过程中,自动化发布流程是提升效率的关键环节之一。本文将介绍如何使用 Node.js 和 Axios 库来自动化地向 Gitee 仓库的最新版本中上传发布包。通过读取项目中的 package.json 文件,获取版本信息,并自动将构建好的包文件上传到 Gitee 的对应版本发布中。

Node.js + Axios + Gitee API

环境准备

首先,确保你的开发环境中已经安装了 Node.js。同时,我们需要安装几个 npm 包来帮助我们完成这个任务:

  • axios:用于发送 HTTP 请求。
  • fs-extra(这里使用了 fs-extra/esm 版本的 readJson 方法):提供扩展的文件系统方法,这里主要用于读取 package.json 文件。
  • form-data(可选,但在本例中未直接使用,因为 Axios 可以处理 FormData):用于构建表单数据,但 Axios 库已经能够很好地处理 FormData 对象。

你可以通过运行以下命令来安装这些依赖:

pnpm i -D axios fs-extra
# 注意:form-data 虽未直接使用,但如果你需要处理文件上传,可以安装
# pnpm i -D install form-data

代码实现

下面是一个完整的示例代码,展示了如何自动化地从 package.json 读取版本信息,并上传一个 zip 包到 Gitee 的最新发布版本。

import { readFile } from 'node:fs/promises';
import axios from 'axios';
import { readJson } from 'fs-extra/esm';
import { basename, join } from 'path';

const { GITEE_TOKEN } = process.env; // 确保你的环境变量中设置了 GITEE_TOKEN

const owner = 'tive'; // 替换为你的 Gitee 用户名
const repo = 'cookies'; // 替换为你的 Gitee 仓库名

async function getPkg() {
  try {
    return await readJson(join(process.cwd(), 'package.json'));
  } catch (e) {
    console.log(e);
    return null;
  }
}

async function getLatestRelease() {
  try {
    const { data } = await axios({
      url: `https://gitee.com/api/v5/repos/${owner}/${repo}/releases/latest`,
      params: {
        access_token: GITEE_TOKEN,
      },
    });
    console.log(data);
    return data?.id;
  } catch (e) {
    console.log(e);
    return null;
  }
}

!(async function main() {
  const { name, version } = await getPkg();
  // console.log({ name, version });
  const filename = `${name}-${version}.zip`; // 这里可以根据你的项目结构调整
  const filepath = join(process.cwd(), `package/${filename}`); // 这里可以根据你的项目结构调整

  const release_id = await getLatestRelease();
  // console.log(release_id);

  const formData = new FormData();
  const file = await readFile(filepath);
  let files = new File([new Uint8Array(file)], basename(filepath), {
    type: 'application/zip', // 可以根据文件类型设置 MIME 类型
  })
  formData.append('access_token', GITEE_TOKEN);
  formData.append('release_id', release_id);
  formData.append('file', files, filename);

  try {
    const config = {
      headers: {
        ...formData.getHeaders(), // 获取表单的 Content-Type
      },
    };
    let { data } = await axios({
      url: `https://gitee.com/api/v5/repos/${owner}/${repo}/releases/${release_id}/attach_files`,
      method: 'post',
      headers: {
        'Content-Type': 'multipart/form-data',
      },
      data: formData,
    })
    console.log(data)
  } catch (e) {
    console.log(e);
  }
})();

拓展

以上示例中使用的是 js 内置 FormData 对象,当然也可以安装 form-data 库,并使用其提供的 FormData 构造函数来构建表单数据。
示例如下:

import axios from 'axios'
import FormData from 'form-data'
import { createReadStream } from 'fs'

async function main() {
  try {
    let formData = new FormData()
    let file = createReadStream(filepath)
    formData.append('access_token', GITEE_TOKEN)
    formData.append('release_id', release_id)
    formData.append('file', file, filename)
  } catch (e) {
    console.log(e)
  }
}

注意事项

  • 环境变量:确保你的环境变量中设置了 GITEE_TOKEN,这是访问 Gitee API 所必需的。
  • 文件路径:根据你自己的项目结构,可能需要调整 filepath 的路径。
  • 错误处理:在实际使用中,应该添加更完善的错误处理逻辑,以便更好地调试和定位问题。
  • 安全性:GITEE_TOKEN 是一个敏感信息,确保不要将其硬编码在代码中,而是通过环境变量等方式安全地管理。

通过以上步骤,就可以实现一个自动化的脚本,将项目包上传到 Gitee 的发布版本中,从而简化发布流程,提升工作效率。


欢迎访问:天问博客

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

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

相关文章

我们的前端开发逆天了!1 小时搞定了新网站,还跟我说 “不要钱”

大家好,我是程序员鱼皮。前段时间我们上线了一个新软件 剪切助手 ,并且针对该项目做了一个官网: 很多同学表示官网很好看,还好奇是怎么做的,其实这个网站的背后还有个有趣的小故事。。。 鱼皮:我们要做个官…

【gofar远为门锁】酒店智能门锁源码 对接收银CyberWinApp-SAAS本地化-未来之窗行业应用跨平台架构

通过写房卡按钮写房卡 一、查看门锁读卡器信息 二、玄武星辰查到对应名称 如何知道自己家门锁的app,使用未来之窗【玄武芯辰】查询 通过上面我看出叫做gofar 在【玄武芯辰】输入gofar,人工智能会提示app信息 三、设置门锁控制app 在上一步找到app&a…

web服务器配置-(apache+nginx)

⼀、web基本概念和常识 Web:为⽤户提供的⼀种在互联⽹上浏览信息的服务,Web 服务是动态的、可交互的、跨平台的和图形化的。 Web 服务为⽤户提供各种互联⽹服务,这些服务包括信息浏览服务,以及各种交互式服务,包括聊…

LinuxCentos中安装apache网站服务详细教程

🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧Linux高级管理防护和群集专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️创作…

【Opencv】色彩空间 color space

import os import cv2 img cv2.imread(os.path.join(.,dog.jpg)) # 在opencv中使用imread,读取的图片每个像素都是bgr色彩,蓝色,绿色,红色 cv2.imshow(img,img) cv2.waitKey(0) # 颜色空间转化:BGR2RGB img_rgb cv2.cvtC…

爱快路由的dns强制客户端代理真是个强大的功能

大致情况是这样的:同事说在linux服务器/etc/resolv.conf上随便写个IP地址【不在线的】,dns地址也能解析,让我帮忙查查。 我看了下也感觉纳闷,试了下不光在服务器上,我本地的pc随便设置了个dns解析也是一样的。 通过wir…

【黄啊码】零代码动手创建ModelScope Agent

还没开始学习,先来回复一下,什么是Agent Agent包含的模块 好了,开始发放干货: 1、创建通义千问API (新注册用户有一定的限时免费额度) 2、登录阿里云账号,打开 DashScope管理控制台,开通 DashScope灵积模…

C#网络连接:TCP/IP模式下的网络连接与同步

1&#xff0c;目的 为了测试局域网的消息同步&#xff0c;简单写了下TCP/IP模式的同步&#xff0c;参考这个帖子。 2&#xff0c;核心库部分 using System; using System.Net; using System.Net.Sockets; using System.Text;namespace Coldairarrow.Util.Sockets {/// <s…

【React】useEffect 钩子详解

文章目录 一、useEffect 概念二、useEffect 的基本用法1. 无依赖项2. 空依赖项数组3. 带依赖项的 useEffect 三、useEffect 的常见应用场景1. 数据获取2. 订阅与清除3. 动画与定时器 四、useEffect 的进阶用法1. 多个 useEffect2. 条件执行副作用 五、注意事项 useEffect 是 Re…

playbooks 分布式部署 LNMP

1、环境配置 ansible 服务器 192.168.10.10nginx 服务器 192.168.10.20mysql 服务器 192.168.10.21php 服务器 192.168.10.22 2、安装 ansble #192.168.10.10节点 yum install -y epel-release #先安装 epel 源 yum install -y ansible配置主机清单 …

Vue 动态改变css文件

theme: smartblue 一、背景需求 现有 Vue3 项目&#xff0c;要求点击按钮后&#xff0c;会动态加载css文件内容 二、实现过程 2.1 相关代码 假设有 blue.css 和 red.css,要求点击加载对应文件 若想切换为原版样式&#xff0c;点击 back 回退到初始样式 this is a simple text …

76.SAP ME - 归档

目录 1.归档 2.系统设置维护 3.后台处理执行 1.归档 可使用此功能将某一特定已完成产品的相关记录从活动的“在制品”(WIP) 数据库移动到归档数据库&#xff0c;这样可改进生产记录的检索。在一段时间内&#xff0c;WIP 数据库中的记录数量将增加。当系统在大量记录中进行搜…

c++ 内存管理(newdeletedelete[])

因为在c里面新增了类&#xff0c;所以我们在有时候会用malloc来创建类&#xff0c;但是这种创建只是单纯的开辟空间&#xff0c;没有什么默认构造的。同时free也是free的表面&#xff0c;如果类里面带有指针指向堆区的成员变量就会free不干净。 所以我们c增加了new delete和de…

pdf太大怎么压缩大小?这几种压缩方法操作起来很简单!

pdf太大怎么压缩大小&#xff1f;在数字化洪流席卷的当下&#xff0c;PDF文件的“臃肿”难题如同巨石般横亘于高效办公之路&#xff0c;它们不仅贪婪地吞噬着宝贵的存储空间&#xff0c;更如沉重的枷锁&#xff0c;拖曳着我们的工作进度&#xff0c;步入迟缓之境&#xff0c;试…

06 内置的整数、实数与复数

在 Python 中&#xff0c;内置的数字类型有整数、实数和复数&#xff0c;借助于标准库 fractions 中的 Fraction 对象可以实现分数及其运算&#xff0c;而 fractions 中的 Decimal 类则实现了更高精度的运算。 Python 支持任意大的数字&#xff0c;具体可以大到什么程度仅受内…

电阻液冷 可提升 3.3kV 中压负载-EAK水冷电阻器

电阻液冷 可提升 3.3kV 中压负载-EAK水冷电阻器 在工业和海洋应用中&#xff0c;水冷在削减电阻器封装方面至关重要的地方 在起重机、升降机、升降机和输送机等电机驱动应用中&#xff0c;风冷电阻器很常见&#xff0c;但在中压、高功率应用中&#xff0c;液体冷却胜出。 使…

IDEA项目的依赖(pom.xml文件)导入问题及解决

前言&#xff1a;该文章为转载&#xff0c;没有仔细的看 IDEA新建项目和pom.xml文件被修改时&#xff0c;右下角都会出现 Maven projects need to be imported&#xff08;项目需要导入依赖&#xff09; 如下&#xff0c;点击 Import Changes导入后&#xff0c;有时会一直处于…

【基础篇】Docker 概览 ONE

嗨&#xff0c;大家好&#xff01;我是小竹笋&#xff0c;一名热爱创作的工程师。今天我将带领大家一起踏上探索 Docker 的奇妙之旅。我们先从 Docker 的历史和发展说起&#xff0c;然后再看看 Docker 和虚拟机之间的区别&#xff0c;最后了解一下 Docker 在各行各业的应用情况…

数据结构算法经典题目刨析(c语言)返回单链表的倒数第 k 个节点

&#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;数据结构经典题目刨析(c语言) 一.题目描述 二.解题思路 方法一:计数器方式 先遍历链表&#xff0c;求出链表长度count倒数第k个节点&#xff0c;就是正数第count-k1个节点&#xff08;下标为count…