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

在软件开发过程中,自动化发布流程是提升效率的关键环节之一。本文将介绍如何使用 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 的发布版本中,从而简化发布流程,提升工作效率。


欢迎访问:天问博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值