Erlang/Elixir: 用Distillery替換Exam打包器

developerworks發表於2019-02-16

Elixir 部署系列

Erlang/Elixir: 用Distillery替換Exam打包器
Erlang/Elixir: Edeliver 持續部署 Checklist
Erlang/Elixir: 使用 Edeliver 進行持續部署

簡要

Distillery 是一個新的在未來用於替換Exrm的Elixir應用程式釋出工具. 它有比Exrm更快的構建速度, 完全用Elixir開發, 更靈活的配置, 目標是成為MIX本身的一部分, 作為Elixir的標準工具.

Distillery 還提供了一個外掛機制來管理整個部署過程中的各個階段

從Exrm切換到Distillery需要執行如下步驟:

  • 刪除 mix.exs 檔案中的 :exrm 依賴

  • 新增 :distillery 依賴到 mix.exs

    defp deps do
      [ ...
        {:distillery, ">= 0.9.0", warn_missing: false},
        {:edeliver, ">= 1.4.0"},
      ]
    end
  • 確保 Edeliver 版本 >= 1.4.0

  • 執行 mix do deps.clean --unlock --unused, deps.get, deps.compile

  • 執行 mix release.init 建立 Distillery 的配置檔案

  • 按照 Distillery 文件編輯 rel/config.exs 配置檔案

  • .gitignore 中去掉 rel 目錄, 並新增 rel/<app name>

  • 新增配置檔案和修改的.gitignore到Git倉庫

  • 轉換現有的 exrm 外掛distillery 外掛

對於傘型專案, 可能需要調整路徑, 因為現在釋出在專案的根目錄構建和生成, 另外, 預設所有的傘型釋出單獨構建, 也可以構建到單獨的釋出中.

參考 Issue #128

關於構建主機的環境問題

如果我們有很多依賴不同Erlang, Elixir 版本的專案, 為了能夠使用正確的環境, 通過SSH連線到構建主機之後, 可以通過在 .deliver/config 配置檔案中新增鉤子函式來切換環境

# 準備構建環境

post_git_push() {
  status "Erlang/Elixir環境準備: 使用 Using OTP 19.0 和 Elixir 1.3.1"
  __sync_remote "
  source /home/ycc/.kerl/install/19.0_default/activate
  source /home/ycc/.kiex/elixirs/elixir-1.3.1.env
  "
}

# Phoenix 專案需要的設定, 用於把密碼配置匯入到釋出包中

pre_erlang_get_and_update_deps() {
  local _prod_secret_path="/home/ycc/prod.secret.exs"
  if [ "$TARGET_MIX_ENV" = "prod" ]; then
    __sync_remote "
      ln -sfn `$_prod_secret_path` `$BUILD_AT/config/prod.secret.exs`
    "
  fi
}
  • status 命令列輸出狀態行

  • __sync_remote 執行遠端Shell命令

系統啟動指令碼(Upstart)

deploy@host:~$ cat /etc/init/example_phoenix.conf
description "example_phoenix"

setuid deploy
setgid deploy

start on runlevel [2345]
stop on runlevel [016]

expect stop
respawn

env HOME=/home/deploy/example_phoenix
export HOME

pre-start exec /bin/sh /home/deploy/example_phoenix/bin/example_phoenix start
post-stop exec /bin/sh /home/deploy/example_phoenix/bin/example_phoenix stop

相關文章