На свежую голову утром нашел еще несколько косяков, поправил.
Скрипт каждые пять минут запускается с помощью 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)