尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

扩展 JoliCi:手把手教你编写自定义 BuildStrategy 构建策略

扩展 JoliCi:手把手教你编写自定义 BuildStrategy 构建策略 扩展 JoliCi手把手教你编写自定义 BuildStrategy 构建策略【免费下载链接】JoliCi:white_check_mark: JoliCi - Run your TravisCi builds locally项目地址: https://gitcode.com/gh_mirrors/jo/JoliCiJoliCi 是一款用 PHP 编写的开源持续集成客户端它能让你在本地 Docker 环境中运行构建。而BuildStrategy 构建策略正是 JoliCi 最核心的扩展点——通过编写自定义 BuildStrategy你可以让 JoliCi 支持任何类型的项目配置。本文将手把手教你从零实现一个属于自己的构建策略全程面向新手无需深入源码也能轻松上手。JoliCi 的构建策略机制是什么在 JoliCi 中一个构建策略Build Strategy负责回答三个问题这个项目支持我的策略吗项目里有没有对应的配置文件该生成哪些构建任务一个项目可能对应多个 Job每个任务如何准备运行环境复制文件、生成 Dockerfile 等JoliCi 自带了两套官方策略策略类识别依据适用场景TravisCiBuildStrategy.php项目根目录存在.travis.yml兼容 Travis CI 配置的项目JoliCiBuildStrategy.php项目根目录存在.jolici目录需要自定义环境的最灵活方案策略的完整解析逻辑可以参考官方文档 JoliCiStrategy.md。你写的新策略就是这两个类的第三个兄弟。认识 BuildStrategyInterface自定义构建策略的 4 个核心方法所有策略都必须实现 BuildStrategyInterface.php 接口里面只有4 个方法结构非常简单getName()返回策略名称例如 JoliCi 或 TravisCisupportProject($directory)判断项目目录是否支持当前策略getJobs($directory)为项目生成一个或多个 Job构建任务prepareJob(Job $job)准备单个 Job通常是把文件复制到构建目录并生成 Dockerfile 提示BuildStrategyInterface中还定义了常量WORKDIR /home/project表示构建时项目在容器内的挂载路径。最快配置方法先看一个最小的自定义构建策略骨架在动手前我们先用最精简的代码搭一个骨架。参考测试里的示例 ChainBuildStrategyTest.php一个合法的最小策略长这样use Joli\JoliCi\Job; use Joli\JoliCi\BuildStrategy\BuildStrategyInterface; class MyStrategy implements BuildStrategyInterface { public function getName() { return MyStrategy; } public function supportProject($directory) { return file_exists($directory . /mybuild.yml); } public function getJobs($directory) { return array(new Job(myproject, $this-getName(), unique-key-1)); } public function prepareJob(Job $job) { /* 准备构建环境 */ } }是不是比你想象的简单 接下来我们把它升级成真正可用的策略。手把手实战编写基于 mybuild.yml 的自定义构建策略假设你的团队用mybuild.yml来描述构建包含command测试命令和image基础镜像我们来为 JoliCi 写一个能读懂它的策略。第一步实现 supportProject告诉 JoliCi 何时启用public function supportProject($directory) { return file_exists($directory . /mybuild.yml); }第二步实现 getJobs解析配置并生成 JobJob是 JoliCi 中构建任务的载体可以查看 Job.php 了解它的完整结构。每个 Job 需要project项目名可用 Naming.php 的getProjectName()规范化strategy策略名称uniq唯一键同参数的任务必须生成相同 key推荐用getUniqueKey()计算parameters策略自定义参数会传给prepareJobdescription给用户看的任务描述public function getJobs($directory) { $config Yaml::parse(file_get_contents($directory . /mybuild.yml)); $project (new Naming())-getProjectName($directory); return array(new Job( $project, $this-getName(), (new Naming())-getUniqueKey(array(build default)), array(origin $directory, config $config), MyBuild: . $config[command] )); }第三步实现 prepareJob把项目文件镜像到构建目录这一步参考 JoliCiBuildStrategy.php 的做法先把项目源码镜像到临时构建目录再写入自定义 Dockerfilepublic function prepareJob(Job $job) { $params $job-getParameters(); $target $this-buildPath . DIRECTORY_SEPARATOR . $job-getDirectory(); // 1. 镜像项目源码 $this-filesystem-mirror($params[origin], $target, null, array( delete true, override true, )); // 2. 写入自定义 Dockerfile file_put_contents($target . /Dockerfile, FROM . $params[config][image] . \n . CMD [ . $params[config][command] . ] ); } 关键细节JoliCi 通过 Executor.php 在 Docker 容器中执行 JobprepareJob准备的目录会被打包成 Docker 镜像并运行所以生成正确的 Dockerfile是策略的核心职责。让 JoliCi 认识你的策略修改 Container 依赖注入新策略写好后需要注册到依赖注入容器 Container.php 中JoliCi 才会使用它。JoliCi 内置的ChainBuildStrategy支持链式挂载多个策略谁支持当前项目谁就生效。public function getChainStrategy() { $strategy new ChainBuildStrategy(); $strategy-pushStrategy($this-getTravisCiStrategy()); $strategy-pushStrategy($this-getJoliCiStrategy()); $strategy-pushStrategy($this-getMyStrategy()); // 你的新策略 return $strategy; }这样配置后jolici run会自动检测项目有.travis.yml用 TravisCi 策略有.jolici目录用 JoliCi 策略有mybuild.yml就用你的新策略编写测试验证自定义构建策略JoliCi 的测试写法很规范建议参考 JoliCiBuildStrategyTest.php 和 TravisCIBuildStrategyTest.php。核心是覆盖三个场景✅supportProject对正确/错误项目分别返回true/false✅getJobs能按配置生成预期数量的 Job✅prepareJob后构建目录中出现了 Dockerfile 和项目文件常见问题与调试技巧Q1运行后提示 Project is not supported by any strategy说明所有策略的supportProject都返回了false检查你的配置文件路径是否正确。Q2为什么我的 Job 数量不对getJobs返回的 Job 数组一个数组元素就是一个任务。多环境多版本、多 env场景可借助 Matrix.php 生成笛卡尔积组合TravisCi 策略就是这么做的。Q3如何调试策略用jolici run -v开启详细日志可以看到每个 Job 的构建过程。总结编写自定义BuildStrategy 构建策略只需四步实现接口的 4 个方法 → 在 Container 中注册 → 写测试验证 → 运行jolici run看效果。掌握了这套扩展机制你就能让 JoliCi 支持任意自定义的 CI 配置文件真正打造属于自己的本地持续集成工具。如果想让更多人受益别忘了把策略通过 CONTRIBUTING.md 贡献回社区哦【免费下载链接】JoliCi:white_check_mark: JoliCi - Run your TravisCi builds locally项目地址: https://gitcode.com/gh_mirrors/jo/JoliCi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表