开发者工具CI/CD【免费下载链接】action-gh-release :octocat: GitHub Action for creating GitHub Releases项目地址https://gitcode.com/GitHub_Trending/ac/action-gh-release点击查看免费下载action-gh-release 是一个在 Linux、Windows、macOS 虚拟机上创建与更新 GitHub Release 的 GitHub Action其 CHANGELOG.md 完整记录了从 0.1.0 初始版本到 3.0.2 的每一次功能、修复与运行时演进。本文以这份变更日志为核心骨架结合仓库中 action.yml、src/run.ts、src/github.ts、src/util.ts 与测试源码系统梳理该 Action 的输入输出契约、资产上传可靠性机制、版本迁移路线与维护流程帮助你在自己的 CI 中正确选型、升级并规避已知坑点。一、版本体系与运行时演进为什么必须升级到 v3CHANGELOG 展示了本项目清晰的语义化版本策略v2冻结在最终版本2.6.2且不再维护v3作为浮动的 major 标签持续跟随最新发布。1. Node 运行时迁移时间线Action 的运行时声明定义在 action.yml 中目前为runs.using: node24、入口dist/index.js。其演进路径为版本运行时说明0.1.15node16为应对弃用警告升级2.0.0node20升级 action.yml 声明3.0.0node24major 版本同步types/node至 Node 24 线2.6.2node20最后一个 Node 20 兼容版本不再维护3.0.0的核心变更见 CHANGELOG.md是把运行时和打包目标整体迁移到 Node 24。这意味着GitHub 托管 runner 与已支持 Node 24 Actions 运行时的自托管集群应使用v3package.json的engines字段声明node: 24构建脚本esbuild src/main.ts ... --targetnode24 --outfiledist/index.js同样锁定该目标。2. 标签策略浮动 major 标签v3通过npm run updatetag脚本维护见 package.json删除旧v3后重新在合并提交上打注解标签v2被冻结绝不随新版本移动完整版本标签如v3.0.2先推送并等待其触发的 CI 通过再移动v3。升级建议若仍在使用v2请尽快切换到v3。README 也明确提示v2.6.2基于已被 GitHub Actions 弃用的 Node 20 运行时。二、核心功能演进从建一个 Release到完整的发布流水线按 CHANGELOG 的时间线功能能力呈明显递进下面按主题分组还原每次关键引入。1. Release 的创建、查找与更新语义0.1.5支持显式tag_name0.1.6支持自定义target_commitish指定从哪个分支或 commit SHA 创建标签。0.1.4 / 2.0.7支持更新既有 Release 的 body2.2.2修复将 draft 状态从true更新为false的问题。2.5.1将查找逻辑从遍历所有 Release改为直接调用getReleaseByTagAPI实现 O(1) 查找。从源码 src/github.ts 可以看到直接 API 404 时GitHub 不通过该端点暴露 draft Release会回退到最近 2 页RECENT_RELEASE_SCAN_PAGES 2的有界扫描并带 1 秒重试延迟。2.5.3修复refs/tags/形式输入归一化normalizeTagName会剥离refs/tags/前缀见 src/util.ts、重复 draft 清理、Windows 风格 glob 支持与~路径展开。2. 资产上传能力资产上传是本 Action 的核心相关演进最密集版本变更0.1.2支持 newline 分隔的资产列表示例 YAML 见 CHANGELOG.md0.1.8资产上传 override同名资产多轮上传不报错0.1.6fail_on_unmatched_filesfiles glob 无匹配时是否失败2.1.0支持文件名含多个空格新增preserve_order顺序上传2.2.0异步读取 release 资产2.2.1修复大文件上传2.3.1修复文件关闭finally { await fh.close() }见 src/github.ts2.3.2回退readableWebStream变更后又在 3.0.2 重新加固为流式上传2.3.3新增overwrite_files输入默认true声明于 action.yml2.3.4/2.5.2处理 422already_exists竞态并发 workflow 上传同名资产时刷新资产列表、删除已存在资产后重试一次2.5.2恢复 dotfile 资产标签alignAssetName将空格替换为.以匹配 GitHub 重写后的名称见 src/util.ts3.0.2加固流式上传传输fileUploadStream通过TransformStream将 Web Stream 块统一为Uint8Array见 src/github.ts支持在 Gitea 上替换既有资产3. Release Notes 生成0.1.14引入generate_release_notes基于 GitHub 活动自动生成发布说明2.4.2限制生成的 release notes 不超过 125000 字符truncateReleaseNotes截断见 src/github.ts2.6.0新增previous_tag当generate_release_notes开启时显式指定 GitHub 的previous_tag_name对比基准避免默认对比范围与期望的发布系列不符。源码中prepareReleaseMutation会在创建/更新前先调用generateReleaseNotes生成说明再拼接用户 body见 src/github.ts。4. Draft 与 Prerelease 语义0.1.7允许无 tag 创建 draft Release0.1.2引入prerelease输入2.5.0关键功能在所有资产上传完成前保持 draft 状态上传结束后统一 finalize。这正是finalizeRelease存在的意义——它在上传完成后将 draft 置为false并设置make_latest与discussion_category_name见 src/github.ts3.0.2在发布 prerelease 时复用已存在的 draft Release不可变 Release 平台约束GitHub 一旦发布即锁定资产不可再上传。源码中isImmutableReleaseAssetUploadFailure专门识别 422 且消息含immutable release的错误并给出明确指引如需在不可变仓库上给 prerelease 上传资产应draft: true保持草稿之后手动发布并将下游 workflow 订阅release.published事件见 src/github.ts。5. 其他重要输入/输出0.1.9支持discussion_category_name将 Release 关联到 GitHub Discussion需discussions: write权限2.6.1修复 draft-first 发布流程中丢失讨论分类的问题0.1.6新增repository输入跨仓库创建 Release、id与upload_url输出2.0.1新增make_latest可取值true/false/legacy、代理环境变量支持、空files警告抑制2.0.3在 action.yml 中正式声明make_latest2.0.2将glob 无匹配即失败改为可选项fail_on_unmatched_files默认 false0.1.13修复多次运行导致 Release body 被拼接重复的问题0.1.12修复未提供的输入被替换为空字符串破坏 API 调用的问题即保留原始 Release 信息的语义2.6.0补充working_directory文档files glob 相对该目录解析默认基于${{ github.workspace }}action.yml。6. 输出契约Action 提供 4 个输出action.yml在 src/run.ts 中通过setOutput写入输出类型说明urlStringRelease 的 GitHub 页面 URLidStringRelease IDupload_urlString资产上传 URLassetsString本次上传/覆盖资产的 JSON 数组去掉uploader字段可用fromJSON(...)取browser_download_url三、输入参数契约从 CHANGELOG 到 action.yml 的完整对照将 CHANGELOG 中散落的输入演进汇总并与 action.yml 实际声明的输入做最终对照以下均为with:可选键输入说明与默认值body/body_pathRelease 说明文本 / 从文件加载。同时提供时body_path优先读取失败回退bodyreleaseBody实现于 src/util.tsnameRelease 名称默认取 tag 名tag_name标签名默认github.ref_namerefs/tags/name会被归一化draft默认 false复用一个既有 draft 时设true保持草稿省略则上传后发布prerelease是否预发布默认 falsepreserve_order是否按提供顺序串行上传资产不控制最终展示顺序filesnewline 分隔的 glob 列表支持~/...展开、Windows 双分隔符含 glob 元字符的字面文件名需转义working_directoryfiles glob 的解析基准目录默认工作区根目录overwrite_files同名资产是否覆盖默认trueaction.ymlfail_on_unmatched_filesglob 无匹配是否失败默认 falserepository目标仓库owner/repo默认GITHUB_REPOSITORYtoken授权 token/PAT默认${{ github.token }}非空显式 token 优先于GITHUB_TOKEN传空串视为显式未设置target_commitish标签创建位置默认仓库默认分支为旧提交建新标签遇 403 时需用更高权限的 PATdiscussion_category_name关联 Discussion 分类须已存在generate_release_notes自动生成名称与 body显式 body 会前置拼接在自动生成内容之前previous_tag生成 notes 时的对比基准 tag省略则由 GitHub 自动选择append_body追加到既有 body 而非覆盖existingReleaseBody \n workflowBody见 src/github.tsmake_latest是否设为 latest可取值true/false/legacy默认走 GitHub API 默认值Token 解析逻辑值得单独说明parseToken优先读取INPUT_TOKEN即with.token其次才回退GITHUB_TOKEN环境变量见 src/util.ts。README 与 2.5.3 的文档澄清一致非空显式 token 覆盖GITHUB_TOKEN。四、运行时序一条流水线在源码里如何执行结合 src/run.ts 可以把 Action 的完整执行链还原为以下步骤配置解析与校验src/run.tsparseConfig(env)读取所有INPUT_*环境变量若未提供 tag、当前 ref 非refs/tags/且非 draft则直接报错GitHub Releases requires a tag随后用unmatchedPatterns检查 files glob按fail_on_unmatched_files决定抛错或告警。创建 Octokit 客户端启用octokit/plugin-throttlingrate limit 首次重试、abuse limit 告警src/run.ts。查找或创建 Releaserelease函数见 src/github.ts先getReleaseByTag直查404 时回退最近 Release 扫描不存在则createReleasedraft 前置创建存在则updateRelease并保留未显式设置的原始字段。创建遇 422already_exists竞态会递归重试最多 3 次403/404 直接抛出带诊断信息的错误。上传资产paths()解析 glob 得到文件列表preserve_order控制串行或Promise.all并行上传src/run.ts。每个文件先比对既有资产决定跳过/删除重传上传后必要时恢复 asset label。Finalize 发布finalizeRelease将 draft 置false除非draft: true设置make_latest与 discussion失败重试最多 3 次若标签创建被仓库规则阻止422pre_receive含creations being restricted会删除孤儿 draft 并抛出明确错误src/github.ts。输出重新拉取资产列表过滤出本次上传的资产 ID输出assets、url、id、upload_url。五、工程质量与维护实践从 CHANGELOG 反推的协作规范1. 测试体系迁移2.3.0从 jest 迁移到 vitest测试位于__tests__/目录github.test.ts、run.test.ts、util.test.ts、release-create.test.ts等npm test即vitest --coverage。3.0.2进一步提升了覆盖率。测试通过createReleaser构造 mock 化 Releaser对mimeOrDefault、findTagFromReleases、parseInputFiles含花括号逗号 glob、uploadUrl剥离{?name,label}模板等关键逻辑做了单测印证了 src/util.ts 与 src/github.ts 的实现。2. 维护规范AGENTS.md 与 RELEASE.md每次行为变更需同步 README.md、action.yml、__tests__/并重新生成dist/index.jsnpm run build本地验证四件套npm run fmtcheck、npm run typecheck、npm run build、npm test见 AGENTS.md发版遵循 RELEASE.md 的检查清单先定 major/minor/patch更新 package.json 版本号、在 CHANGELOG.md 顶部新增条目推送完整版本标签等 CI 通过后再移动v3浮动标签最后做消费者侧冒烟验证。3. 竞态与边界问题处理模式CHANGELOG 中 2.3.x3.0.x 的大量修复都围绕同一类问题并发 workflow 与 GitHub 平台一致性。处理模式可归纳为遇到 422already_exists→ 刷新列表 → 删除 → 重试创建 Release 与上传资产两条路径都有遇到资产元数据 404 → 轮询刷新最多 3 次、间隔 1 秒再继续平台行为如不可变 Release、文件名重写、4 字节 Unicode 字符无法恢复→ 优先文档澄清与明确报错而非强行绕过。六、升级迁移指引从 v2 到 v3综合 CHANGELOG 与 README升级建议如下确认运行时v2.6.2是 Node 20 兼容的最终版本且不再维护v3需要 Node 24 运行时GitHub 托管 runner 已支持自托管需先确认 fleet 支持。修改引用将uses: softprops/action-gh-releasev2改为v3README 示例中 tag 门控写法为uses: softprops/action-gh-releasev3配合if: github.ref_type tag。权限设置至少需要permissions: contents: write使用discussion_category_name时追加discussions: write见 README.md。关注行为差异资产在发布前上传draft-firstprerelease 默认保持已发布以触发release.prereleased不可变 Release 仓库上的 prerelease 资产上传需draft: true配合release.published事件。回到最新版若问题在新版仍复现按 AGENTS.md 的约定提供 action ref、workflow run URL、runner 与相关日志。结语从 0.1.0 的初始发布到 3.0.2 的可靠性加固action-gh-release 的 CHANGELOG 本身就是一份如何构建健壮的 GitHub Action的实战教材Node 运行时前瞻性升级、资产上传竞态的系统性治理、平台约束的透明化处理、以及文档-配置-测试-产物四同步的契约维护。理解这份变更日志你就能在 CI 中更自信地选型、配置并排障。赞分享开发者工具CI/CD【免费下载链接】action-gh-release :octocat: GitHub Action for creating GitHub Releases项目地址https://gitcode.com/GitHub_Trending/ac/action-gh-release点击查看免费下载相关推荐终极GitHub Actions自动化发布指南action-gh-release实战教程终极GitHub Actions自动化发布指南action gh release实战教程 想要彻底告别手动创建GitHub Releases的繁琐操作吗ac开发者工具CI/CDRomM游戏管家3步打造你的私人数字游戏博物馆RomM游戏管家3步打造你的私人数字游戏博物馆 还在为散落在硬盘各处的游戏ROM而烦恼吗每次想重温童年经典却要在几十个文件夹里大海捞针传统的文件管理方式后端前端NNI 版本演进全览从 v0.1 到 v3.0 的变更日志深度解读NNI 版本演进全览从 v0.1 到 v3.0 的变更日志深度解读 本篇文章基于 NNI 官方版本发布日志 release.rst https://link人工智能AutoML机器学习深度学习模型压缩特征工程上一篇ArkAnalyzer命名空间签名模块化编程支持实现下一篇深入解析Mountpoint for Amazon S3从对象键到文件系统的完整转换指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考