2025年5月20日火曜日

Chef cookbooks のテストを kitchen-docker を使って書く

Chef cookbooks のテストを kitchen-docker を使って書く

概要

更に kitchen-docker を使うので毎回クリーンな環境に対して実際にレシピを実行してテストすることができます

環境

  • macOS 15.4
  • docker 28.1.1
  • Ruby 3.4.3
    • kitchen 3.0.0
    • chef 18.7.6

必要な gem のインストール

  • vim Gemfile
# frozen_string_literal: true

source 'https://rubygems.org'

group :development do
  gem 'csv'
  gem 'inspec'
  gem 'kitchen-docker'
  gem 'kitchen-inspec'
  gem 'test-kitchen'
end

テストの作成

  • vim test/integration/default/default_test.rb
# frozen_string_literal: true

emacs_binary = '/usr/local/bin/emacs'

control 'emacs-install' do
  impact 1.0
  title 'Check Emacs installation'

  describe file(emacs_binary) do
    it { should exist }
    it { should be_executable }
  end

  describe command("#{emacs_binary} --version") do
    its('exit_status') { should eq 0 }
    expect = /GNU Emacs/
    its('stdout') { should match expect }
  end
end

kitchen 用の設定ファイルの作成

  • vim .kitchen.yml
driver:
  name: docker

provisioner:
  name: chef_zero

platforms:
  - name: ubuntu-22.04

suites:
  - name: default
    run_list:
      - recipe[cookbooks-emacs::default]
    attributes:
      owner: root
      group: root
    verifier:
      name: inspec

動作確認

  • bundle exec kitchen test

最初に kitchen でテストするようのイメージをビルドします
そしてそのイメージを元に chef を実行するコンテナが起動します

% docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS     NAMES
fe474147bd7b   3d1e259aa0fe   "/usr/sbin/sshd -D -…"   36 minutes ago   Exited (0) 27 minutes ago             defaultubuntu2204-username-machinename-6n9j5hv9
% docker images
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
<none>       <none>    3d1e259aa0fe   About an hour ago   241MB

おまけ: Github Action で実行する

  • vim .github/workflows/kitchen.yml
name: Kitchen test

on:
  push:
    branches:
      - "master"

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Install dependencies
        run: bundle install

      - name: Set up Docker
        uses: docker/setup-docker-action@v3

      - name: Run Test Kitchen
        run: |
          bundle exec kitchen test
        env:
          CHEF_LICENSE: accept

CHEF_LICENSE: accept を忘れずに設定しましょう

トラブルシューティング

[2025-05-18T10:28:25+09:00] ERROR: Chef InSpec cannot execute without valid licenses.

基本は InSpec を使うのにライセンスが必要なのでライセンス登録をしましょう (有償)

もしくは verifier の name を shell にすることでも対応できます

最後に

kitchen-docker を使えば簡単に cookbooks をクリーンな環境で毎回テストできます
Github Action でも使えるので

参考サイト

0 件のコメント:

コメントを投稿