'chef generate app' 生成的项目根目录中的 .kitchen.yml 文件的用途是什么?

What is the purpose of .kitchen.yml file in the root of project generated by 'chef generate app'?

我有一个旧的食谱库,用于使用 Vagrant 创建一个完整的开发环境。我想根据最佳实践 "refactor" 它。我想拆分大型食谱,为社区食谱制作适当的包装食谱,并添加 InSpec 测试 运行可由 Testkitchen 启用,以检查所有内容是否按预期安装。

我决定从头开始,看看通过执行 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 存储库,因此在根目录中包含 .kitchen.yml 对我来说有点奇怪。但另一方面,将 VM 配置保留在单个根文件中以测试我的所有说明书及其测试套件可能是个好主意。

然后我决定检查我是否能够 运行 从根目录 .kitchen.yml 测试所有项目的说明书。 我制作了一个简单的包装食谱,用于安装 Java,在食谱的 metadata.rb 中使用 depends 'java',并准备了根目录 .kitchen.yml.

我 运行ning kitchen test 从根本上面临的问题是社区食谱 java 在执行厨房测试时没有得到解决。我试图将 Barksfile 添加到 cookbook 目录中,但没有帮助(仍然未知 java 依赖项)。看起来 Kitchen 仅适用于 .kitchen.yml 相关的 Berksfile。然后我尝试在项目根目录中添加 Berksfile 当然,它没有用,因为它还在根目录中搜索 metadata.rb.

所以看起来为项目根目录中的所有食谱设置一个 .kitchen.yml 并不是一个好主意。那为什么会产生呢?我也不喜欢我必须在每本食谱的目录中编写几乎相同的 .kitchen.yml,但看起来如果想从 metadata.rb.

解决依赖关系我别无选择

如果您还可以向我推荐一个实施 wrapper/role-cookbooks + 测试最佳实践的很好的示例回购协议,那就太好了。我的项目很简单:它只是创建一些用户,准备环境并安装大量服务,主要使用包装的社区说明书。我想将它保存在单个仓库中并使用 Kitchen + InSpec

进行测试

app 是 manyrepo 和 monorepo 设计的混合体,因此在该结构中,您可以将所有本地食谱保存在单个 repo 中,并根据需要引入外部内容。 root kitchen.yml 的想法是有一个地方可以对整个应用程序进行顶级测试。通常这意味着现在要测试政策而不是食谱,请参阅 https://github.com/poise/yolover-example 了解相关示例。

至于食谱解析问题,如果不使用策略,您可能确实需要一个根 Berksfile,尽管它可以只是:

source 'https://supermarket.chef.io/'
source chef_repo: '.'
cookbook 'whatever'

这种 app 风格有点像实验,可能需要 revised/updated 一点,因为它已经过时了。