尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
如何用 runner-images 自建 GitHub Actions Runner 镜像:3 个场景跑通构建、裁剪与验证
如何用 runner-images 自建 GitHub Actions Runner 镜像3 个场景跑通构建、裁剪与验证【免费下载链接】runner-imagesGitHub Actions runner images项目地址: https://gitcode.com/GitHub_Trending/ru/runner-imagesrunner-images 是 GitHub 托管 Runner 的虚拟机镜像定义仓库Ubuntu、Windows、macOS 三族镜像的构建步骤、预装软件清单都在这里你可以直接拿它构建自己的镜像。本文带你走三个真实场景首次构建一张 Ubuntu 24.04 镜像、用 toolset 裁剪预装版本、部署自建镜像并跑通 post-generation 脚本。快速上手最短路径构建一张镜像构建 agent 上装好四样东西Packer 1.8.2、Git、PowerShell 5.0、Azure CLI然后 clone 仓库git clone https://gitcode.com/GitHub_Trending/ru/runner-images进入目录。下面这段命令通过仓库自带的辅助函数创建 Azure 资源并触发 Packer 构建。优先用它而不是裸调packer build——你要少传 10 来个模板变量资源组的创建和清理它也帮你做了Import-Module .\helpers\GenerateResourcesAndImage.ps1 GenerateResourcesAndImage -SubscriptionId 你的订阅ID -ResourceGroupName imagegen-test -AzureLocation East US -ImageType Ubuntu2404跑完后资源组里会出现名为Runner-Image-Ubuntu2404的托管镜像managed image构建全程在 Packer 日志里可以看到临时 VM 的创建、逐条软件安装步骤和最终销毁。场景一首次构建一张 Ubuntu 24.04 镜像场景设定团队想在自有 Azure 订阅上复刻一张官方 Ubuntu 24.04 镜像用于验证自托管 Runner。关键取舍用辅助函数不裸调 Packer。直接packer build需要手传订阅、租户、密钥、位置、镜像名等一长串变量见images/ubuntu/templates/variable.ubuntu.pkr.hcl漏一个就报错辅助函数把这些都收敛成 4 个参数。代价是它的定制项少一些需要打 Tag、走私有 VNet 时才得回退到原生 Packer。认证用 Service Principal别用交互式登录。函数默认会弹交互式登录放进 CI 会卡死提前建好 SP 并传AzureClientId、AzureClientSecret、AzureTenantId三个参数。坚持用 main 分支构建。仓库的 tag 只是文档里程碑快照旧 tag 上的构建不是幂等的不保证能成功main 才是官方推荐的构建源。如何验证生效确认资源组里出现了Runner-Image-Ubuntu2404镜像且构建期间创建过的临时资源组已被删除。场景二用 toolset 裁剪预装版本缩短构建时间场景设定官方 toolset 默认预装 Python 5 个大版本、Node 2 个 LTS、Go 3 个版本构建一张全量镜像耗时不短。你的流水线只固定用 Python 3.12 和 Go 1.24其余都是浪费。关键取舍镜像里装什么由images/ubuntu/toolsets/toolset-2404.json声明把versions数组砍到只剩需要的版本构建时间和镜像体积都会明显下降。代价是多版本并存的便利没了——工作流如果哪天想用 Python 3.10就得在流水线里用 setup 动作临时安装。取舍原则只删你确定不用的拿不准的先留。注意版本字段支持通配符3.12.*且 toolset 改动要符合 schemas/toolset-schema.json 的约束。{ name: Python, versions: [ 3.12.* ] }如何验证生效改完重新构建对比 Packer 日志中 toolcache 阶段的耗时再跑一遍 images/ubuntu/scripts/tests/ 里的测试确认没把依赖被删版本的检查跑挂。场景三部署自建镜像跑通 post-generation 脚本场景设定镜像已经生成现在要真正拿它起一台 VM 当 Runner 用。这里最容易踩坑的是构建期用的用户不存在于最终镜像里所以一些用户目录相关的环境变量、目录权限需要在部署后一次性修正也就是 post-generation 脚本。关键取舍部署这一步优先用仓库的现成函数它顺带把网络资源建好让 VM 可访问Import-Module .\helpers\CreateAzureVMFromPackerTemplate.ps1 CreateAzureVMFromPackerTemplate -SubscriptionId 订阅ID -ResourceGroupName imagegen-test -ManagedImageName Runner-Image-Ubuntu2404 -VirtualMachineName testvm1 -AdminUsername shady1 -AdminPassword 强密码 -AzureLocation eastusVM 起来后以有 sudo 权限的默认用户执行 post-generation 脚本脚本构建时已被复制进镜像的/opt/post-generationsudo su -c find /opt/post-generation -mindepth 1 -maxdepth 1 -type f -name *.sh -exec bash {} \;如何验证生效grep -i HOME /etc/environment应指向当前用户的家目录/var/log里构建期日志已被清理再检查 Rust 相关目录属主是否已修正。这几项没做Runner 装上去后环境变量和权限都会出怪问题。运行与扩展三个高频运维问题现象构建中途失败整个流程中止Packer 的设计是任何安装步骤失败就中止并终止临时 VM所以日志停在哪一步问题就在哪一步。先翻 Packer 输出定位失败步骤再看 Azure 资源组——临时资源组理论上自动清理有残留就手动删掉再重跑避免命名冲突。现象构建耗时超出预算两条路一是调 builders 段的vm_size构建机越大约快越多且这个规格不影响你之后用镜像起的 VM二是回到场景二砍 toolset 里不用的版本。两条可以叠加。现象没改任何配置CI 行为却变了镜像每周滚动更新同一个 YAML 标签下的软件版本会漂移。建议订阅 releases 感知变更如果流水线对版本敏感把ubuntu-latest换成固定标签如ubuntu-24.04。官方迁移-latest标签会提前 1-2 个月公告留意 Announcements 即可。某次构建实际用了哪个版本看 job 日志里Set up job步骤打印的镜像版本号。这套仓库把镜像里装什么和怎么装拆成了 toolset 与 Packer 模板两层维护起来是清晰的——代价是构建链路涉及 Azure 资源、模板、脚本三处上手门槛比写个 Dockerfile 高。按上面的路径走一遍基本就通了。下一步完整构建与部署文档docs/create-image-and-azure-resources.mdPacker 模板与变量定义images/ubuntu/templates/toolset 格式约束schemas/toolset-schema.json各镜像预装软件清单images/ubuntu/Ubuntu2404-Readme.md【免费下载链接】runner-imagesGitHub Actions runner images项目地址: https://gitcode.com/GitHub_Trending/ru/runner-images创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Label Studio 标注一致性(Agreement)计算完整指南:Consensus 与 Pairwise 方法论、指标与权重配置

