Current section
Files
Jump to
Current section
Files
lib/bottler.ex
require Logger, as: L
require Bottler.Helpers, as: H
defmodule Bottler do
@moduledoc """
To run:
```
run_erl -daemon /tmp/app/pipes/ /tmp/app/log "erl -boot /tmp/app/current/start -config /tmp/app/current/sys -env ERL_LIBS /tmp/app/lib -sname app"
```
To attach:
```
to_erl /tmp/app/pipes/erlang.pipe.1
```
"""
@doc """
Entry point for `mix release` task. Returns `:ok` when done.
"""
def release(config), do: Bottler.Release.release config
@doc """
Copy local release file to remote servers
Returns `{:ok, details}` when done, `{:error, details}` if anything fails.
"""
def ship(config) do
L.info "Shipping to #{config[:servers] |> Keyword.keys |> Enum.join(",")}..."
app = Mix.Project.get!.project[:app]
config[:servers] |> Keyword.values |> H.in_tasks( fn(args) ->
args = args ++ [remote_user: config[:remote_user]]
"scp rel/#{app}.tar.gz <%= remote_user %>@<%= ip %>:/tmp/"
|> EEx.eval_string(args) |> to_char_list |> :os.cmd
end, expected: [], inspect_results: true)
end
@doc """
Install previously shipped release on remote servers.
Returns `{:ok, details}` when done, `{:error, details}` if anything fails.
"""
def install(config), do: Bottler.Install.install(config)
@doc """
Restart app on remote servers.
It merely touches `app/tmp/restart`, so something like
[Harakiri](http://github.com/elpulgardelpanda/harakiri) should be running
on server.
TODO: Wait until _current_ release is seen running.
Returns `{:ok, details}` when done, `{:error, details}` if anything fails.
"""
def restart(config) do
L.info "Restarting #{config[:servers] |> Keyword.keys |> Enum.join(",")}..."
app = Mix.Project.get!.project[:app]
config[:servers] |> Keyword.values |> H.in_tasks( fn(args) ->
args = args ++ [remote_user: config[:remote_user]]
"ssh <%= remote_user %>@<%= ip %> 'touch #{app}/tmp/restart'"
|> EEx.eval_string(args) |> to_char_list |> :os.cmd
end, expected: [], inspect_results: true)
end
end