shynome / shynome.github.io

8 stars 0 forks source link

使用 edeliver 进行 Elixir phoenix 热升级实践 #38

Closed shynome closed 8 months ago

shynome commented 3 years ago

title: 使用 edeliver 进行 Elixir phoenix 热升级实践

Elixir |> 我

我对Elixir相当满意, 支持hot reload和多核运行, 能热升级在线版本, 甚至支持集群, 但今天这篇文章讲的只有 Elixir Phoenix 热升级的实践

实践

项目配置

  1. 生成项目
mix phx.new hello --no-ecto
  1. mix.exs中添加下列依赖
def application, do: [
  applications: [
     ...
    # Add edeliver to the END of the list
    :edeliver
  ]
]

defp deps do
  [
    ...
    # edeliver
    {:edeliver, ">= 1.6.0"},
    # github 上的版本修复了 upgrade 之后再执行 restart 会继续使用第一个 release 版本的问题, 但这个修复后的版本一直没有发布到 hex.pm 上
    {:distillery, override: true, github: "bitwalker/distillery", ref: "master", warn_missing: false},
  ]
end
  1. 初始化 distillery
mix distillery.init
  1. 添加配置到 .deliver/config 文件中
#!/usr/bin/env bash
# .deliver/config
# 这个名字要和 `rel/config.exs` 中的 `release :hello do`  hello 一致
APP="hello"

BUILD_HOST="127.0.0.1"
BUILD_USER="shynome"
BUILD_AT="/tmp/edeliver/myapp/builds"

STAGING_HOSTS="127.0.0.1"
STAGING_USER="shynome"
DELIVER_TO="/tmp/web"

pre_erlang_clean_compile() {
  status "Running npm install"
    __sync_remote "
      [ -f ~/.profile ] && source ~/.profile
      set -e
      cd '$BUILD_AT'
      npm install --prefix ./assets $SILENCE
    "

  status "Running npm build"
    __sync_remote "
      [ -f ~/.profile ] && source ~/.profile
      set -e
      cd '$BUILD_AT'
      npm run deploy --prefix ./assets
    "

  status "Running phoenix.digest" # log output prepended with "----->"
  __sync_remote "
    [ -f ~/.profile ] && source ~/.profile
    set -e
    cd '$BUILD_AT'
    APP='$APP' MIX_ENV='$TARGET_MIX_ENV' $MIX_CMD phx.digest $SILENCE
  "
}
  1. .gitignore 中忽略 edeliver 生成的部署文件
echo ".deliver/releases/" >> .gitignore

config/prod.exs 添加下列内容, 用以更新 phoenix 的静态文件版本

# config/prod.exs
config :hello, HelloWeb.Endpoint,
  url: [host: "example.com", port: 80],
  cache_static_manifest: "priv/static/cache_manifest.json",
  # 启动服务
  server: true,
  # 设置版本号用以更新静态文件
  root: ".",
  version: Mix.Project.config[:version]
  1. 进行 git flow 初始化
git flow init
#
git flow feature start feature_hot_upgrade
git add -A && git commit -m 'init hot upgrade'
git flow feature finish feature_hot_upgrade
# git 设置版本号
git flow release start 0.1.0
git flow release finish 0.1.0
# 发布 0.1.0 版本
mix edeliver upgrade --start-deploy --branch=0.1.0
  1. 打开 http://127.0.0.1:4000 查看服务是否正在运行

  2. 测试热升级

git flow release start 0.1.1
sed -i 's/Resources/ResourcesX/' lib/hello_web/templates/page/index.html.eex
sed -i 's/0.1.0/0.1.1/' mix.exs
git add -A && git commit -m '0.1.1'
git flow release finish 0.1.1
# 热升级到 0.1.1
mix edeliver upgrade --start-deploy --branch=0.1.1
  1. 打开 http://127.0.0.1:4000 查看 Resources 是否被替换成了 ResourcesX

部署命令

mix edeliver restart

参考资料