[REF] Package.py: refactoring including cleanup, lint, and use of docker to test unix releases
This commit is contained in:
parent
29132669a1
commit
30d987ed30
457
setup/package.py
457
setup/package.py
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue