私はシステムの展開エンジンを作成しています。各プロジェクトは、独自の展開手順を指定します。
ノードは EC2 で実行されています。
プロジェクトの 1 つは、サードパーティ アプリケーションのソース バージョンに依存しています。
具体的には:
cd /tmp
wget s3://.../tools/x264_20_12_2010.zip
unzip x264_20_12_2010.zip
cd x264_20_12_2010
./configure
make
checkinstall --pkgname=x264 --pkgversion "2:0.HEAD" --backup=no --deldoc=yes --fstrans=no --default
現在、boto の ShellCommand (内部で subprocess.Popen を使用) でこれを行っています。これは次のようになります。
def deploy():
ShellCommand("apt-get remove ffmpeg x264 libx264-dev")
ShellCommand("apt-get update")
ShellCommand("apt-get install -y build-essential checkinstall yasm texi2html libfuse-dev fuse-utils libcurl4-openssl-dev libxml2-dev mime-support libfaac-dev libjack-jackd2-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libvorbis-dev libvpx-dev libx11-dev libxfixes-dev libxvidcore-dev zlib1g-dev")
ShellCommand("cd /tmp")
s3cmd_sync("s3://.../tools/x264_20_12_2010.zip", "/tmp/x264_20_12_2010.zip")
ShellCommand("unzip x264_20_12_2010.zip")
ShellCommand("cd x264_20_12_2010")
ShellCommand("./configure")
ShellCommand("make")
ShellCommand(r'checkinstall --pkgname=x264 --pkgversion "2:0.HEAD" --backup=no --deldoc=yes --fstrans=no --default')
悲しいことに、サブプロセスに適用されるため、これは失敗します。cd /tmp
つまり、親プロセスに戻って 2 番目の ShellCommand を発行すると、exeenv は親から継承されます。これにより、すべてを適用するシェル コマンドの実行フレームワークが必要であると考えるようになります。コンテキストを失うことなく、同じサブプロセス内のコマンド。
この問題の推奨される解決策は何ですか? コマンド ラインで実行されるアプリのログは非常に重要であることに注意してください (それなしでデバッグするにはどうすればよいでしょうか?)。これが、私が ShellCommand を気に入っている理由です... (興味がある場合は boto ログを参照してください)。
ありがとう、
マキシム。