Charmkit Gem Version

elegantly elegant charm authoring

Installation

Add this line to your application's Gemfile:

gem 'charmkit'

And then execute:

$ bundle

Or install it yourself as:

$ gem install charmkit

Usage

In hooks/install:

#!/bin/sh

apt-get update
apt-get install -qyf ruby
gem install bundler

bundle install --local --quiet

# Runs the lib/install.rb hook
bundle exec charmkit install

In other hooks call charmkit with the execing hook (eg. hooks/config-changed)

#!/bin/sh

bundle exec charmkit config-changed

Same for hooks/upgrade-charm

#!/bin/sh

bundle exec charmkit upgrade-charm

Writing Charmkit style hooks

All Charmkit hooks must reside in the charm's toplevel lib/ directory. Those files must match the name of the hook you want to assicate to and must end with a .rb extension.

For example, if my hook runs bundle exec charmkit config-changed then in my lib/ directory should exist a file named lib/config-changed.rb.

To start, you'll want to inherit from the Charmkit class. The class name should also reflect the name of the hook being executed and should be in a standard Ruby camelcase style.

See the syntax below for a the config-changed hook being run:

Syntax

require 'charmkit'

class ConfigChanged < Charmkit
  plugin :core
  plugin :hookenv

  def summon
    package [
        'nginx-full', 'php-fpm',      'php-cgi',      'php-curl', 'php-gd', 'php-json',
        'php-mcrypt', 'php-readline', 'php-mbstring', 'php-xml'
    ], :update_cache

    hook_path = ENV['JUJU_CHARM_DIR']
    app_path = config 'app_path'

    mkdir app_path unless is_dir? app_path

    release = config 'release'

    case release
    when "stable"
      resource_path = resource 'stable-release'
    when "development"
      resource_path = resource 'development-release'
    else
      status :blocked, "Unknown release given #{release}"
      exit 1
    end

    run "tar xf #{resource_path} -C #{app_path} --strip-components=1"

    rm "#{app_path}/conf/install.php" unless !is_file? "#{app_path}/conf/install.php"
  end
end

The core of Charmkit is relatively small and everything is handled through plugins. Current plugins are:

  • core - Gives you access to things like package, mkdir_p, chown_R, etc.
  • hookenv - Provides access to Juju hook items such as resource, unit, juju-log, etc.

Packaging the Charm

You'll want to make sure that any Ruby gems used are packaged with your charm so that you aren't forcing users to try to download those dependencies during deployment.

Easiest way to package your deps is:

$ bundle package

This will place your deps inside vendor/cache which will be uploaded when executing a charm push .

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/charmkit/charmkit. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.