0

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

我决定从头开始,看看通过执行会创建什么骨架chef generate app some_name。此命令生成以下文件集:

.
|-- .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 配置保留在单个根文件中可能是一个好主意。

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

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

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

如果您还可以建议我一个很好的示例 repo 来实现包装器/角色-cookbooks + 测试的最佳实践,那就太好了。我的项目很简单:它只是创建一些用户、准备环境并安装大量服务,主要使用包装好的社区食谱。我想将它保存在单个仓库中并使用 Kitchen + InSpec 进行测试

4

1 回答 1

1

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

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

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

这种app风格在某种程度上是一种实验,随着它的老化,可能需要进行一些修改/更新。

于 2017-10-23T21:28:02.680 回答