Upgrading to 2.x
Upgrading From 1.5.x¶
Many things have changed since the last 1.5 release, with a number of deprecations, improvements, and new features. The following is a guide to the things which you will need to change coming from 1.5, whether using Distillery directly, or writing tools which build on Distillery:
Custom Commands¶
In 1.5.x, you may have used any of the following helpers in the bin/myapp script:
command MODULE FUNrpc MODULE FUN ARGSrpcterms MODULE FUN TERMeval EXPR
These have seen breaking changes:
command MODULE FUN(soft deprecated) - same as old version, switch toevalrpcterms MODULE FUN TERM(hard deprecated) - removed entirely from 2.x, userpcinsteadrpc EXPR- takes a string of Elixir code, and executes it on the remote noderpc --file path/to/script- takes a path to an Elixir script and executes it on the remote nodeeval EXPR- takes a string of Elixir code, and executes it on a clean node, with no applications started (similar to howcommandworked)eval --file path/to/script- takes a path to an Elixir script and executes it on a clean node
Additionally, you can pass --mfa "Module.fun/arity" to execute the given MFA using arguments
passed to the rpc or eval command (depending on which was called). The number of arguments passed
must match the arity of the function. Use --argv with --mfa to pass all arguments as a single
list of arguments, such as you’d get back from :init.get_plain_arguments/0 or receive in a Mix task.
Here are some examples:
command Elixir.MyApp.Release.Tasks migratebecomeseval 'MyApp.Release.Tasks.migrate()', oreval --mfa 'MyApp.Release.Tasks.migrate/0'rpc 'Elixir.Application' get_env myapp foobecomesrpc'Application.get_env(:myapp, :foo)'rpcterms calendar valid_date '{2018,1,1}'becomesrpc ':calendar.valid_date({2017,1,1})'
Tip
You can build Mix task-like custom commands using --mfa and --argv, like so:
1 | release_ctl eval --mfa "Mix.Tasks.MyTask.run/1" --argv -- "$@" |
The end result is that are now just two commands, rpc and eval, both of which work the exact
same way, with the only distinction being the execution environment of the
provided script or expression - local for eval and remote for rpc. With
eval, the execution environment has all code available, but no applications
started, so it is ideal for things like migrations.
Hooks¶
If you were using set <event>_hook: "path/to/script.sh" where <event> was any
of the lifecycle events you could hook into, e.g. pre_start; you must now use
set <event>_hooks: "path/to/directory/of/hooks". The path given must be a
directory, and should contain all of the hooks for that event. The old options
have been removed.
Executables¶
The exec_opts option is deprecated, and combined with the executable option.
You now should use set executable: [enabled: true, transient: boolean] to
build an executable release with the relevant options set.
New Features¶
The following have been added, and you should take a look in the docs for more information as they are big quality of life improvements!
- Config Providers! This is a framework for format-agnostic, source-agnostic
runtime configuration providers, which allow you to fetch configuration and
push it into the application env before applications in the system have
booted. See the docs and the
Distillery.Releases.Config.Providermoduledoc for more information. If you are curious about what a custom provider looks like, check out this library, which has a provider for TOML. Distillery also contains a provider forMix.Configout of the box. - Appup Transforms! This is a plugin system for programmatically modifying appups during a release build. Use this to tweak the way appups are generated for your applications.
- A new mix task!
mix distillery.gen.appupallows you to generate appups for an application and place it underrelin a new directory which is checked by Distillery when building upgrade releases. This directory can be source controlled, and the generated files can be modified as needed. This is a much needed improvement for those performing hot upgrades! - PID file creation when
-kernel pidfile '"path"'is given invm.args, orPIDFILE="path"is exported in the system environment.
Deprecations¶
Other than the deprecations already mentioned, there are the following:
- The
--verbosityflag no longer exists, use--silent,--quietor--verbose, if you want to adjust the default output. Errors will always be output in all of those modes, but--quietwill also print warnings. - The
:executableoption has changed inrel/config.exs, rather than eithertrueorfalse, it’s either[enabled: boolean, transient: boolean]orfalse. In other words,:executablereflects the executable options, rather than on/off. As a result, the:exec_optsoption is deprecated, and is merged into:executable‘s options list. You can omit:transientfrom:executable, and it will be assumed to be false, as was the default behavior previously.
If you encounter an issue that is not covered here or in the documentation, please open an bug on the issue tracker!