Based on my recent experience of deployment, I've become rather frustrated with the deployment tooling in Elixir. This document is the result of me thinking to myself, "I wish we had x...". This document isn't meant to dishearten anyone who has built tooling for elixir - thank you so much for what you've done. This is meant more as what I personally see as something that would help a lot of Erlang/Elixir newbies like myself to be able to get deploying quickly and efficiently.
It should be possible to add in custom configuration to the bootstrap scripts. This would allow plugins to be able to add extra steps to the startup / shutdown / upgrade procedure. One way to implement this would be to make all scripts which handle bootstrapping or controlling the machine .eex templates. This would allow other parts of the release system to inject new functionality where needed.
vm.args
contains information about how the VM should run your elixir app. If you don't know what the server is like beforehand, it can be hard to produce a vm.args
that will fit your needs. Creating the vm.args
as part of the bootstrapping process would allow for more efficient use of BEAM, as well as configuration of things like the name
and sname
, which are often dependent on the hostname of the machine.
It's been established that this is actually already possible. Better documentation around this would be great.
Init scripts will remain largely the same across projects. It makes sense to provide defaults for each init type, in the same way foreman works.
We agree that this is not the responsibility of exrm
directly, but rather that of a plugin.
The release config file should be easy to configure, and match closely the patterns that people are used to following in config.exs
.
I think the phases of the release process should be simple to add to & reason about. I was imagining a config that has something like this in it:
def deploy_pipeline(foo) do
foo
|> PhoenixOverlay.compile_static_assets
|> Exrm.build
|> CustomOverlay.do_thing_a
|> CustomOverlay.do_thing_b
|> ExrmDebPlugin.package
|> AptPlugin.release
end
Where PhoenixOverlay
, ExrmDebPlugin
and AptPlugin
are External plugins, and CustomOverlay
is some internal config specific to that app.
The release configuration file can override steps with custom steps, and also add new steps. In addition, plugin steps can be added to the pipeline.
External Output plugins would be able to take a successful build, and do something with it (exrm-rpm is already capable of this). This could be:
- SCP the result to a server and upgrade
- Build a debian Package - DONE! exrm_deb now exists.
- Send a notification on Slack
Advantages over not being a plugin:
Can use information from mix.exs automaticallyCan upgrades can be handled automatically through apt hooksAbility to create metapackages for umbrella apps
I've began work on a deb plugin, which you can check out here: https://github.com/johnhamelink/exrm-deb
Advantages:
- Is able to detect when an update is happening automatically
- Simple to setup when deploying to a non-cloud VPS or bare metal
Advantages:
- Can provide information about
- which apps changed (if in an umbrella)
- what environment they were built to deploy to
My question: would a repository of compiled ERTS for all architectures be helpful? I would imagine an accompanying Exrm plugin for pulling from the repository would be helpful. And also, what should be hosted? I'm not too familiar on architectures, should we compile ERTS for each distro?
Like this:
Or by architecture? x86, x86_64, armv5... etc.
We're tracking this through this github issue: https://github.com/erts-io/erts_web/issues/3