Elixir:Edeliverを使用したアプリケーションの展開



Elixirアプリケーションのアセンブリと展開( reexrmの使用 )については既に説明しました。リリースを移行する方法または環境変数を操作する方法ですElixirアプリケーションをデプロイするのに役立つ別のツールを見つけましょう。







Elixirアプリケーションを展開し、 Exrmを使用してノードでの作業をさらに追跡することにより、 実稼働環境でのリリース管理の問題に自信を持つことができます。 ただし、次の質問が発生します。展開プロセス自体を管理する方法は? もちろん、特にRailsからElixirの世界に来た場合は、 Capistranoを利用できます。 しかし、 Edeliver READMEからの引用を見てください:







edeliverは配信ベースであり、ElixirおよびErlangアプリケーションを構築およびデプロイするためのbashスクリプトを提供し、「ホットな」コード更新を可能にします。


展開プロセス全体を手動で整理しようとすると、反復コードが大量に発生し、頭痛の種になります。 しかし、展開にEdeliverを使用することは、最初の試行で非常に簡単であることがわかりました! 最終的に、展開プロセス全体が1つの小さなbashスクリプトに収まります。







#!/bin/bash -ex BRANCH=${1:-master}; mix edeliver build release --branch=BRANCH --verbose mix edeliver deploy release to production --verbose mix edeliver start production --verbose mix edeliver migrate production up --verbose
      
      





ほとんどの場合、このスクリプトを自分のニーズに合わせて調整する必要があります。 本番環境での展開にのみ使用しますが、 ステージング展開にも使用できます。 それがすべてどのように機能するかの説明は、カットの下です。







仕組み



READMEで見たように、 Edeliverは主にbashスクリプトで動作します。 MixコマンドはElixirを使用して実行されますが、実際にはbashスクリプトを実行します。 一部の端末命令はローカルで実行されます。RPCを介してリモートサーバーで実行される新しい命令を作成します。

ライブラリのいくつかの側面を詳しく見てみましょう。







環境



Edeliverは、リリースを起動してさまざまな環境に配信する絶好の機会です。 環境の概念は単純です: buildstageおよびproductionです。 ビルド環境に微妙な違いがあることを除いて、ここではすべてが明確です。







本番サーバーでリリースを正常に実行するには、同じアーキテクチャのマシンでリリースを組み立てる必要があります。 問題は、 EdeliverExrmを使用してリリースをビルドすることです。 ExrmNIFを使用します(これらはErlangの Cで記述された関数です)。これはマシンのアーキテクチャによって異なる場合があるため、たとえば、OSXでビルドされたリリースはLinuxで動作しない場合があります。 この詳細については、この小さな フェニックスの 小冊子で読むことができます。この小冊子では 、クロスコンパイルの問題やその他のあらゆる種類のExrm ダンプについて議論しています。







つまり、開発マシンでビルド環境を使用するには、 ステージングマシンおよびプロダクションマシンと同じアーキテクチャを持っている必要があります。 それ以外の場合は機能しません。







環境を構成するには、プロジェクトに.deliver



フォルダーを作成し、構成ファイルを追加する必要があります。 Edeliverの作者が私たちにそれを書くように勧めていることを見てみましょう:







 #!/usr/bin/env bash APP="your-erlang-app" # name of your release BUILD_HOST="build-system.acme.org" # host where to build the release BUILD_USER="build" # local user at build host BUILD_AT="/tmp/erlang/my-app/builds" # build directory on build host STAGING_HOSTS="test1.acme.org test2.acme.org" # staging / test hosts separated by space STAGING_USER="test" # local user at staging hosts TEST_AT="/test/my-erlang-app" # deploy directory on staging hosts. default is DELIVER_TO PRODUCTION_HOSTS="deploy1.acme.org deploy2.acme.org" # deploy / production hosts separated by space PRODUCTION_USER="production" # local user at deploy hosts DELIVER_TO="/opt/my-erlang-app" # deploy directory on production hosts
      
      





一般に、すべてがシンプルで透過的であるため、リストされているすべてのサーバーでsshが使用可能であることを確認するだけです。 追加の機能は、以前に既に書き込みが行われていたため、複数のサーバーでリリースをプルすることが非常に可能です。







展開プロセスにジョブを追加するにはどうすればよいですか?



Edeliverは、標準ですべてのElixirまたはErlangアプリケーションに共通することのみを行います。 しかし、たとえばPhoenixを使用する場合、リリースを生成する前に、さらにいくつかのコマンドを実行する必要があります。 最も重要なのは







 $ branch build --production
      
      





そして







 $ mix phoenix.digest
      
      





静的がリリースで機能するように。







これを行うには、 .deliver/config



ファイルでフックを定義します。







 pre_erlang_clean_compile() { status "Preparing assets with: brunch build and phoenix.digest" __sync_remote " # runs the commands on the build host [ -f ~/.profile ] && source ~/.profile # load profile (optional) # fail if any command fails (recommended) set -e # enter the build directory on the build host (required) cd '$BUILD_AT' mkdir -p priv/static # required by the phoenix.digest task # installing npm dependencies npm install # building brunch brunch build --production # run your custom task APP='$APP' MIX_ENV='$TARGET_MIX_ENV' $MIX_CMD phoenix.digest $SILENCE " }
      
      





上記のコードは、フックを使用する方法を説明するEdeliverのドキュメントから露骨に引き裂かれており、何らかの理由ですぐに機能しました。







私の環境変数はどうですか?



ここで環境変数をビルド環境にエクスポートしないように環境変数を正しく動作させる方法については既に説明しましたが、それでも動作します! ただし、心に留めておくべきことがあります。







環境を変更できるようにするには、起動コマンドの前にRELX_REPLACE_OS_VARS=true



を追加する必要があります。 ただし、最初のコマンドはローカルで実行されるため、これはEdeliverでは不可能です。







 $ mix edeliver start production
      
      





したがって、可能な解決策はRELX_REPLACE_OS_VARS



実稼働環境にエクスポートすることです。







始める前に



Edeliverは、一般的にリリースと展開プロセスを管理するための素晴らしいもののようです。 とても使いやすいように思えました。 この記事では、私は彼女の作品の内部を掘り下げていないので、 READMEとあらゆる種類のドックを読んでください。







私はそのように展開していますが、元気ですか? コメントを書いてください!








All Articles