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


字数:1k 阅读时长:4分钟 阅读:85

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

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

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

代码实现

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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 构造函数来构建表单数据。
示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 的发布版本中,从而简化发布流程,提升工作效率。


欢迎访问:天问博客

本文作者: Tiven
发布时间: 2024-07-10
最后更新: 2024-07-26
本文标题: Node.js + Axios 上传附件到 Gitee 仓库指定 Release
本文链接: https://www.tiven.cn/p/3b5056bb/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!
欢迎留言,提问 ^_^
个人邮箱: tw.email@qq.com
notification icon
博客有更新,将会发送通知给您!