GitHub Actions Toolkit 制品(Artifact)FAQ 实战指南:非法字符校验、ZIP 压缩策略、版本兼容与保留期
CI/CD开发工具【免费下载链接】toolkitThe GitHub ToolKit for developing GitHub Actions.项目地址https://gitcode.com/gh_mirrors/to/toolkit点击查看免费下载导读本文以 GitHub Actions Toolkit 中actions/artifact包的官方 FAQ 文档仓库路径 packages/artifact/docs/faq.md为骨架逐条拆解 GitHub Actions 制品上传/下载中最高频的四个问题制品名称与路径允许哪些字符、制品如何被压缩存储、upload-artifact与download-artifact的版本兼容关系、制品默认保留多久。结合仓库源码path-and-artifact-name-validation.ts、zip.ts、retention.ts与测试用例给出可直接落地的配置参数、默认值和踩坑清单。读完本文你将能够正确命名制品、按需调节压缩级别、选择匹配的 action 版本组合并准确控制制品的生命周期。actions/artifact是驱动actions/upload-artifact与actions/download-artifact两个官方 Action 的核心库位于仓库 packages/artifact当前版本为6.3.1见 package.json。它提供uploadArtifact、downloadArtifact、listArtifacts、getArtifact、deleteArtifact五个编程接口入口定义在 client.ts默认实例导出自 artifact.ts。一、支持的字符制品名称与路径的非法字符限制1.1 规则总览上传制品时传入的name参数制品名称以及files中指定的文件路径均不能包含以下 7 个字符。只要name或files中出现其中之一制品就会被服务器拒绝上传失败非法字符名称双引号 Double quote:冒号 Colon小于号 Less than大于号 Greater than|竖线 Vertical bar*星号 Asterisk?问号 Question mark额外限制除上述 7 个字符外制品名称name还不能包含\反斜杠与/正斜杠。注意文件路径中允许出现\和/它们本就是路径分隔符只是不允许出现在制品名称中。1.2 为什么这样限制这些字符被禁止是因为部分文件系统如 Windows 的 NTFS存在命名限制。为了保持**平台无关platform-agnostic**行为凡是个别文件系统/平台不支持的字符就统一在所有文件系统/平台上禁止。这样制品在任何平台上下载解压时都不会因文件名非法而导致失败。1.3 源码级校验实现校验逻辑实现在 path-and-artifact-name-validation.tsinvalidArtifactFilePathCharacters定义文件路径禁止的 9 个字符上述 7 个之外额外包含\r回车符与\n换行符见源码第 11–21 行invalidArtifactNameCharacters在文件路径非法字符基础上再追加\与/构成制品名称的 11 个非法字符见源码第 23–27 行validateArtifactName(name)校验制品名称为空名或包含非法字符时直接抛出Error源码第 32–55 行validateFilePath(path)校验文件路径同样为空路径或包含非法字符时抛出Error源码第 60–82 行。在校验通过时库会通过actions/core输出日志Artifact name is valid!校验失败的错误信息中会列出所有非法字符并说明“为保持跨文件系统行为一致这些字符被有意禁止”。1.4 测试用例印证path-and-artifact-name-validation.test.ts 用两组用例验证了上述规则名称非法样例my\artifact、my/artifact、myartifact、my:artifact、myartifact、myartifact、my|artifact、my*artifact、my?artifact以及空字符串均toThrow()名称合法样例my-normal-artifact、myNormalArtifact以及包含非 ASCII 字符的m¥ñðrmålÄr†ï£å¢†均不抛出异常说明非 ASCII 字符是允许的路径非法样例some/invalidartifact/path、some/invalid:artifact/path、含\r、\n、\r\n的路径等均报错路径合法样例my/perfectly-normal/artifact-path、my/perfectly\Normal/Artifact-path等均通过。1.5 校验在完整上传链路中的位置字符校验只是上传流程的第一步。在 upload-artifact.ts 的uploadArtifact中第 54–55 行依次调用validateArtifactName(name)与validateRootDirectory(rootDirectory)随后getUploadZipSpecification在生成 ZIP 结构时还会对每个要打包的文件相对路径再次调用validateFilePath见 upload-zip-specification.ts 第 100、110 行。也就是说名称与路径会在打包前被双重校验。实战建议命名制品时使用小写字母、数字、连字符与点号即可安全跨平台不要在名称中使用空格以外的特殊符号尤其避开上表列出的 11 个字符。二、压缩与存储制品是如何被打包成 ZIP 的2.1 动态压缩、流式上传创建制品时文件会被动态压缩并流式streamed写入一个 ZIP 归档。既然是 ZIP 归档就可以通过 Zlib 以不同级别压缩。核心实现在 zip.ts默认压缩级别常量DEFAULT_COMPRESSION_LEVEL 6源码第 8 行createZipUploadStream(uploadSpecification, compressionLevel DEFAULT_COMPRESSION_LEVEL)调用archiver.create(zip, {highWaterMark: ..., zlib: {level: compressionLevel}})创建归档流第 10–21 行对符号链接会先通过fs.realpath解析为真实路径再打包第 33–35 行空目录以zip.append(, {name: destinationPath})的形式保留第 42–44 行压缩流经WaterMarkedUploadStream边压缩边上载到 Blob 存储实现“边打包边传”无需整包落盘。2.2 压缩级别 0–9 的含义compressionLevel取值范围为 0 到 9值含义说明0无压缩上传速度最快但存储体积最大1最快速度压缩率低、速度快6默认压缩与 GNU Gzip 相同createZipUploadStream的默认值9最佳压缩压缩率最高但耗时最长级别越高压缩效果越好但耗时也越长。对于不易压缩的大文件官方建议直接使用 0可获得显著更快的上传速度——这本质上是在“上传耗时”与“存储体积”之间做取舍。2.3 在编程接口中使用选项定义在 interfaces.ts 的UploadArtifactOptions.compressionLevel中注释与 FAQ 完全一致第 43–52 行。使用示例import {DefaultArtifactClient} from actions/artifact const artifact new DefaultArtifactClient() // 大体积、不可压缩的二进制文件关闭压缩换取上传速度 await artifact.uploadArtifact(my-massive-artifact, [big_file.bin], { compressionLevel: 0 // 0 无压缩 | 1 最快 | 6 默认(与 GNU Gzip 相同) | 9 最佳 }) // 文本类可压缩内容追求最小存储体积 await artifact.uploadArtifact(my-logs, [app.log], { compressionLevel: 9 })当未显式传入compressionLevel时upload-artifact.ts 第 107–110 行将undefined直接传给createZipUploadStream由函数默认值 6 兜底——即默认与 GNU Gzip 同级压缩。2.4 与压缩相关的其他实现细节分块上传getUploadChunkSize()config.ts 第 6–8 行固定返回8 * 1024 * 10248 MB既作为 ZIP 流的highWaterMark也作为上传 Blob 存储的块大小skipArchive 选项UploadArtifactOptions.skipArchiveinterfaces.ts 第 54–59 行支持“不压缩直接上传单个文件”此时制品名称改用文件名本身且文件不经过 Zlib 压缩。该能力自actions/artifact6.2.0 起提供见 RELEASES.md目前仅支持单文件上传下载端自动解压下载时若检测到application/zip等 MIME 类型或 URL 以.zip结尾download-artifact.ts 第 89–93、159–164 行会通过unzip-stream边下载边解压到目标目录也可用DownloadArtifactOptions.skipDecompress关闭自动解压按原样保存第 165–171 行。三、版本兼容upload-artifact 与 download-artifact 如何配套3.1 兼容矩阵actions/upload-artifact与actions/download-artifact都依赖 GitHub Actions Toolkit通常成对使用来完成工作流中的制品上传与下载。FAQ 给出的兼容矩阵如下upload-artifactdownload-artifacttoolkitv4v4v2 v3 v3 v1请务必使用相互匹配的actions/upload-artifact与actions/download-artifact版本以确保兼容。也就是说上传用 v4下载也要用 v4对应 toolkit v2而老版本小于 v3则对应 toolkit 小于 v1 的版本。3.2 工作流 YAML 中的写法在 GitHub Actions 工作流的 YAML 文件中通过uses指定 action 版本steps: - name: 上传制品 uses: actions/upload-artifactv4 with: name: my-artifact path: ./dist - name: 下载制品 uses: actions/download-artifactv4 with: name: my-artifact发布说明Release Notes官方建议在升级前查看两个仓库各自的发布说明确认是否存在关于兼容性或者行为变更的具体提示。例如 RELEASES.md 中记录actions/artifact6.0.0 起包改为ESM-onlyCommonJS 消费者必须改用动态import()6.1.0 起支持下载非 ZIP 制品6.2.0 起支持skipArchive单文件直传。这些都是可能影响下游 Action 的行为变更。3.3 版本背后的架构变化为什么 v4/v4 要配 toolkit v2因为actions/artifactv2对应upload-artifactv4、download-artifactv4对制品后端架构做了重大重构详见 README.md上传/下载显著提速最坏场景下下载最多快约 80%、上传最多快约 96%上传完成后立即返回制品 ID制品马上可在 UI 与 REST API 中可见无需等待整个 run 结束制品内容以不可变归档整体上传后续 job 无法篡改支持携带具备actions:read权限的 token 从其他仓库/其他 run下载制品findBy选项引入新限制同一 run 内不允许向同名制品重复上传单个 job 的制品数量上限为 10 个当前 v2 体系在 GHESGitHub Enterprise Server上尚未受支持。这些行为变更正是“必须成套升级”的底层原因。四、保留期制品默认可用多久4.1 默认值制品的默认保留期为90 天。这是 GitHub Actions 的默认设置超出期限后制品会被自动清理。4.2 通过 retentionDays 覆盖默认值在编程接口中可通过UploadArtifactOptions.retentionDaysinterfaces.ts 第 25–41 行覆盖默认保留期最小值为 1最大值通常为 90具体上限受仓库/组织设置约束如果传入的值大于服务器允许的最大保留天数服务器会把保留期下调为最大值并继续上传不会失败并打印警告传入 0 表示采用默认保留设置。await artifact.uploadArtifact(my-artifact, [file1.txt], { // 例如只保留 10 天 retentionDays: 10 })4.3 源码实现getExpiration保留期计算实现在 retention.ts 的getExpiration未传retentionDays时直接返回undefined第 4–8 行请求中不带过期时间由服务端按默认 90 天处理读取环境变量GITHUB_RETENTION_DAYS得到仓库允许的最大保留天数maxRetentionDays第 23–34 行若maxRetentionDays存在且小于请求值输出警告并强制使用maxRetentionDays第 9–15 行最终以“当前时间 保留天数”构造Timestamp作为过期时间第 17–20 行。该expiresAt会被写入CreateArtifactRequest见 upload-artifact.ts 第 87–90 行随创建制品的 RPC 请求一起发给服务端。4.4 测试用例印证retention.test.ts 覆盖了四种场景传入 30 天且GITHUB_RETENTION_DAYS90返回当前时间 30 天的过期时间传入 120 天且GITHUB_RETENTION_DAYS90被截断为当前时间 90 天不传参数返回undefined无最大保留天数限制时传入 30 天正常返回 30 天。实战建议需要长期保留的产物请明确在仓库设置中调大保留上限后再传对应retentionDays临时调试用制品尽量设置较短的保留期避免占用存储配额。五、总结四个高频问题的速查表问题答案制品名称/路径不能含什么字符名称禁含:|*?\/路径禁含:|*?\r\n。原因NTFS 等文件系统限制 平台无关策略制品如何存储动态压缩为 ZIP 并流式上传Zlib 压缩级别 0–9默认 6同 GNU Gzip大且难压缩的文件建议用 0 换取上传速度6.2.0 支持skipArchive单文件不压缩直传版本如何配套upload-artifact v4 配 download-artifact v4 配 toolkit v2小于 v3 的旧版本配 toolkit 小于 v1。升级前务必查看双方 Release Notes制品保留多久默认 90 天可用retentionDays覆盖≥1上限受仓库设置约束超限自动下调并警告0 表示用默认如需进一步了解编程接口的完整 API可查阅 生成文档本文涉及的所有校验、压缩、保留期逻辑均可在 packages/artifact/src/internal 及其对应 测试目录 中复现验证。赞分享CI/CD开发工具【免费下载链接】toolkitThe GitHub ToolKit for developing GitHub Actions.项目地址https://gitcode.com/gh_mirrors/to/toolkit点击查看免费下载相关推荐GitHub Actions 版本管理实战指南ref 绑定、主版本兼容与发布策略Toolkit 视角GitHub Actions 版本管理实战指南ref 绑定、主版本兼容与发布策略Toolkit 视角 本指南以 GitHub Actions ToolkiCI/CD开发工具nektos/act版本兼容支持不同GitHub Actions版本的策略nektos/act版本兼容支持不同GitHub Actions版本的策略 痛点与挑战 你是否曾经遇到过这样的困境在本地使用nektos/act测试GitHCI/CDDevOps开发工具CLIandroidannotations资源压缩与注解保留策略androidannotations资源压缩与注解保留策略 在Android开发过程中资源优化和注解处理是提升应用性能的关键环节。AndroidAnnotat移动开发代码生成上一篇civitai 审核查询移植全景清单主应用到 civitai/db-queries 的收敛Convergence与 Net-new 实战指南下一篇DeepSeek Harness TUI 交互扩展服务基于 ctx.tui.openOverlay() 的模态浮层插件原语创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

