[REF] Package.py: refactoring including cleanup, lint, and use of docker to test unix releases

This commit is contained in:
Simon Lejeune 2014-09-02 14:05:43 +02:00
parent 29132669a1
commit 30d987ed30
1 changed files with 298 additions and 159 deletions

View File

@ -1,84 +1,160 @@
#!/usr/bin/env python2 #!/usr/bin/env python2
import glob # -*- coding: utf-8 -*-
import os ##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-Today OpenERP SA (<http://www.openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import optparse import optparse
import signal import os
import pexpect
import shutil import shutil
import socket import signal
import subprocess
import time import time
import xmlrpclib import xmlrpclib
from contextlib import contextmanager
from glob import glob
from os.path import abspath, dirname, join
from subprocess import check_output
from tempfile import NamedTemporaryFile
#---------------------------------------------------------- #----------------------------------------------------------
# Utils # Utils
#---------------------------------------------------------- #----------------------------------------------------------
join = os.path.join execfile(join(dirname(__file__), '..', 'openerp', 'release.py'))
timestamp = time.strftime("%Y%m%d-%H%M%S", time.gmtime())
PUBLISH_DIRS = {
'tar.gz': 'src',
'exe': 'exe',
'deb': 'deb',
'dsc': 'deb',
'changes': 'deb',
'deb.tar.gz': ['deb', 'tar.gz'],
'noarch.rpm': 'rpm',
'src.rpm': 'rpm',
}
def mkdir(d): def mkdir(d):
if not os.path.isdir(d): if not os.path.isdir(d):
os.makedirs(d) os.makedirs(d)
def system(l,chdir=None): def system(l, chdir=None):
print l print l
if chdir: if chdir:
cwd = os.getcwd() cwd = os.getcwd()
os.chdir(chdir) os.chdir(chdir)
if isinstance(l,list): if isinstance(l, list):
rc=os.spawnvp(os.P_WAIT, l[0], l) rc = os.spawnvp(os.P_WAIT, l[0], l)
elif isinstance(l,str): elif isinstance(l, str):
tmp=['sh','-c',l] tmp = ['sh', '-c', l]
rc=os.spawnvp(os.P_WAIT, tmp[0], tmp) rc = os.spawnvp(os.P_WAIT, tmp[0], tmp)
if chdir: if chdir:
os.chdir(cwd) os.chdir(cwd)
return rc return rc
#---------------------------------------------------------- def _rpc_count_modules(addr='http://127.0.0.1', port=8069, dbname='mycompany'):
# Stages time.sleep(5)
#---------------------------------------------------------- modules = xmlrpclib.ServerProxy('%s:%s/xmlrpc/object' % (addr, port)).execute(
dbname, 1, 'admin', 'ir.module.module', 'search', [('state', '=', 'installed')]
)
if modules:
print("Package test: successfuly installed %s modules" % len(modules))
else:
raise Exception("Installation of package failed")
def rsync(o): def publish(o, releases):
pre = 'rsync -a --exclude .bzr --exclude .git --exclude *.pyc' def _publish(o, release):
cmd = pre.split(' ') extension = ''.join(release.split('.', 1)[1])
system(cmd + ['%s/'%o.root, o.build]) release_extension = PUBLISH_DIRS[extension][1] if isinstance(PUBLISH_DIRS[extension], list) else extension
for i in glob.glob(join(o.build,'addons/*')): release_dir = PUBLISH_DIRS[extension][0] if isinstance(PUBLISH_DIRS[extension], list) else PUBLISH_DIRS[extension]
shutil.move(i, join(o.build,'openerp/addons'))
for i in glob.glob(join(o.build,'setup/*')):
shutil.move(i, join(o.build))
open(join(o.build,'openerp','release.py'),'a').write('version = "%s-%s"\n'%(o.version,o.timestamp))
def publish_move(o,srcs,dest): release_filename = 'odoo_%s-%s.%s' % (version, timestamp, release_extension)
for i in srcs: release_path = join(o.pub, release_dir, release_filename)
shutil.move(i,dest)
# do the symlink
bn = os.path.basename(i)
latest = bn.replace(o.timestamp,'latest')
latest_full = join(dest,latest)
if bn != latest:
if os.path.islink(latest_full):
os.unlink(latest_full)
os.symlink(bn,latest_full)
def sdist(o): system('mkdir -p %s' % join(o.pub, release_dir))
cmd=['python2','setup.py', '--quiet', 'sdist'] shutil.move(join(o.build_dir, release), release_path)
system(cmd,o.build)
#l = glob.glob(join(o.pkg,'*%s*.tar.gz'%o.timestamp))
#publish_move(o,l,join(o.pub,'src'))
def bdist_rpm(o): # Latest/symlink handler
cmd=['python2','setup.py', '--quiet', 'bdist_rpm'] release_abspath = abspath(release_path)
system(cmd,o.build) latest_abspath = release_abspath.replace(timestamp, 'latest')
#l = glob.glob(join(o.build,'dist/*%s-1*.rpm'%o.timestamp.replace('-','_')))
#publish_move(o,l,join(o.pub,'rpm'))
def debian(o): if os.path.islink(latest_abspath):
cmd=['sed','-i','1s/^.*$/openerp (%s-%s-1) testing; urgency=low/'%(o.version,o.timestamp),'debian/changelog'] os.unlink(latest_abspath)
system(cmd,o.build)
cmd=['dpkg-buildpackage','-rfakeroot']
system(cmd,o.build)
#l = glob.glob(join(o.pkg,'*_*%s-1*'%o.timestamp)) os.symlink(release_abspath, latest_abspath)
#publish_move(o,l,join(o.pub,'deb'))
#system('dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz',join(o.pub,'deb')) if isinstance(releases, basestring):
_publish(o, releases)
elif isinstance(releases, list):
for release in releases:
_publish(o, release)
class OdooDocker(object):
def __init__(self):
self.log_file = NamedTemporaryFile(mode='w+b', prefix="bash", suffix=".txt", delete=False)
self.port = 8069 # TODO sle: reliable way to get a free port?
self.prompt_re = '(\r\nroot@|bash-).*# '
self.timeout = 600
def system(self, command):
self.docker.sendline(command)
self.docker.expect(self.prompt_re)
def start(self, docker_image, build_dir, pub_dir):
self.build_dir = build_dir
self.pub_dir = pub_dir
self.docker = pexpect.spawn(
'docker run -v %s:/opt/release -p 127.0.0.1:%s:8069'
' -t -i %s /bin/bash --noediting' % (self.build_dir, self.port, docker_image),
timeout=self.timeout
)
time.sleep(2) # let the bash start
self.docker.logfile_read = self.log_file
self.id = check_output('docker ps -l -q', shell=True)
def end(self):
try:
_rpc_count_modules(port=str(self.port))
except Exception, e:
print('Exception during docker execution: %s:' % str(e))
print('Error during docker execution: printing the bash output:')
with open(self.log_file.name) as f:
print '\n'.join(f.readlines())
raise
finally:
self.docker.close()
system('docker rm -f %s' % self.id)
self.log_file.close()
os.remove(self.log_file.name)
@contextmanager
def docker(docker_image, build_dir, pub_dir):
_docker = OdooDocker()
try:
_docker.start(docker_image, build_dir, pub_dir)
try:
yield _docker
except Exception, e:
raise
finally:
_docker.end()
class KVM(object): class KVM(object):
def __init__(self, o, image, ssh_key='', login='openerp'): def __init__(self, o, image, ssh_key='', login='openerp'):
@ -92,7 +168,7 @@ class KVM(object):
os.kill(self.pid,15) os.kill(self.pid,15)
def start(self): def start(self):
l="kvm -net nic -net user,hostfwd=tcp:127.0.0.1:10022-:22,hostfwd=tcp:127.0.0.1:18069-:8069,hostfwd=tcp:127.0.0.1:15432-:5432 -drive".split(" ") l="kvm -net nic,model=rtl8139 -net user,hostfwd=tcp:127.0.0.1:10022-:22,hostfwd=tcp:127.0.0.1:18069-:8069,hostfwd=tcp:127.0.0.1:15432-:5432 -drive".split(" ")
#l.append('file=%s,if=virtio,index=0,boot=on,snapshot=on'%self.image) #l.append('file=%s,if=virtio,index=0,boot=on,snapshot=on'%self.image)
l.append('file=%s,snapshot=on'%self.image) l.append('file=%s,snapshot=on'%self.image)
#l.extend(['-vnc','127.0.0.1:1']) #l.extend(['-vnc','127.0.0.1:1'])
@ -120,145 +196,208 @@ class KVM(object):
def run(self): def run(self):
pass pass
class KVMDebianTestTgz(KVM):
def run(self):
l = glob.glob(join(self.o.pkg,'*%s.tar.gz'%self.o.timestamp))
self.rsync('%s openerp@127.0.0.1:src/'%l[0])
script = """
tar xzvf src/*.tar.gz
cd openerp*
sudo python setup.py install
sudo su - postgres -c "createuser -s $USER"
createdb t1
openerp-server --stop-after-init -d t1 -i ` python -c "import os;print ','.join([i for i in os.listdir('openerp/addons') if i not in ['auth_openid','caldav','document_ftp','base_gengo', 'im', 'im_livechat'] and not i.startswith('hw_')]),;" `
"""
self.ssh(script)
self.ssh('nohup openerp-server >/dev/null 2>&1 &')
time.sleep(5)
l = xmlrpclib.ServerProxy('http://127.0.0.1:18069/xmlrpc/object').execute('t1',1,'admin','ir.module.module','search',[('state','=','installed')])
i = len(l)
if i >= 190:
print "Tgz install: ",i," module installed"
else:
raise Exception("Tgz install failed only %s installed"%i)
time.sleep(2)
class KVMDebianTestDeb(KVM):
def run(self):
l = glob.glob(join(self.o.pkg,'*%s*.deb'%self.o.timestamp))
self.rsync('%s openerp@127.0.0.1:deb/'%l[0])
script = """
sudo dpkg -i deb/*
sudo su - postgres -c "createuser -s $USER"
createdb t1
openerp-server --stop-after-init -d t1 -i base
"""
#` python -c "import os;print ','.join([i for i in os.listdir('/usr/share/pyshared/openerp/addons') if i not in ['auth_openid','caldav','document_ftp', 'base_gengo'] and not i.startswith('hw_')]),;" `
self.ssh(script)
time.sleep(5)
l = xmlrpclib.ServerProxy('http://127.0.0.1:18069/xmlrpc/object').execute('t1',1,'admin','ir.module.module','search',[('state','=','installed')])
i = len(l)
if i >= 1:
print "Deb install: ",i," module installed"
else:
raise Exception("Tgz install failed only %s installed"%i)
time.sleep(2)
class KVMWinBuildExe(KVM): class KVMWinBuildExe(KVM):
def run(self): def run(self):
self.ssh("mkdir -p build") self.ssh("mkdir -p build")
self.rsync('%s/ %s@127.0.0.1:build/server/' % (self.o.build, self.login)) self.ssh('easy_install decorator') # TODO sle: cannot figure how to include it in the vdi properly ...
with open('windows/Makefile.version', 'w') as f: self.ssh('easy_install passlib')
self.rsync('%s/ %s@127.0.0.1:build/server/' % (self.o.build_dir, self.login))
with open(join(self.o.build_dir, 'setup/win32/Makefile.version'), 'w') as f:
f.write("VERSION=%s\n" % self.o.version_full) f.write("VERSION=%s\n" % self.o.version_full)
with open('windows/Makefile.python', 'w') as f: with open(join(self.o.build_dir, 'setup/win32/Makefile.python'), 'w') as f:
f.write("PYTHON_VERSION=%s\n" % self.o.vm_win_python_version.replace('.', '')) f.write("PYTHON_VERSION=%s\n" % self.o.vm_winxp_python_version.replace('.', ''))
self.rsync('windows/ %s@127.0.0.1:build/windows/' % self.login) self.rsync('%s %s@127.0.0.1:build/server/setup/win32/' % (join(self.o.build_dir, 'setup/win32'), self.login))
self.rsync('windows/wkhtmltopdf/ %s@127.0.0.1:build/server/win32/wkhtmltopdf/' % self.login) self.ssh("cd build/server/setup/win32;time make allinone;")
self.ssh("cd build/windows;time make allinone;") self.rsync('%s@127.0.0.1:build/server/setup/win32/release/ %s/' % (self.login, self.o.build_dir), '')
self.rsync('%s@127.0.0.1:build/windows/files/ %s/' % (self.login, self.o.pkg), '')
print "KVMWinBuildExe.run(): done" print "KVMWinBuildExe.run(): done"
class KVMWinTestExe(KVM): class KVMWinTestExe(KVM):
def run(self): def run(self):
setuppath = "%s/openerp-allinone-setup-%s.exe" % (self.o.pkg, self.o.version_full) # Cannot use o.version_full when the version is not correctly parsed
setuplog = setuppath.replace('exe','log') # (for instance, containing *rc* or *dev*)
setuppath = glob("%s/openerp-server-setup-*.exe" % self.o.build_dir)[0]
setupfile = setuppath.split('/')[-1]
setupversion = setupfile.split('openerp-server-setup-')[1].split('.exe')[0]
self.rsync('"%s" %s@127.0.0.1:' % (setuppath, self.login)) self.rsync('"%s" %s@127.0.0.1:' % (setuppath, self.login))
self.ssh("TEMP=/tmp ./openerp-allinone-setup-%s.exe /S" % self.o.version_full) self.ssh("TEMP=/tmp ./%s /S" % setupfile)
self.ssh('ls /cygdrive/c/"Program Files"/"OpenERP %s"/' % self.o.version_full) self.ssh('PGPASSWORD=openpgpwd /cygdrive/c/"Program Files"/"OpenERP %s"/PostgreSQL/bin/createdb.exe -e -U openpg mycompany' % setupversion)
self.rsync('"repo/lpopenerp_openobject-addons_7.0/" %s@127.0.0.1:/cygdrive/c/Program?Files/OpenERP?%s/Server/server/openerp/addons/' % (self.login, self.o.version_full), options='--exclude .bzrignore --exclude .bzr') self.ssh('/cygdrive/c/"Program Files"/"OpenERP %s"/server/openerp-server.exe -d mycompany -i base --stop-after-init' % setupversion)
self.ssh('ls /cygdrive/c/"Program Files"/"OpenERP %s"/Server/server/openerp/addons/' % self.o.version_full) self.ssh(['/cygdrive/c/"Program Files"/"OpenERP %s"/server/openerp-server.exe -d mycompany &' % setupversion, '&'])
_rpc_count_modules(port=18069)
self.ssh('PGPASSWORD=openpgpwd /cygdrive/c/"Program Files"/"OpenERP %s"/PostgreSQL/bin/createdb.exe -e -U openpg pack' % self.o.version_full) #----------------------------------------------------------
self.ssh('net stop "PostgreSQL_For_OpenERP"') # Stage: building
self.ssh('net start "PostgreSQL_For_OpenERP"') #----------------------------------------------------------
self.ssh('mkdir test-reports') def _prepare_build_dir(o):
cmd = ['rsync', '-a', '--exclude', '.git', '--exclude', '*.pyc', '--exclude', '*.pyo']
system(cmd + ['%s/' % o.odoo_dir, o.build_dir])
for i in glob(join(o.build_dir, 'addons/*')):
shutil.move(i, join(o.build_dir, 'openerp/addons'))
self.ssh('/cygdrive/c/"Program Files"/"OpenERP %s"/Server/server/openerp-server.exe -d pack -i base,report_webkit,product --stop-after-init --test-enable --log-level=test --test-report-directory=test-reports'%self.o.version_full) def build_tgz(o):
self.rsync('%s@127.0.0.1:/cygdrive/c/Program?Files/OpenERP?%s/Server/server/openerp-server.log "%s"' % (self.login, self.o.version_full, setuplog)) system(['python2', 'setup.py', '--quiet', 'sdist'], o.build_dir)
self.rsync('%s@127.0.0.1:test-reports/ "%s"' % (self.login, self.o.pkg), options='') system(['cp', glob('%s/dist/openerp-*.tar.gz' % o.build_dir)[0], '%s/odoo.tar.gz' % o.build_dir])
def build_deb(o):
system(['dpkg-buildpackage', '-rfakeroot', '-uc', '-us'], o.build_dir)
system(['cp', glob('%s/../openerp_*.deb' % o.build_dir)[0], '%s/odoo.deb' % o.build_dir])
system(['cp', glob('%s/../openerp_*.dsc' % o.build_dir)[0], '%s/odoo.dsc' % o.build_dir])
system(['cp', glob('%s/../openerp_*_amd64.changes' % o.build_dir)[0], '%s/odoo_amd64.changes' % o.build_dir])
system(['cp', glob('%s/../openerp_*.tar.gz' % o.build_dir)[0], '%s/odoo.deb.tar.gz' % o.build_dir])
def build_rpm(o):
system(['python2', 'setup.py', '--quiet', 'bdist_rpm'], o.build_dir)
system(['cp', glob('%s/dist/openerp-*.noarch.rpm' % o.build_dir)[0], '%s/odoo.noarch.rpm' % o.build_dir])
system(['cp', glob('%s/dist/openerp-*.src.rpm' % o.build_dir)[0], '%s/odoo.src.rpm' % o.build_dir])
def build_exe(o):
KVMWinBuildExe(o, o.vm_winxp_image, o.vm_winxp_ssh_key, o.vm_winxp_login).start()
system(['cp', glob('%s/openerp*.exe' % o.build_dir)[0], '%s/odoo.exe' % o.build_dir])
#----------------------------------------------------------
# Stage: testing
#----------------------------------------------------------
def test_tgz(o):
with docker('debian:stable', o.build_dir, o.pub) as wheezy:
wheezy.release = 'odoo.tar.gz'
wheezy.system('apt-get update -qq && apt-get upgrade -qq -y')
wheezy.system("apt-get install postgresql python-dev postgresql-server-dev-all python-pip build-essential libxml2-dev libxslt1-dev libldap2-dev libsasl2-dev libssl-dev libjpeg-dev -y")
wheezy.system("service postgresql start")
wheezy.system('su postgres -s /bin/bash -c "pg_dropcluster --stop 9.1 main"')
wheezy.system('su postgres -s /bin/bash -c "pg_createcluster --start -e UTF-8 9.1 main"')
wheezy.system('pip install -r /opt/release/requirements.txt')
wheezy.system('/usr/local/bin/pip install /opt/release/%s' % wheezy.release)
wheezy.system("useradd --system --no-create-home openerp")
wheezy.system('su postgres -s /bin/bash -c "createuser -s openerp"')
wheezy.system('su postgres -s /bin/bash -c "createdb mycompany"')
wheezy.system('mkdir /var/lib/openerp')
wheezy.system('chown openerp:openerp /var/lib/openerp')
wheezy.system('su openerp -s /bin/bash -c "odoo.py --addons-path=/usr/local/lib/python2.7/dist-packages/openerp/addons -d mycompany -i base --stop-after-init"')
wheezy.system('su openerp -s /bin/bash -c "odoo.py --addons-path=/usr/local/lib/python2.7/dist-packages/openerp/addons -d mycompany &"')
def test_deb(o):
with docker('debian:stable', o.build_dir, o.pub) as wheezy:
wheezy.release = 'odoo.deb'
wheezy.system('/usr/bin/apt-get update -qq && /usr/bin/apt-get upgrade -qq -y')
wheezy.system("apt-get install postgresql -y")
wheezy.system("service postgresql start")
wheezy.system('su postgres -s /bin/bash -c "pg_dropcluster --stop 9.1 main"')
wheezy.system('su postgres -s /bin/bash -c "pg_createcluster --start -e UTF-8 9.1 main"')
wheezy.system('su postgres -s /bin/bash -c "createdb mycompany"')
wheezy.system('/usr/bin/dpkg -i /opt/release/%s' % wheezy.release)
wheezy.system('/usr/bin/apt-get install -f -y')
wheezy.system('su openerp -s /bin/bash -c "odoo.py -c /etc/openerp/openerp-server.conf -d mycompany -i base --stop-after-init"')
wheezy.system('su openerp -s /bin/bash -c "odoo.py -c /etc/openerp/openerp-server.conf -d mycompany &"')
def test_rpm(o):
with docker('centos:centos7', o.build_dir, o.pub) as centos7:
centos7.release = 'odoo.noarch.rpm'
centos7.system('rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-1.noarch.rpm')
centos7.system('yum update -y && yum upgrade -y')
centos7.system('yum install python-pip gcc python-devel -y')
centos7.system('pip install pydot pyPdf vatnumber xlwt http://download.gna.org/pychart/PyChart-1.39.tar.gz')
centos7.system('yum install postgresql postgresql-server postgresql-libs postgresql-contrib postgresql-devel -y')
centos7.system('mkdir -p /var/lib/postgres/data')
centos7.system('chown -R postgres:postgres /var/lib/postgres/data')
centos7.system('chmod 0700 /var/lib/postgres/data')
centos7.system('su postgres -c "initdb -D /var/lib/postgres/data -E UTF-8"')
centos7.system('cp /usr/share/pgsql/postgresql.conf.sample /var/lib/postgres/data/postgresql.conf')
centos7.system('su postgres -c "/usr/bin/pg_ctl -D /var/lib/postgres/data start"')
centos7.system('su postgres -c "createdb mycompany"')
centos7.system('export PYTHONPATH=${PYTHONPATH}:/usr/local/lib/python2.7/dist-packages')
centos7.system('su postgres -c "createdb mycompany"')
centos7.system('yum install /opt/release/%s -y' % centos7.release)
centos7.system('su openerp -s /bin/bash -c "openerp-server -c /etc/openerp/openerp-server.conf -d mycompany -i base --stop-after-init"')
centos7.system('su openerp -s /bin/bash -c "openerp-server -c /etc/openerp/openerp-server.conf -d mycompany &"')
def test_exe(o):
KVMWinTestExe(o, o.vm_winxp_image, o.vm_winxp_ssh_key, o.vm_winxp_login).start()
#---------------------------------------------------------- #----------------------------------------------------------
# Options and Main # Options and Main
#---------------------------------------------------------- #----------------------------------------------------------
def options(): def options():
op = optparse.OptionParser() op = optparse.OptionParser()
timestamp = time.strftime("%Y%m%d-%H%M%S",time.gmtime())
root = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) root = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
build = "%s-%s" % (root, timestamp) build_dir = "%s-%s" % (root, timestamp)
op.add_option("-b", "--build", default=build, help="build directory (%default)", metavar="DIR") op.add_option("-b", "--build-dir", default=build_dir, help="build directory (%default)", metavar="DIR")
op.add_option("-p", "--pub", default=None, help="pub directory (%default)", metavar="DIR") op.add_option("-p", "--pub", default=None, help="pub directory (%default)", metavar="DIR")
op.add_option("-v", "--version", default='7.0', help="version (%default)") op.add_option("", "--no-testing", action="store_true", help="don't test the builded packages")
op.add_option("-v", "--version", default='8.0', help="version (%default)")
op.add_option("", "--vm-debian-image", default='/home/odoo/vm/debian6/debian6.vmdk', help="%default")
op.add_option("", "--vm-debian-ssh-key", default='/home/odoo/vm/debian6/debian6_id_rsa', help="%default")
op.add_option("", "--vm-debian-login", default='openerp', help="Debian login (%default)")
op.add_option("", "--vm-winxp-image", default='/home/odoo/vm/winxp26/winxp26.vdi', help="%default")
op.add_option("", "--vm-winxp-ssh-key", default='/home/odoo/vm/winxp26/id_rsa', help="%default")
op.add_option("", "--vm-win-login", default='Naresh', help="Windows login (%default)")
op.add_option("", "--vm-win-python-version", default='2.6', help="Windows Python version installed in the VM (default: %default)")
op.add_option("", "--no-debian", action="store_true", help="don't build the debian package") op.add_option("", "--no-debian", action="store_true", help="don't build the debian package")
op.add_option("", "--no-rpm", action="store_true", help="don't build the rpm package") op.add_option("", "--no-rpm", action="store_true", help="don't build the rpm package")
op.add_option("", "--no-tarball", action="store_true", help="don't build the tarball") op.add_option("", "--no-tarball", action="store_true", help="don't build the tarball")
op.add_option("", "--no-windows", action="store_true", help="don't build the windows package") op.add_option("", "--no-windows", action="store_true", help="don't build the windows package")
# Windows VM
op.add_option("", "--vm-winxp-image", default='/home/odoo/vm/winxp27/winxp27.vdi', help="%default")
op.add_option("", "--vm-winxp-ssh-key", default='/home/odoo/vm/winxp27/id_rsa', help="%default")
op.add_option("", "--vm-winxp-login", default='Naresh', help="Windows login (%default)")
op.add_option("", "--vm-winxp-python-version", default='2.7', help="Windows Python version installed in the VM (default: %default)")
(o, args) = op.parse_args() (o, args) = op.parse_args()
# derive other options # derive other options
o.root = root o.odoo_dir = root
o.timestamp = timestamp o.pkg = join(o.build_dir, 'pkg')
o.version_full = '%s-%s'%(o.version,o.timestamp) o.version_full = '%s-%s' % (o.version, timestamp)
o.work = join(o.build_dir, 'openerp-%s' % o.version_full)
o.work_addons = join(o.work, 'openerp', 'addons')
return o return o
def main(): def main():
o = options() o = options()
rsync(o) _prepare_build_dir(o)
try: try:
# tgz if not o.no_tarball:
sdist(o) build_tgz(o)
if os.path.isfile(o.vm_debian_image): if not o.no_testing:
KVMDebianTestTgz(o, o.vm_debian_image, o.vm_debian_ssh_key, o.vm_debian_login).start() try:
test_tgz(o)
# deb publish(o, 'odoo.tar.gz')
debian(o) except Exception, e:
if os.path.isfile(o.vm_debian_image): print("Won't publish the tgz release.\n Exception: %s" % str(e))
KVMDebianTestDeb(o, o.vm_debian_image, o.vm_debian_ssh_key, o.vm_debian_login).start() if not o.no_debian:
build_deb(o)
# exe if not o.no_testing:
if os.path.isfile(o.vm_winxp_image): try:
KVMWinBuildExe(o, o.vm_winxp_image, o.vm_winxp_ssh_key, o.vm_win_login).start() test_deb(o)
KVMWinTestExe(o, o.vm_winxp_image, o.vm_winxp_ssh_key, o.vm_win_login).start() publish(o, ['odoo.deb', 'odoo.dsc', 'odoo_amd64.changes', 'odoo.deb.tar.gz'])
l = glob.glob(join(o.pkg,'*all*%s*.exe'%o.timestamp)) system('dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz', join(o.pub, 'deb'))
publish_move(o,l,join(o.pub,'exe')) except Exception, e:
print("Won't publish the deb release.\n Exception: %s" % str(e))
# rpm if not o.no_rpm:
bdist_rpm(o) build_rpm(o)
if not o.no_testing:
finally: try:
#shutil.rmtree(o.build) test_rpm(o)
publish(o, ['odoo.noarch.rpm', 'odoo.src.rpm'])
except Exception, e:
print("Won't publish the rpm release.\n Exception: %s" % str(e))
if not o.no_windows:
build_exe(o)
if not o.no_testing:
try:
test_exe(o)
publish(o, 'odoo.exe')
except Exception, e:
print("Won't publish the exe release.\n Exception: %s" % str(e))
except:
pass pass
finally:
for leftover in glob('%s/../openerp_*' % o.build_dir):
os.remove(leftover)
shutil.rmtree(o.build_dir)
print('Build dir %s removed' % o.build_dir)
if not o.no_testing:
system("docker rm -f `docker ps -a | awk '{print $1 }'` 2>>/dev/null")
print('Remaining dockers removed')
if __name__ == '__main__': if __name__ == '__main__':
main() main()