Current section
Files
Jump to
Current section
Files
lib/mix/tasks/deploy.ex
defmodule Mix.Tasks.Deploy do
@moduledoc """
Deploy a release for the current mix application.
## Examples
# Deploy a release using defaults
mix deploy
"""
@shortdoc "Deploy a release for the current mix application"
use Mix.Task
import DeployManager.Utils
def run args do
parse_args(args)
|> clean_local_source_tree
|> upload_sources
|> build_on_remote
end
def clean_local_source_tree config do
config
|> log_info("Cleaning local source tree")
|> execute_locally("mix clean")
end
def upload_sources config do
config
|> log_info("Uploading sources")
|> execute_locally(~s(rsync -avz --rsh=ssh #{if Map.has_key?(config, :link_files), do: config.link_files |> Enum.map(&("--include='#{&1}'")) |> Enum.join(" ")} --exclude='.git' --filter=':- .gitignore' ./ #{remote_server config}:#{config.deploy_to}))
end
def build_on_remote config do
config
|> log_info("Getting Elixir dependencies on remote")
|> execute_remotely("mix deps.get --only prod")
|> log_info("Compiling application on remote")
|> execute_remotely("MIX_ENV=prod mix compile")
|> log_info("Getting NodeJS dependencies on remote")
|> execute_remotely("npm install")
|> log_info("Compiling assets on remote")
|> execute_remotely("node node_modules/brunch/bin/brunch build")
|> execute_remotely("MIX_ENV=prod mix phoenix.digest")
|> log_info("Building release on remote")
|> execute_remotely("MIX_ENV=prod mix release")
end
end