Deli

A simple deploy task for Elixir applications, using a few edeliver tasks under the hood.

Releases are built locally with docker containers, and systemd is used for controlling the app (systemctl (restart | status)).

Git tags are enforced to keep versioning relevant, and matching with your mix.exs.

Configuration

You don't need to think about edeliver with deli. Deli generates any config needed for edeliver, and adds them to your gitignore by default.

Add deli to your deps:

def deps do
  [
    # ...
    {:deli, "~> 0.1.2", only: :dev}
  ]
end

Then add some configuration in your config/config.exs:

config :deli,
  hosts: [
    staging: [
      "staging-01.your_app.com",
      "staging-02.your_app.com"
    ],
    production: [
      "prod-01.your_app.com",
      "prod-02.your_app.com",
      "prod-03.your_app.com",
      "prod-04.your_app.com",
      "prod-05.your_app.com",
      "prod-06.your_app.com"
    ]
  ]
$ mix deli

The command above does full cycle deploy:

  • Creates a local build environment (docker)
  • Builds release in this container (edeliver)
  • Deploys release to target environment (edeliver)
  • Restart target apps (systemctl)
  • Checks status (systemctl)
  • Pings application (edeliver)

It will assume staging environment by default.

To target prod environment, do:

$ mix deli -t prod

Using production is equivalent to prod.

For more deploy options, do:

$ mix help deli

Releases should be configured in your application with distillery.

At this point, this package exists to reuse a very simple flow for similarly configured apps. It might not be flexible enough for your needs yet.

Potential future work

  • Remove edeliver dependency, replacing its steps by local code
  • Add documentation, tests and typespecs
  • Log in debug mode
  • Allow configuration for other admin tools (systemctl / edeliver / ?)
  • Allow configuring other docker build targets (currently only centos:7.6)
  • Allow configuring docker build elixir / otp / rebar versions
  • Provide default distillery config (distillery)
  • Default release service assets (nginx, systemd, logrotate etc)
  • Parallel restarts
  • Retry / rollback strategy
  • Upgrades
  • PRs are welcome! The intent is to keep this task simple to use over time, and add flexibility through configuration rather than CLI args or ENV, providing good defaults.