На свежую голову утром нашел еще несколько косяков, поправил.
Скрипт каждые пять минут запускается с помощью Cron:
Код:
*/5 * * * * www-data /var/www/tribiq/build/build.py >> /var/www/tribiq/dev/buildlog.html 2>&1
Результат работы скрипта тут: 
http://blackboxframework.org/dev/ (см. версию 006)
Код:
#!/usr/bin/python
from subprocess import Popen, PIPE
import sys, datetime, fileinput
buildDir = "/var/www/tribiq/build"
localRepository = "/var/www/git/bbcb.git"
devDir = "/var/www/tribiq/dev"
stableDir = "/var/www/tribiq/stable"
wine = "/usr/local/bin/wine"
iscc = "/usr/local/bin/iscc"
# this files contains hashes of last commits in master and development branches
DEVHASH = open(buildDir + "/devHash", "r+")
STABLEHASH = open(buildDir + "/stableHash", "r+")
process1 = Popen("cd " + localRepository + " && git log", stdout=PIPE, stderr=PIPE, shell=True)
(stdout1, stderr1) = process1.communicate()
if stderr1 == "":
   hash1 = stdout1.split("\n")[0].split(" ")[1]
   if STABLEHASH.readline().strip() == hash1:
      rebuildStable = False
      #print "No new commits in 'master'<br>"
   else:
      rebuildStable = True
      print "New commit in 'master', need to run build pipeline<br>"
else:
   print stderr1
process2 = Popen("cd " + localRepository + " && git log development", stdout=PIPE, stderr=PIPE, shell=True)
(stdout2, stderr2) = process2.communicate()
if stderr2 == "":
   hash2 = stdout2.split("\n")[0].split(" ")[1]
   if DEVHASH.readline().strip() == hash2:
      rebuildDev = False
      # print "No new commits in 'developent'<br>"
   else:
      rebuildDev = True
      print "New commit in 'development', need to run build pipeline<br>"
else:
   print stderr2
def log(out, err):
   if out != "":   
      for line1 in out.split("\n"):
         print line1 + "<br>"
   if err != "":
      for line2 in err.split("\n"):
         print line2 + "<br>"
#### BUILDING STABLE
if rebuildStable:
   print "Building from 'master' at " + datetime.datetime.now().isoformat() + "<br>"
   print "The build pipeline for 'master' branch is not developed..."
   # STABLEHASH.seek(0)
   # STABLEHASH.write(hash1)
   # STABLEHASH.truncate()
#### BUILDING DEVELOPMENT
if rebuildDev:
   print "<br><br><b>Building from 'development' at " + datetime.datetime.now().isoformat() + "</b><br>"
   print "Trying to check repository state...<br>"
   try:
      f = open(localRepository + ".lock", "r")
   except IOError:
      print "Repository is not locked. Continuing.<br>"
   else:
      print "Repository is locked (possibly because of sync process).<br>Aborting.<br>"
      f.close()
      sys.exit()
   print "Trying to clone repository into temporary folder...<br>"
   process1 = Popen("cd " + buildDir + " && git clone " + localRepository + " bb", stdout=PIPE, stderr=PIPE, shell=True)
   (stdout1, stderr1) = process1.communicate()
   log(stdout1, stderr1)
   print "Checking out development...<br>"
   process2 = Popen("cd " + buildDir + "/bb && git checkout development", stdout=PIPE, stderr=PIPE, shell=True)
   (stdout2, stderr2) = process2.communicate()
   log(stdout2, stderr2)
   print "Building BlackBox...<br>"
   process3 = Popen("cd " + buildDir + "/bb && " + wine + " dev0.exe < build.txt 2>&1", stdout=PIPE, stderr=PIPE, shell=True)
   (stdout3, stderr3) = process3.communicate()
   log(stdout3, stderr3)
   NUMBER = open(buildDir + "/number", "r+")
   buildNum = int(NUMBER.readline().strip())
   IN = open(buildDir + "/bb/appbuild/BlackBox.iss", "r")
   lines = IN.readlines()
   IN.close()
   OUT = open(buildDir + "/bb/appbuild/BlackBox.iss", "w")
   n = 0
   for line in lines:
      if n == 1:
         version = line.split('"')[1]
      n = n + 1
      if line[:18] == "VersionInfoVersion":
         print >> OUT, line.strip() + str(buildNum).zfill(3)
      else:
         print >> OUT, line,
   OUT.close()
   
   version = version + "." + str(buildNum).zfill(3)
   print "The version of build: " + version + "<br>"
   print "Building Setup File...<br>"
   process4 = Popen("cd " + buildDir + "/bb && mv Code System/ && mv Sym System/ && cd appbuild && " + iscc + " - < ./BlackBox.iss", stdout=PIPE, stderr=PIPE, shell=True)
   (stdout4, stderr4) = process4.communicate()
   log(stdout4, stderr4)
   print "Moving Setup File to dev folder...<br>"
   process5 = Popen("mv " + buildDir + "/bb/appbuild/Output/setup.exe " + devDir + "/blackbox-" + version + "-setup.exe", stdout=PIPE, stderr=PIPE, shell=True)
   (stdout5, stderr5) = process5.communicate()
   log(stdout5, stderr5)
   if stderr5 == "":
      print "Hash for 'development' branch updated<br>"
      DEVHASH.seek(0)
      DEVHASH.write(hash2)
      DEVHASH.truncate()
      print "Build number updated to " + str(buildNum + 1) + "<br>"
      NUMBER.seek(0)
      NUMBER.write(str(buildNum+1))
      NUMBER.truncate()
   print "Zipping...<br>"
   process6 = Popen("cd " + buildDir + "/bb && rm -R *.txt appbuild dev0.exe && zip -r ../../dev/blackbox-" + version + ".zip *", stdout=PIPE, stderr=PIPE, shell=True)
   (stdout6, stderr6) = process6.communicate()
   log(stdout6, stderr6)
   print "Cleaning...<br><br><br>"
   process7 = Popen("cd " + buildDir + " && rm bb -R", stdout=PIPE, stderr=PIPE, shell=True)
   (stdout7, stderr7) = process7.communicate()
   log(stdout7, stderr7)