我正在爲我們的系統編寫一個部署引擎,其中每個項目都指定了他的自定義部署說明。在subprocess.Popen命令之間維護環境狀態?
節點在EC2上運行。
其中一個項目取決於第三方應用程序的源版本。
具體做法是:
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
目前我在做這與伯特的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
適用於子進程,這意味着一旦我返回父進程併發出第二個ShellCommand,exeenv就會從父進程繼承,這讓我認爲我需要一些執行框架來執行shell命令,這些命令將全部應用命令在同一個子進程中不丟失上下文。
這個問題的推薦解決方案是什麼?請注意,命令行執行的應用程序的日誌非常重要(如果沒有它,你怎麼能進行調試?),這就是爲什麼我喜歡ShellCommand ...(請參閱boto日誌如果感興趣)。
謝謝,
Maxim。