Carafe

This is a tool for deploying Elixir applications, built upon capistrano.

Carafe requires git for hosting the source repository. It depends on Edeliver for a few parts that are not handled in Carafe yet. Release building requires Distillery.

Currently, only full releases, not upgrades, are supported, and archives are kept locally.

Installation

Prerequisites, Ruby side

You need ruby >= 2.0 installed in your development environment. The recommended way of installing dependencies on the ruby side is via bundler. Create a Gemfile at the project root containing:

source "https://rubygems.org"

group :development do
  gem "carafe"
end

Then run bundle install --path vendor/bundle, followed by bundle exec cap install. This gives you these additional files:

o .bundle/config
+ Capfile
+ Gemfile
+ Gemfile.lock
o vendor/bundle
+ config/deploy.rb
+ config/deploy/staging.rb
+ config/deploy/production.rb

Files behind o should be gitignored, the others checked in. Add the following line to the Capfile:

require "carafe"

Prerequisites, Elixir side

Add these deps to your mix.exs:

  defp deps do
    [
      {:edeliver, "~> 1.4.2"},
      {:distillery, "~> 0.9"},
      {:carafe, "0.2.0"}
    ]
  end

and run mix deps.get. Add :edeliver to your :extra_applications AS LAST:

  def application do
    [extra_applications: [:logger, :edeliver]]
  end

Configuration

First, configure your application for distillery.

The Capistrano documentation on configuration gives you all the technical details on configuration in general. Note that Carafe does not use most of the variables listed there. Below you find a short introduction that gets you started.

General configuration goes into config/deploy.rb. Capistrano has the concept of "stages", and stage specific configuration goes into separate files. For the production stage this would be config/deploy/production.rb. Stage specific configuration has precedence over general one.

To configure the deployment process, we mostly set variables and declare servers, as in this example snippet:

set :application, "my_app"
set :repo_url, "https://github.com/...."

set :repo_path, "dummy1_repo"
set :build_path, "build_path"
server "buildhost1", user: "user", roles: ["build"]

Note we are declaring a host (and how to connect to via ssh) to be a build host by giving it the "build" role. There obviously must be only one buildhost. In config/deploy/production.rb, we might write

server "main", user: "user", roles: ["app"]

to declare a server as a node to deploy our app to. Documentation on the server options can be found here.

Here are the config variables honored by carafe:

Varible Used for/as...
:branch git branch to build the release from, or :current for current branch
:repo_url cloning the repo on the build host
:repo_path path of repository cache on build host
:mix_env MIX_ENV environment when running release mix task from distillery
:application name of the OTP application
:distillery_environment name of the distillery environment, defaulting to the value of :mix_env
:build_path path to build release on build host
:app_path path on application server where releases are unpacked and operated

Umbrella project deployments

A demonstration for an umbrella project is in the dummies/dummy2 test dummy project.

Usage

Currently, only deploying releases is supported. Every deploy scenario is a bit different, so you need to tell how a deploy is to be done. In deploy.rb, add the following line:

task "deploy" => [
  "buildhost:generate_release",
  "buildhost:archive:download",
  "node:archive:upload_and_unpack",
  "node:full_restart"
]

You should now be able to perform a production deploy with the command bundle exec cap production deploy.

Development & Contributing

Coming soon.