1
votes

Versions:(both build and production systems are same)

Elixir: 1.4.0

OS: Ubuntu 14.04 LTS

Distillery config:

use Mix.Releases.Config,
    default_release: :default,
    default_environment: :prod

environment :dev do
  set dev_mode: true
  set include_erts: false
  set cookie: :"cookie"
end

environment :prod do
  set include_erts: true
  set include_src: false
  set cookie: :"cookie"
end

release :my_app do
  set version: current_version(:my_app)
end

Edeliver config:

APP="my_app"

AUTO_VERSION=git-revision+build-date

BUILD_HOST="my_build_host"
BUILD_USER="deployer"
BUILD_AT="/tmp/my_app"

PRODUCTION_HOSTS="same_as_build_host"
PRODUCTION_USER="deployer"
DELIVER_TO="/home/my_app"

# For *Phoenix* projects, symlink prod.secret.exs to our tmp source
pre_erlang_get_and_update_deps() {
  local _prod_secret_path="/home/xxx/config/prod.secret.exs"
  if [ "$TARGET_MIX_ENV" = "prod" ]; then
    __sync_remote "
      ln -sfn '$_prod_secret_path' '$BUILD_AT/config/prod.secret.exs'
    "
  fi
}

My initial release succeeded with mix edeliver update production --branch=development --start-deploy and the app runs fine. When I try to hot code reload,

mix edeliver build upgrade --branch=development

it fails with the command

build command requires --from= or --with argument.

Isn't edeliver is supposed to take care of this when there is AUTO_VERSION or I have missed any configuration?

Also, executing the command mix edeliver upgrade production --branch=development --verbose, results in the error

==> Upgrade from 0.0.1+297b4ff-20170221 to 0.0.1+f9ffa04-20170222 failed:
  0.0.1+297b4ff-20170221 does not exist at _build/prod/rel/my_app/releases/0.0.1+297b4ff-20170221
==> Failed to build release:
    :bad_upgrade_spec

A remote command failed on:

  deployer@my_host

Output of the command is shown above and the command executed
on that host is printed below for debugging purposes:

FAILED with exit status 1:

    [ -f ~/.profile ] && source ~/.profile
    set -e
    cd /tmp/jn
    if [ "mix" = "rebar" ]; then
      echo "using rebar to generate release"
      ./rebar   -f generate
    elif [ "mix" = "relx" ]; then
      echo "using relx to generate release"
      ./relx release
    elif [ "mix" = "mix" ]; then
      echo "using mix to generate release"
      MIX_ENV="prod" LINK_SYS_CONFIG="" LINK_VM_ARGS="" APP="jn" AUTO_VERSION="git-revision+build-date" BRANCH="development" SKIP_RELUP_MODIFICATIONS="" RELUP_MODIFICATION_MODULE="" USING_DISTILLERY="true" mix do release.version  --verbose,  release --verbose --env="prod" --name="jn" --upgrade --upfrom="0.0.1+297b4ff-20170221"
    fi
3

3 Answers

1
votes

That error on mix edeliver upgrade production --branch=development --verbose looks like you don't have the previous release on your release storage.

You can try to build that release again, deploy it to your servers and try to upgrade.

Hope that helps :)

1
votes

I went into this some time ago and I was unable to make it work out of the box. I ended up doing the copy (symbolic link) myself:

.deliver/config

# Fix
# ==> Upgrade from 0.0.3+71-7a01b46 to 0.0.4+87-6c98597 failed:
#  0.0.3+71-7a01b46 does not exist at _build/prod/rel/...
pre_erlang_generate_release() {
  if [ "$TARGET_MIX_ENV" = "prod" ]; then
    __sync_remote "
      ln -sfn '$REL_DIR' '$BUILD_AT/_build/prod/'
    "
  fi
}

This hook is executed after the release is built and before erlang is to generate the upgrade.