批量迁移 GitHub Actions 从 Node 20 到 Node 24
Source: Dev.to
如果你管理 GitHub 组织,你一定很熟悉这种情形:GitHub 宣布 Node.js 版本将被弃用,结果你的收件箱瞬间被警告塞满。
随着 Node 20 进入维护模式,你可能有数十个 .github/workflows 文件需要升级版本。你可以克隆每个仓库,编辑 YAML,提交、推送并打开 PR……五十次。
或者,你可以使用 multi-gitter 一次性完成所有操作。
一次性解决方案
multi-gitter 是一个开源工具,允许你在组织内的每个仓库中上下文地运行脚本。它会自动处理克隆、分支、提交和 PR 创建。
以下是在不到 3 分钟内为整个组织升级 Node 版本的方法。
1. 脚本
首先,创建一个名为 bump-node.sh 的简单脚本。该脚本将在每个仓库内部运行。我们将使用 sed 在工作流文件中查找并替换版本号。
脚本会自动处理 macOS(BSD sed)和 Linux(GNU sed)之间的语法差异。
#!/bin/bash
TARGET_DIR=".github/workflows"
SEARCH="node-version: 20"
REPLACE="node-version: 24"
# If the directory doesn't exist, stop here.
if [ ! -d "$TARGET_DIR" ]; then
exit 0
fi
# Find YAML files and replace the version string
# We use a conditional check to ensure this works on both macOS and Linux
# "sed --version" returns 0 on GNU (Linux), but fails on BSD (macOS).
if sed --version >/dev/null 2>&1; then
# Linux (standard GNU sed)
find "$TARGET_DIR" -name "*.yml" -o -name "*.yaml" | xargs -I {} sed -i "s/$SEARCH/$REPLACE/g" {}
else
# macOS (BSD sed)
find "$TARGET_DIR" -name "*.yml" -o -name "*.yaml" | xargs -I {} sed -i '' "s/$SEARCH/$REPLACE/g" {}
fi
确保为其赋予执行权限:
chmod +x ./bump-node.sh
2. 命令
在你的组织(例如 my-company-org)中运行 multi-gitter 来执行此脚本。
multi-gitter run ./bump-node.sh \
--org my-company-org \
--branch upgrade-to-node-24 \
--pr-title "Upgrade node version from 20 to 24" \
--pr-body "Bumping node version to 24 in GitHub action due to deprecation."
3. 结果
multi-gitter 会遍历你的仓库。如果脚本产生了更改(即它找到了需要更新的文件),该工具会自动:
- Fork/克隆仓库。
- 将更改推送到
upgrade-to-node-24分支。 - 使用你的描述打开一个 Pull Request。
你甚至可以使用 --interactive 标志,在 PR 创建之前在终端中审查更改。
为什么这很重要
像版本升级这样的维护任务不应占用你的冲刺时间。通过将整个 GitHub 组织视为一个单一的 monorepo 来进行这些更改,你可以节省大量的上下文切换时间。
前往 GitHub 上的 multi-gitter 查看安装方法并获取更多批量管理仓库的方案。