2010-12-20 52 views
0

我正在爲我們的系統編寫一個部署引擎,其中每個項目都指定了他的自定義部署說明。在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。

回答

0

我終於實現了這個

def shell_script(appname, *commands): 
     workspace = tempfile.mkdtemp(prefix=appname + '-') 
     installer = open(workspace + "/installer.sh", 'w') 

     installer.write("#!/bin/bash\n") 
     installer.write("cd " + workspace + "\n") 
     for line in commands: 
       installer.write(line + "\n") 
     ShellCommand("chmod u+x " + installer.name) 
     installer.close() 
     ShellCommand(installer.name) 
0
  1. 想想os.chdir(「目錄」),而不是POPEN(「光盤目錄」)的

  2. 也許這是最好的在這裏不執行新的外殼爲每個命令:只要寫一個多線殼skript

deploy_commands = 「」 「易於得到FOO 易於得到酒吧 CD巴茲;噓聲球棒」 「」

端經由POPEN執行(d eploy_commands,shell = True)。

但請閱讀Popen文檔中關於不轉義不可信參數的安全警告。