1

在构建一些配方时,我们发现如果系统已经处于良好状态但更新仍然运行,则作为流程的一部分触发 apt_update 会大大减慢速度。

为了解决这个问题,我们使用 action :nothing 进行了 apt_update 调用,然后设置任何实际需要更新以通知 :before 或 :immediately 的内容(例如在安装包之前或添加 apt 存储库之后,尽管可以控制存储库案例添加时通过标志)。

我们想测试 apt_update 调用仅在必要时触发,并且不会作为不会安装包的收敛的一部分运行。

apt_update 'update' do
  action :nothing
end

apt_repository 'git-core' do
  uri          'ppa:git-core/ppa'
  distribution node['lsb']['codename']
  notifies :update, 'apt_update[update]', :immediately
end
4

2 回答 2

1

我花了很长时间才找到实际测试 apt_update 的代码,甚至更长时间才能理解它,当我想测试它总是在正确的时间运行 apt_update 时,我需要更长的时间,而我需要它在编译早期触发阶段而不是收敛阶段。

it 'triggered apt update' do
  ppa_call = chef_run.apt_repository('git-core')
  expect(ppa_call).to notify('apt_update[update]').to(:update).immediately
end

it 'default apt update' do
  expect(chef_run).to update_apt_update('update')
end

it 'install git' do
  expect(chef_run).to install_apt_package('git')
end

我不记得在哪里找到了条件触发语法,但是在再次查找常规 apt_update 测试后,我终于在 chefspec 示例中找到了它。https://github.com/chefspec/chefspec/blob/master/examples/apt_update/spec/update_spec.rb

于 2018-02-23T03:30:39.313 回答
0

运行 kitchen blend 以检查 apt_repository 是否在每次运行时都被执行,或者如果存储库已经存在则跳过。我不确定该资源是否是幂等的。如果它不是幂等的,它肯定会在每次运行时通知更新。我建议为 apt_repository 添加一个保护子句,以便在存储库已经存在时跳过。

单元测试将无法确认仅在添加新存储库时才会调用更新。

于 2018-03-10T13:28:30.327 回答