计划窗口:GitHub runner-images 公告计划在 2026 年 11 月 2 日至 8 日逐步部署默认命令变更,日期可能因兼容性验证调整。官方变更公告
最快处理:先审计工作流是否通过 PATH 调用未指定版本的 openssl,再验证证书、密钥、签名、TLS 和原生依赖任务。确实依赖 OpenSSL 3 的任务,应显式选择版本,不要等镜像更新后再排障。
负责企业 macOS CI 镜像和工具链变更的 IT 或平台负责人,先看影响范围与准入判断。
维护证书、签名或 TLS 脚本的工程师,重点核对默认命令和版本假设。
依赖原生库构建的 iOS/macOS 团队,通过代表性任务验证兼容性与回退路径。
OpenSSL 4 GitHub Actions macOS CI 迁移的影响边界
这不是所有 runner 同步升级 OpenSSL 的变更。公告描述的是 macOS 26 Intel、macOS 26 Arm64 和 Xcode 27 Arm64 镜像上,未指定版本的 openssl 默认命令计划从 OpenSSL 3 切换到 OpenSSL 4;OpenSSL 3 仍会通过版本化 Homebrew 前缀保留。macOS 14/15、Linux 和 Windows 不在这项公告所述的默认变更范围内。GitHub runner-images 变更公告
因此,不要仅凭仓库里存在 macOS 构建任务,就把所有流水线都标成受影响。先对照 runs-on 标签、作业日志中的 runner 镜像信息,以及工作流实际执行的命令。GitHub 文档说明,作业日志会列出运行该任务的 runner;镜像软件清单也会关联到实际使用的 runner 镜像。GitHub 托管 runner 参考 查看 runner 镜像软件清单的方法
核验时间:2026 年 10 月 23 日。本文按上述公告及其计划窗口整理;变更尚处于计划阶段,部署开始、完成或公告调整后,都应重新检查目标镜像和作业日志,不能把计划日期写成已经完成切换。
默认命令依赖的隐性风险
“项目没有直接依赖 OpenSSL”并不能证明流水线不受影响。命令可能藏在复用 action、依赖安装脚本、Makefile、构建阶段脚本或第三方工具调用中;只搜主工作流 YAML,容易漏掉间接执行路径。
主要风险可以按可观察的故障线索拆开:
- 版本探测写死:脚本解析
openssl version,再根据主版本号走不同分支;默认输出变化可能触发错误分支。 - 参数或默认值假设:调用依赖特定命令选项、默认算法或默认文件格式。版本差异应视为待验证线索,不代表项目必然失败。
- 输出被下游解析:脚本用文本匹配证书信息、错误提示或命令输出;即使命令成功,解析器也可能因格式差异误判。
- 证书和密钥任务未覆盖:证书生成、密钥读取、证书链校验、签名辅助或 TLS 测试,可能只在发布分支、夜间任务或特定环境执行。
- 原生依赖隐式链接:安装或编译步骤可能读取默认库路径。若日志显示依赖 OpenSSL 的原生库绑定了特定版本或路径,应在隔离构建中验证;单个公开仓库的修复方式不能直接套用到你的项目。
OpenSSL 4 的命令行为和格式选项需要结合具体子命令核对;文档说明不同命令接受的选项并不完全相同。因此,不要用一次 openssl version 检查代替实际证书与构建任务测试。OpenSSL 命令格式选项文档
用对比评分决定固定、试跑还是暂缓
评分含义:高表示方案对版本变化的控制力较强,中表示仍有镜像或项目验证工作,低表示难以控制版本变化。它是决策参考,不是兼容性实测结论。
| 方案 | 版本控制力 | 适用情况 | 主要代价 | 决策评分 |
|---|---|---|---|---|
保持未指定版本的 openssl |
低 | 已完成目标镜像实测,接受默认版本随镜像变化 | 镜像部署后可能改变命令解析结果,需持续观察日志 | 低 |
| 显式选择 OpenSSL 3 | 高 | 项目已确认依赖 OpenSSL 3,且当前不准备迁移 | 需验证版本化路径在目标镜像可用,并维护显式配置 | 高 |
| 在隔离任务试跑 OpenSSL 4 | 中 | 希望确认项目兼容性,再决定是否升级 | 需要维护对照运行和产物验收记录 | 中 |
| 固定 runner 镜像并暂缓变更 | 中 | 发布窗口临近,尚未完成代表性任务验证 | 仍要规划后续迁移,不能把暂缓当成永久兼容方案 | 中 |
如果生产任务必须继续用 OpenSSL 3,优先显式选定版本,而不是仅因当前默认值仍为 3 就维持原样。Homebrew 提供 openssl@3 版本化公式;实际可用前缀和文件位置应从目标 runner 核实,再用于工作流配置。Homebrew openssl@3 公式信息
从搜索调用到验收记录
下面的步骤围绕“哪里调用、调用了什么、结果是否正确”展开。建议先在不影响生产发布的分支或隔离任务执行,再根据团队发布门禁决定是否推广。
- 划定镜像范围:枚举所有 macOS job 的
runs-on标签和架构,单独标出使用 macOS 26 Intel、macOS 26 Arm64 或 Xcode 27 Arm64 的任务。不要把 Linux、Windows 或其他 macOS 标签自动并入这次变更。 - 搜索命令入口:检查工作流 YAML、shell 文件、Makefile、依赖安装脚本和复用 action。重点找裸调用
openssl、openssl version、版本判断,以及通过环境变量或 PATH 拼接命令的逻辑。 - 在实际 job 记录解析结果:在目标作业打印
command -v openssl、openssl version和PATH,同时保存 runner 镜像信息。GitHub Actions 的GITHUB_PATH会影响后续步骤的 PATH,因此也要检查 action 是否改写了搜索路径。GitHub Actions 工作流命令:添加系统路径 - 按业务用途拆测试矩阵:为证书生成与读取、密钥处理、签名辅助、TLS 校验、原生依赖编译建立任务清单。记录每个任务调用的可执行文件、退出码、关键输出和最终产物,避免只跑一个轻量冒烟测试。
- 对照版本执行代表性构建:在隔离工作流中分别测试当前配置与显式 OpenSSL 3 配置;如果团队计划接受 OpenSSL 4,也对该路径运行同一组任务。比较证书校验、签名结果、集成测试及依赖链接日志,不以“命令没有报错”作为唯一通过标准。
- 核验签名产物与证书身份:检查实际发布使用的签名身份、证书链和构建产物验证结果。Apple 文档指出,代码签名验证涉及签名身份和证书信任链;应按团队现有发布流程验收,不要把 OpenSSL 命令通过等同于 Apple 代码签名流程通过。Apple:代码签名证书说明 Apple:创建 macOS 分发签名代码
- 设定准入与回退条件:把通过标准写进变更记录,例如指定任务全部完成、签名和证书校验符合预期、原生依赖构建日志无未解释差异。若失败,先隔离受影响的 job,按团队已有回退流程显式固定版本;保留镜像信息、命令路径、日志和产物校验记录,供下一轮复测。
注意:公告中的计划日期不是镜像切换完成证明。runner 标签只能说明工作流选择了哪类镜像,实际使用的 OpenSSL 路径和版本仍应从该次 job 的日志中取证。
若你要把 runner 镜像变化纳入团队环境治理,可将这次检查与远程 Mac 环境方案对比一并评估:自有设备适合长期、稳定且需要直接控制硬件的负载;远程环境更适合隔离试跑或临时构建容量。两者都不能替代对 runner 镜像、签名流程和依赖兼容性的实测。
常见问题
什么时候开始切换默认版本?
公告计划在 2026 年 11 月 2 日至 8 日逐步部署,且说明日期可能受兼容性验证影响。以公告更新和实际镜像内容为准;在确认特定 job 已运行新镜像前,不要把日期窗口写成团队环境已切换的证据。
怎么查工作流是否通过 PATH 调用了 OpenSSL 3?
在实际执行任务的 job 中记录 command -v openssl、openssl version 和 PATH,并搜索裸 openssl 调用及间接脚本。若通过 GITHUB_PATH 或其他步骤改写 PATH,应核实改写发生的顺序,并在调用命令的步骤中保留日志。
依赖 OpenSSL 3 时如何固定版本?
按公告使用保留的版本化 Homebrew 前缀,并在工作流或构建配置中显式调用 OpenSSL 3。先检查该前缀在目标 runner 镜像上是否存在,再执行构建与证书任务;不要仅依赖当前 openssl 默认解析结果。
变更前哪些证书和签名任务必须验证?
优先覆盖流水线真正使用的证书生成、证书链检查、密钥读取、签名辅助和 TLS 测试,并验收发布产物和下游校验。对 iOS/macOS 发布流程,还要用团队自己的证书和签名身份实测;通用命令示例不能证明生产兼容。
如果你的团队当前依赖固定的自托管环境,主要代价通常是设备采购与维护、容量闲置或扩容周期较长;如果直接跟随托管 runner 默认镜像,代价则是镜像变化需要额外验证,且临时试跑会占用现有流水线资源。对长期稳定、高负载或需要物理接口的任务,自购 Mac 或既有 runner 可能更合适;若只是需要隔离验证 macOS 构建环境或补充短期容量,可以先查看 zshmac 的 Mac 环境方案,再判断租赁是否适合你的测试周期与权限要求。
常见问题
GitHub Actions 的 macOS runner 计划何时切换默认 OpenSSL?
GitHub runner-images 公告计划在 2026 年 11 月 2 日至 8 日逐步部署默认版本变更,但明确表示日期可能受兼容性验证影响。公告范围是 macOS 26 Intel、macOS 26 Arm64 与 Xcode 27 Arm64 runner;部署按镜像逐步进行,因此应查看具体作业日志和镜像信息,不要只凭日期或标签推断已经切换。
怎样确认工作流是不是通过 PATH 调用了 OpenSSL 3?
在作业中记录 `command -v openssl`、`openssl version` 和 `PATH`,并检查 YAML、复用 action、shell 脚本及构建脚本里未带版本前缀的调用。随后将路径与版本写入日志,确认检查发生在实际执行 OpenSSL 的同一作业环境;仅查看 runner 标签或本地开发机结果,不能证明 CI 作业运行时调用了哪个二进制文件。
macOS CI 仍依赖 OpenSSL 3,怎样避免默认版本变化影响构建?
不要依赖镜像当前的默认 `openssl` 命令。按 GitHub 公告使用 OpenSSL 3 的版本化 Homebrew 前缀,并在工作流或构建配置中显式调用该版本;再记录命令路径和版本,验证证书、密钥、TLS 与原生依赖任务。版本化路径应以目标 runner 当次镜像中的实际安装信息为准,不要把路径假设写成所有镜像永远不变的保证。
切换前哪些证书和签名任务需要纳入验证?
先列出流水线里实际运行 OpenSSL 的证书解析或生成、私钥读取、证书链校验、签名辅助和 TLS 连接任务,再覆盖真正交付的签名产物及下游校验流程。逐项比对退出码、关键输出、证书有效性、签名验证和测试结果,并保存构建日志。OpenSSL 命令样例只能帮助设计检查,不能代替你的生产证书、密钥管理和签名流程实测。
在独享 Mac 上验证 OpenSSL 迁移
用 zshmac 独享物理 Mac 搭建自托管构建环境,实测 OpenSSL 3 与 4 的依赖和 TLS 行为。
