我有一个旧的单一食谱回购用于创建Vagrant的完整开发环境。我想"重构"根据最佳做法。我想分割大型烹饪书,制作适当的社区食谱包装食谱,并添加可由Testkitchen运行的InSpec测试,以便检查所有内容是否按预期安装。
我决定从头开始,看看通过执行chef generate app some_name
将创建 skeleton 。此命令生成以下文件集:
.
|-- .gitignore
|-- .kitchen.yml <----------
|-- README.md
|-- cookbooks
| `-- some_name
| |-- Berksfile
| |-- chefignore
| |-- metadata.rb
| |-- recipes
| | `-- default.rb
| `-- spec
| |-- spec_helper.rb
| `-- unit
| `-- recipes
| `-- default_spec.rb
`-- test
`-- smoke
`-- default
`-- default_test.rb
我注意到在根中创建了.kitchen.yml
。从现在开始建议为每个食谱创建单个VCS repo,在根目录中.kitchen.yml
看起来有点奇怪。但另一方面,保持VM配置以便在单个根文件中测试我的所有cookbook及其测试套件是个好主意。
然后我决定检查我是否能够从根.kitchen.yml
运行所有项目的烹饪书的测试。
我制作了一个简单的包装器手册,用于安装Java,并在cookbook的depends 'java'
中使用metadata.rb
并准备了根.kitchen.yml
。
我从根目录运行kitchen test
时面临的问题是,在执行厨房测试时,社区食谱java
未得到解决。我尝试将Barksfile
添加到cookbook目录中,但它没有帮助(仍然是未知的java
依赖项)。看起来像Kitchen只适用于相对于.kitchen.yml
的Berksfile。然后我尝试在项目根目录中添加Berksfile
,当然,它不起作用,因为它还会在根目录中搜索metadata.rb
。
所以看起来对项目根目录中的所有cookbook都有一个.kitchen.yml
不是一个好主意。为什么它会产生呢?我也不喜欢我必须在每个cookbook的目录中编写几乎相同的.kitchen.yml
,但看起来如果想要从metadata.rb
解析依赖关系,我别无选择。
如果您还可以建议我使用包装器/角色烹饪书+测试的最佳实践的一个很好的示例repo,那将是很好的。我的项目很简单:它只是创建一些用户,准备环境并安装大量服务,主要使用包装的社区烹饪书。我希望将它保存在单个回购中并使用Kitchen + InSpec进行测试
答案 0 :(得分:1)
app
是manyrepo和monorepo设计的混合体,因此在这种结构中,您可以将所有本地烹饪书保存在单个回购中,并根据需要提取外部内容。 root kitchen.yml的想法是有一个地方为整个应用程序做顶级测试。通常这意味着最近测试政策而不是烹饪书,有关这方面的例子,请参阅https://github.com/poise/yolover-example。
至于食谱解决问题,如果不使用策略,你可能想要一个根Berksfile,尽管它可能只是:
source 'https://supermarket.chef.io/'
source chef_repo: '.'
cookbook 'whatever'
这种app
风格有点像实验,可能需要稍作修改/更新。