Label Studio 标注一致性(Agreement)计算完整指南:Consensus 与 Pairwise 方法论、指标与权重配置

Label Studio 标注一致性(Agreement)计算完整指南:Consensus 与 Pairwise 方法论、指标与权重配置 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地…

📅 2026/9/12 16:18:25
Task Master Auto-Implement:Claude Code 插件中的智能任务自动实现工作流

Task Master Auto-Implement:Claude Code 插件中的智能任务自动实现工作流

Task Master Auto-Implement:Claude Code 插件中的智能任务自动实现工作流 【免费下载链接】claude-task-master An AI-powered task-management system you can drop into Cursor, Lovable, Windsurf, Roo, and others. 项目地址: https://gitcode.com/GitHub_Tr…

📅 2026/9/12 16:18:25
Actual 怎么套用官方自定义规则示例处理收款人与转账自动化

Actual 怎么套用官方自定义规则示例处理收款人与转账自动化

Actual 怎么套用官方自定义规则示例处理收款人与转账自动化 【免费下载链接】actual A local-first personal finance app 项目地址: https://gitcode.com/GitHub_Trending/ac/actual 银行导入的交易收款人名称经常每笔略有不同,Actual 会为每个新名称各建一…

📅 2026/9/12 16:18:25
MORE NEWS

更多资讯

📰

to-questionnaire:把卡在别人脑子里的决策,加工成一份可交付的问卷文档

to-questionnaire:把卡在别人脑子里的决策,加工成一份可交付的问卷文档 【免费下载链接】skills Skills for Real Engineers. Straight from my .agents directory. 项目地址: https://gitcode.com/GitHub_Trending/skills13/skills 导读 to-que…

📰

Roo Code 工具系统完全指南:理解 AI Agent 的文件操作、命令执行与审批工作流

Roo Code 工具系统完全指南:理解 AI Agent 的文件操作、命令执行与审批工作流 【免费下载链接】Roo-Code Roo Code gives you a whole dev team of AI agents in your code editor. 项目地址: https://gitcode.com/GitHub_Trending/ro/Roo-Code Roo Code 通过…

📰

DeepSeek-Reasonix 模型 ID 与能力覆盖实战指南:大小写隔离、图片输入声明与旧配置兼容

DeepSeek-Reasonix 模型 ID 与能力覆盖实战指南:大小写隔离、图片输入声明与旧配置兼容 【免费下载链接】DeepSeek-Reasonix DeepSeek-native AI coding agent for your terminal. Engineered around prefix-cache stability — leave it running. 项目地址: http…

📰

Vant Use useToggle 组合式函数实战:用 10 行源码实现布尔状态切换

Vant Use useToggle 组合式函数实战:用 10 行源码实现布尔状态切换 【免费下载链接】vant A lightweight, customizable Vue UI library for mobile web apps. 项目地址: https://gitcode.com/GitHub_Trending/va/vant 导读 useToggle 是 Vant 移动端组件库…

📰

免费开源 3 分钟跑通:G-Helper 轻量替代奥创,掌控华硕笔记本性能

免费开源 3 分钟跑通:G-Helper 轻量替代奥创,掌控华硕笔记本性能 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

📰

SadTalker 模型下载:checkpoints 一步到位配置指南

SadTalker 模型下载:checkpoints 一步到位配置指南 【免费下载链接】SadTalker [CVPR 2023] SadTalker:Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation 项目地址: https://gitcode.com/Gi…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