Closed shynome closed 8 months ago
Elixir |> 我
我对Elixir相当满意, 支持hot reload和多核运行, 能热升级在线版本, 甚至支持集群, 但今天这篇文章讲的只有 Elixir Phoenix 热升级的实践
Elixir
hot reload
mix phx.new hello --no-ecto
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
mix distillery.init
.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 " }
.gitignore
echo ".deliver/releases/" >> .gitignore
在 config/prod.exs 添加下列内容, 用以更新 phoenix 的静态文件版本
config/prod.exs
# 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]
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
打开 http://127.0.0.1:4000 查看服务是否正在运行
测试热升级
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
Resources
ResourcesX
mix edeliver restart
title: 使用 edeliver 进行 Elixir phoenix 热升级实践
Elixir |> 我
我对
Elixir
相当满意, 支持hot reload
和多核运行, 能热升级在线版本, 甚至支持集群, 但今天这篇文章讲的只有 Elixir Phoenix 热升级的实践实践
项目配置
mix.exs
中添加下列依赖.deliver/config
文件中.gitignore
中忽略 edeliver 生成的部署文件在
config/prod.exs
添加下列内容, 用以更新 phoenix 的静态文件版本打开 http://127.0.0.1:4000 查看服务是否正在运行
测试热升级
Resources
是否被替换成了ResourcesX
部署命令
参考资料