mcpField
R
release

release

github.com/remotion-dev云与 DevOps68.9k653 次安装今天更新
代码仓库

关于 release

详细说明 Remotion monorepo 发布流程的技能,涵盖身份验证、构建与版本设置、npm 包验证和标签晋升及后续发布。还规定了发布门槛、回滚处理和变更日志审批。

主要功能

  1. 01验证发布身份与环境
  2. 02构建包并设置发布版本
  3. 03使用临时 npm 标签发布包
  4. 04晋升 latest 前验证包
  5. 05处理部分晋升与回滚
  6. 06准备并审批变更日志

适用场景

  1. 01准备 Remotion monorepo 发布
  2. 02晋升前检查 npm 包是否可用
  3. 03处理标签部分晋升后的恢复
  4. 04起草发布说明以供审批

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/remotion-dev/remotion --skill release

安装后在 Claude Code 中输入/release确认已加载。

详细介绍

  • 使用 SIGKILL 终止所有可能正在运行的 turbo 进程
  • 开始发布前,运行 gcloud auth print-access-token >/dev/null,确认已登录 gcloud。如果失败,运行 gcloud auth login,然后重新检查。检查成功之前,不要继续发布。
  • Codex 专用:运行发布命令前,确保 rbenv 的优先级高于 macOS 系统 Ruby。Codex 可能会启动非交互式 Shell,并将 /usr/bin 排在 ~/.rbenv/shims 之前,导致使用 Ruby 2.6,即使用户的终端使用的是 Ruby 3.3.x。运行可能会调用 Ruby/Bundler 的发布命令时,请使用: PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH" <command> 运行 PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH" ruby --version 进行验证;它应使用用户的 rbenv Ruby,而非 /usr/bin/ruby。这很重要,因为 lambda Ruby 包目前解析出的 json 等 gem 要求 Ruby >= 2.7。
  • 检查 npm whoami。只有在失败时,才运行 npm login(我会在浏览器中手动完成 2FA)
  • 使用 op item get "Npmjs" --fields password --reveal --account remotiondev.1password.com 获取 NPM 密码。
  • 使用 op item get "Npmjs" --otp --account remotiondev.1password.com 获取 2FA 一次性密码。
  • 运行 npm token create --name="PublishRemotionXXXXXX" --packages "remotion" --packages "create-video" --packages-and-scopes-permission read-write --bypass-2fa --scopes "@remotion" --otp=<otp>。将 XXXXXX 替换为随机字符串,确保名称唯一。使用 op item get "Npmjs" --otp --account remotiondev.1password.com 获取 OTP,并通过 --otp= 传入。命令会要求输入密码,请使用 echo "$PASSWORD" | 将密码传入。
    • 不要传入 --json:npm 会在 JSON 输出中将令牌屏蔽为 npm_***,导致令牌无法使用。将纯文本输出重定向到 scratchpad 中的文件,再用 grep -oE 'npm_[A-Za-z0-9]{20,}' 提取令牌,并保存到 scratchpad 文件(例如 $SP/npm_token)。绝不要打印令牌。如果令牌无法使用,请使用 npm token revoke <id> --otp=<otp> 撤销(使用 npm token list 查找 id)。
  • 运行 bun i
  • 运行 bun run build
  • 运行 npm view remotion version 获取当前版本号
  • 运行 bun set-version.ts <version>,其中 为当前版本号加 1。如果退出代码不为 0,立即中止整个发布流程。不要将其输出通过管道传递(例如传给 tail):Shell 使用 zsh,因此无法使用 $PIPESTATUS,且会丢失退出代码。请重定向到日志文件,然后确认 v<version> 提交和标签均已存在。
  • 运行 cd packages/example && sh runlambda.sh && cd ../..。如果失败,中止发布。
  • 在临时 npm dist-tag 下发布公开包,只有在所有包均可安装后,才将其升级到 latest。validating 是 npm 对常规发布自动执行的扫描,不是使用 npm stage 的理由。不要运行 bun run release:当前脚本会直接发布到 latest,并在可用性检查前启动私有包发布和 Git 推送。
    • 在仓库根目录运行完 set-version.ts 后,执行:

      releaseVersion=$(node -p "require('./packages/core/package.json').version")
      releaseTag="remotion-release-$(printf '%s' "$releaseVersion" | tr . -)"
      releaseManifest="/tmp/remotion-release-${releaseVersion}-packages.txt"
      bun publish.ts --list > "$releaseManifest"
      

      清单是需要检查并升级的准确包列表。记录每个包之前的 latest 标签,以便在部分升级后回滚。

    • 检查清单中的任何软件包是否将首次发布到 npm。即使使用 --tag,Bun 也会在软件包首次发布时添加 latest。如果有新软件包,请在批量发布前停止,并单独规划它们的首次发布;此流程无法让它们的首个版本避开 latest。

    • 使用上文创建的令牌运行 NPM_CONFIG_TOKEN=<token> bun publish.ts --tag="$releaseTag"。Bun 仍会打包软件包,并重写 workspace: 和 catalog: 依赖。此带标签的流程无法容忍重新发布错误。上传成功并不代表 npm 已完成扫描:请检查清单、确切的软件包版本和临时标签。扫描完成前,不要再次上传相同版本。如果发布尝试失败,且已确认该版本不存在,请使用相同令牌,仅恢复该软件包的发布:bun publish.ts --tag="$releaseTag" --only=<package>;切勿盲目重新运行整个清单。

    • 对于清单中的每个软件包,在提升版本前,必须先通过 npm view <package>@<version> version --json 以及 npm pack <package>@<version> --pack-destination <temporary-directory>。打包检查可确认 tarball 确实能够获取。请使用 while read -r p; do ( ... ) & done < "$releaseManifest"; wait 循环逐个检查软件包(不要使用 xargs -I,否则会因“无法组装命令行”而失败)。发布后,预计约三分之一的软件包仍处于 validating 状态;这可能需要约 15 分钟。将轮询循环编写成脚本并在后台运行,同时起草变更日志。每分钟左右轮询一次尚未解决的软件包;在可用时使用 npm 生命周期状态 API:GET https://registry.npmjs.org/-/package/<encoded-package-name>/version/<version>/status,并使用具有发布权限的凭据进行身份验证。对作用域名称进行 URL 编码,例如 @remotion%2Fwhisper-web,并确保日志中不包含凭据。如果某个软件包在一小时后仍处于 validating 状态,请报告此次发布仍待处理,并让所有 latest 标签保留在上一版本上。blocked、rejected、需要人工审核、缺失和未知状态也都会阻止提升;请调查这些情况,不要将它们视为扫描延迟。

    • 所有软件包均可安装后,使用发布令牌对清单中的每个软件包运行 npm dist-tag add <package>@<version> latest。npm CLI 会忽略 NPM_CONFIG_TOKEN(只有 bun publish 会使用它),并回退到登录会话,从而导致 EOTP 失败。应改用以下方式传递令牌:env "npm_config_//registry.npmjs.org/:_authToken=$TOKEN" npm dist-tag add ...。这会对每个软件包分别执行一次注册表操作;npm 不支持原子化的多软件包提升。请验证每个软件包的 npm view <package> dist-tags.latest --prefer-online 是否都等于发布版本。并行检查可能会让少数软件包返回过期的缓存标签;在将不匹配视为失败前,请逐个重新检查。如果提升过程中途失败,请为已更改的软件包恢复记录的先前 latest 标签,并报告此次发布未完成。成功提升后,请移除每个软件包的临时标签,并验证最终标签。发布令牌在执行 dist-tag rm 时会收到 E403,因此请使用已登录的会话,并为每次调用获取新的 OTP:npm dist-tag rm <package> <releaseTag> --otp=$(op item get "Npmjs" --otp --account remotiondev.1password.com)。如果调用因 OTP 过期而失败,请等待 30 秒后重试一次。

    • 如果 npm 明确返回 E_STAGE_REQUIRED,则该软件包无法直接发布。请停止此次发布,并单独评估分阶段工作流;分阶段审批需要对每个软件包执行一次双重验证操作。不要在此直接发布流程中悄悄混入分阶段发布的软件包。

  • 只有在确认所有公开的 latest 标签后,才运行 bunx turbo run publishprivate --concurrency=1,然后在仓库根目录运行 git push --tags 和 git push。如果任何步骤失败,请停止并报告受影响的发布状态。
  • 在公开包升级后,在仓库根目录运行 bun run publishtemplates,重新发布所有模板。如果任何模板发布失败,请停止发布工作流并报告失败情况。
  • 生成一份 Markdown 格式的变更日志,并保存到 /tmp/release-<version>.md:
    • 运行 git log v<previous_version>..v<new_version> --oneline 获取所有提交
    • 从合并提交中提取 PR 编号
    • 对每个 PR,运行 gh pr view <number> --json title,author,number,url --jq '"* \(.title) by @\(.author.login) in \(.url)"'
    • 将 PR 分类到以下各节:“What's Changed”“Templates”“Docs”“Internal”
    • 如果之前的发布包含“Elements”和“Internal and Experimental”章节,也使用这两个章节
    • 在“What's Changed”中,优先列出重点功能(尤其是新增文档页面的功能),然后对条目排序,使同一软件包的条目相邻(不设小标题,只排序)。remotion 核心包的变更应排在最前面
    • 从 PR 标题中删去多余前缀(例如,从 Docs 章节的条目中删去“Docs:”)
    • 为新增文档页面的 PR 条目添加链接:运行 git diff --diff-filter=A --name-only v<previous_version>..v<new_version> -- 'packages/docs/docs/**/*.mdx' 'packages/docs/docs/**/*.md',列出新增文档页面,将每个新增页面对应到引入它的 PR,并将该条目的标题包装成指向页面的 Markdown 链接(例如:* [<title>](https://remotion.dev/docs/<slug>) by @author in <url>)。如果页面包含 slug: frontmatter,则根据它确定 URL;否则,根据页面相对于 packages/docs/docs/ 的文件路径确定 URL。没有新增文档页面的条目不添加链接。
    • “Templates”是一个独立章节,列出所有 template-* 相关变更
    • 运行 gh api repos/remotion-dev/remotion/contributors --paginate --jq '.[].login',并与 PR 作者进行比较,确认真正的新贡献者。只有作者不在列表中时,才添加“New Contributors”章节
    • 在底部添加 **Full Changelog**: https://github.com/remotion-dev/remotion/compare/v<previous_version>...v<new_version>
    • 使用与之前 GitHub 发布相同的格式(通过 gh release view v<previous_version> 查看)
    • 未获得批准前不要发布。请允许我先编辑变更日志。这不会阻塞 npm 步骤:在 npm 扫描软件包期间起草变更日志,无需等待即可继续升级、私有发布、推送和发布模板。
    • 获得批准后,重新读取 /tmp/release-<version>.md(我可能已对其进行编辑),并运行 gh release create v<version> --title v<version> --notes-file /tmp/release-<version>.md --verify-tag。
  • 最后,删除暂存区中 npm 令牌的本地副本。令牌会在 7 天后自动过期。

评论

支持 Markdown