Releasing Elixir/Phoenix
get_user(“Yaroslav Martsynyuk”)
|> elixir_club(12)
|> kyiv()
applications
WISE ENGINEERING
Distillery Is Your Friend
- Inits release config
- Builds release binary
- Builds upgrade/downgrade tarball
- Doesn’t deploy app
- Doesn’t upgrade/downgrade app
defp deps do
[
{:phoenix, "~> 1.3.0"},
{:phoenix_pubsub, "~> 1.0"},
{:phoenix_ecto, "~> 3.2"},
{:phoenix_html, "~> 2.10"},
{:phoenix_live_reload, "~> 1.0", only: :dev},
{:gettext, "~> 0.11"},
{:cowboy, "~> 1.0"},
{:distillery, "~> 1.5.2"}
]
end
Installation
$> MIX_ENV=prod mix release.init
use Mix.Releases.Config,
default_release: :web,
default_environment: Mix.env()
environment :prod do
set include_erts: true
set cookie: “ M*~{1amT9B(cG9qoi3I*a>BUS{AkC;Lb<hh~BG[g ”
end
release :web_app do
set version: current_version(:web)
end
Init Release
- Increase app version in mix.exs
- Hot upgrades are possible with included ERTS only
- Don’t mess up with cookie
$> MIX_ENV=prod mix deps.get --only prod
$> MIX_ENV=prod mix release [--upgrade] --env=prod
Create Release/Upgrade
#! /usr/bin/env
V=$(grep 'version' mix.exs | cut -d'"' -f2)
if["$(ssh user@host /tmp/bin/demo_app ping)" = "pong" ]; then
bash ./upgrade.sh
else
cd ~/demo_app
MIX_ENV=prod mix deps.get --only prod
MIX_ENV=prod mix release --env=prod
scp .../releases/${V}/demo_app.tar.gz user@host:/home/user/demo_app
ssh user@host tar -xf demo_app.tar.gz -C /home/user/demo_app
ssh user@host /home/user/demo_app/bin/demo_app start
fi
Install Script
#! /usr/bin/env
V=$(grep 'version' mix.exs | cut -d'"' -f2)
cd ~/demo_app
MIX_ENV=prod mix deps.get --only prod
MIX_ENV=prod mix release --env=prod --upgrade
scp .../releases/${V}/demo_app.tar.gz
user@host:/home/user/demo_app/releases/${V}
ssh user@host /home/user/bin/demo_app upgrade
Upgrade Script
OTP
FROM elixir:1.5.2
ENV APP_NAME demo_app
EXPOSE 4000
...
RUN mix deps.get
RUN MIX_ENV=prod mix release.init
RUN MIX_ENV=prod mix release
CMD MIX_ENV=prod _build/prod/rel/demo_app/bin/web foreground
Docker/Kubernetes
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: demo_app
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0%
maxSurge: 35%
replicas: 30
...
Docker/Kubernetes
...
|> have_questions?()
|> thx!()

Releasing Elixir/Phoenix Applications

  • 1.
    Releasing Elixir/Phoenix get_user(“Yaroslav Martsynyuk”) |>elixir_club(12) |> kyiv() applications WISE ENGINEERING
  • 2.
    Distillery Is YourFriend - Inits release config - Builds release binary - Builds upgrade/downgrade tarball - Doesn’t deploy app - Doesn’t upgrade/downgrade app
  • 3.
    defp deps do [ {:phoenix,"~> 1.3.0"}, {:phoenix_pubsub, "~> 1.0"}, {:phoenix_ecto, "~> 3.2"}, {:phoenix_html, "~> 2.10"}, {:phoenix_live_reload, "~> 1.0", only: :dev}, {:gettext, "~> 0.11"}, {:cowboy, "~> 1.0"}, {:distillery, "~> 1.5.2"} ] end Installation
  • 4.
    $> MIX_ENV=prod mixrelease.init use Mix.Releases.Config, default_release: :web, default_environment: Mix.env() environment :prod do set include_erts: true set cookie: “ M*~{1amT9B(cG9qoi3I*a>BUS{AkC;Lb<hh~BG[g ” end release :web_app do set version: current_version(:web) end Init Release
  • 5.
    - Increase appversion in mix.exs - Hot upgrades are possible with included ERTS only - Don’t mess up with cookie $> MIX_ENV=prod mix deps.get --only prod $> MIX_ENV=prod mix release [--upgrade] --env=prod Create Release/Upgrade
  • 6.
    #! /usr/bin/env V=$(grep 'version'mix.exs | cut -d'"' -f2) if["$(ssh user@host /tmp/bin/demo_app ping)" = "pong" ]; then bash ./upgrade.sh else cd ~/demo_app MIX_ENV=prod mix deps.get --only prod MIX_ENV=prod mix release --env=prod scp .../releases/${V}/demo_app.tar.gz user@host:/home/user/demo_app ssh user@host tar -xf demo_app.tar.gz -C /home/user/demo_app ssh user@host /home/user/demo_app/bin/demo_app start fi Install Script
  • 7.
    #! /usr/bin/env V=$(grep 'version'mix.exs | cut -d'"' -f2) cd ~/demo_app MIX_ENV=prod mix deps.get --only prod MIX_ENV=prod mix release --env=prod --upgrade scp .../releases/${V}/demo_app.tar.gz user@host:/home/user/demo_app/releases/${V} ssh user@host /home/user/bin/demo_app upgrade Upgrade Script
  • 8.
  • 9.
    FROM elixir:1.5.2 ENV APP_NAMEdemo_app EXPOSE 4000 ... RUN mix deps.get RUN MIX_ENV=prod mix release.init RUN MIX_ENV=prod mix release CMD MIX_ENV=prod _build/prod/rel/demo_app/bin/web foreground Docker/Kubernetes
  • 10.
    apiVersion: extensions/v1beta1 kind: Deployment metadata: name:demo_app spec: strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 0% maxSurge: 35% replicas: 30 ... Docker/Kubernetes
  • 11.