多模态Agent架构重构:多模态理解、Harness与MCP工具调用的工程实践

多模态Agent架构重构:多模态理解、Harness与MCP工具调用的工程实践

做Agent开发这两年,我一直有个很深的感受:真正卡住进度的往往不是模型能力,而是模型周围那一圈"胶水代码"。最近我重构了一个多模态Agent项目的整体架构,把输入侧、执行侧、工具侧分别做了改造,收获最大的三…

2026/10/12 2:19:18 阅读更多 →
PoWFaucet 模块钩子体系(MODULE_HOOKS)深度解析:会话生命周期中的模块协作机制

PoWFaucet 模块钩子体系(MODULE_HOOKS)深度解析:会话生命周期中的模块协作机制

区块链后端前端 【免费下载链接】PoWFaucet Modularized faucet for EVM chains with different protection methods (Captcha, Mining, IP, Mainnet Balance, Gitcoin Passport and more) 项目地址: https://gitcode.com/gh_mirrors/po/PoWFaucet 点击查看 免费下载…

2026/10/12 2:18:17 阅读更多 →
【仓颉语言基础语法学与练】第1课:从零开始

【仓颉语言基础语法学与练】第1课:从零开始

本课目标完成仓颉 SDK 的下载、解压与环境变量配置。能使用 cjc 和 cjpm 验证安装是否成功。掌握仓颉程序入口 main 的写法。掌握变量 let 与 var 的区别。认识基础类型:Int64、Float64、Bool、String、Unit。掌握函数 func、命名参数和默认值。掌握分…

