在软件开发过程中,自动化发布流程是提升效率的关键环节之一。本文将介绍如何使用 Node.js 和 Axios 库来自动化地向 Gitee 仓库的最新版本中上传发布包。通过读取项目中的 package.json 文件,获取版本信息,并自动将构建好的包文件上传到 Gitee 的对应版本发布中。
环境准备
首先,确保你的开发环境中已经安装了 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 的发布版本中,从而简化发布流程,提升工作效率。
欢迎访问:天问博客