2026/10/12 2:18:17 阅读更多 →

最新新闻

IIS管理器打开全攻略:本机启动、远程连接与排错实战

IIS管理器打开全攻略:本机启动、远程连接与排错实战

搞Windows服务器的同学都清楚,IIS管理器这个窗口,看着不起眼,却是撑起大量Web业务的关键工具。很多人以为它就是个“打开就能用”的图形界面,但在实际运维里,光是怎么把它顺利打开、正常连上远程站点,就能筛…

2026/10/13 5:33:32 阅读更多 →
从compose到组合上下文:函数组合的工程化实战复盘

从compose到组合上下文:函数组合的工程化实战复盘

函数组合不是新东西,但真正把它做到"极致"和"优雅",我用了将近一年的时间反复打磨。这篇文章是我对这段时间的完整复盘。我不打算讲枯燥的范畴论,也不打算罗列一堆库的API,我想说的是:我如何从一个…

2026/10/13 5:33:32 阅读更多 →
充电器空载发热、待机功耗异常怎么办?温度保险电阻排查维修实战

充电器空载发热、待机功耗异常怎么办?温度保险电阻排查维修实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:33:32 阅读更多 →
fio-3.8完整指南:从解压编译到IOPS与延迟分析实战

fio-3.8完整指南:从解压编译到IOPS与延迟分析实战

简介:FIO(Flexible I/O Tester)3.8 版本完整源代码压缩包,面向存储性能测试工程师、系统运维与内核/驱动开发者,用于在 SSD、HDD、RAID、NVMe 等场景下评估读写吞吐、IOPS 与延迟,并开展压力测试与瓶颈定位…

2026/10/13 5:33:32 阅读更多 →
python -v 和 python -V 的区别:命令行参数大小写敏感与解释器启动排查

python -v 和 python -V 的区别:命令行参数大小写敏感与解释器启动排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:33:32 阅读更多 →
目标类型new表达式:现代编程语言的类型推断演进

目标类型new表达式:现代编程语言的类型推断演进

1. 目标类型new表达式的前世今生第一次看到var list new List<string>();这种写法时&#xff0c;我还在用Java写ArrayList<String> list new ArrayList<String>();。这种重复的类型声明总让我觉得像在说废话——明明右边已经写了类型&#xff0c;为什么左边…

2026/10/13 5:32:32 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目&#xff0c;我最大的感受是&#xff0c;大部分坑不是出在技术前沿&#xff0c;而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节&#xff0c;最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了&#xff0c;很难不碰到舵机控制这道坎。做智能小车要转方向&#xff0c;做机械臂要抬关节&#xff0c;做云台要偏航俯仰&#xff0c;背后都是同一个东西在干活&#xff1a;舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”&#xff1f;——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台&#xff1f;或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜&#xff1f;又或者&#xff0c;在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →