-
Notifications
You must be signed in to change notification settings - Fork 4
/
__init__.py
155 lines (130 loc) · 4.66 KB
/
__init__.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
from __future__ import unicode_literals
import getpass
import logging
import os
from bob.builders import Builder, GithubMixin
from . import forms
logger = logging.getLogger(__name__)
class UbuntuBuilder(Builder, GithubMixin):
flavor = 'ubuntu'
dependencies = None
build_dependencies = None
before_install = None
after_install = None
before_remove = None
after_remove = None
exclude = None
def parse_options(self):
self._options_parsers['1'] = self._parse_options_v1
super(UbuntuBuilder, self).parse_options()
def _parse_options_v1(self):
settings = self.settings
result = forms.V1Settings(**settings)
for key, value in result['targets'][self.flavor].iteritems():
setattr(self, key, value)
self.log(key, 'info')
self.log(value, 'info')
self.configured = True
def _install_system_dependencies(self):
"""these are required by the builder and its dependencies e.g. ruby-dev
for fpm"""
for command in (
'sudo apt-get install python-virtualenv ruby-dev gcc ruby1.9.1-dev'
' -y',
'sudo gem install fpm --no-ri --no-rdoc'
):
self.run_command(command)
def _install_build_dependencies(self):
"""these are required by the project we're building e.g. libpq-dev for
psycopg"""
# we don't strictly need self.dependencies but they are good if you
# want to try installing it locally (debug).
for deps in (self.build_dependencies, self.dependencies):
command = 'sudo apt-get install {} -y'.format(
' '.join(deps)
)
self.run_command(command)
def _prepare_source(self):
for exclude in self.exclude:
self.run_command(
'find {} -regex "{}" -delete'.format(self.source, exclude)
)
@property
def _venv_env(self):
env = os.environ.copy()
env['PATH'] = '{}/embedded/bin:{}'.format(self.target, env['PATH'])
return env
def _prepare_target(self):
for directory in (self.tmp_dir, self.target):
self.run_command('sudo rm -rf {}'.format(directory))
self.run_command('sudo mkdir -p {}'.format(directory))
self.run_command('sudo chown {} {}'.format(
getpass.getuser(), directory)
)
self.run_command('virtualenv -q {}/embedded'.format(self.target))
self.run_command(
'pip install setuptools --upgrade',
env=self._venv_env
)
def prepare_system(self):
super(UbuntuBuilder, self).prepare_system()
self._install_system_dependencies()
self._install_build_dependencies()
def build(self):
super(UbuntuBuilder, self).build()
self._prepare_source()
self._prepare_target()
build_command = '''
pip install -b {tmp_dir} \
--upgrade \
--install-option=--prefix={embedded_dir} \
{source_dir}
'''.format(
tmp_dir=self.tmp_dir,
embedded_dir=self.target + '/embedded',
source_dir=self.source
)
self.run_command(
build_command,
env=self._venv_env
)
def package(self, version, iteration=1):
super(UbuntuBuilder, self).package(version)
assert self.configured
if version[0] == 'v':
version = version[1:]
dependencies = ''.join(
' -d {}'.format(dep) for dep in self.dependencies
)
hooks = ''
workspace_path = self.source
for scripts, type in (
('before-install', 'before_install'),
('after-install', 'after_install'),
('before-remove', 'before_remove'),
('after-remove', 'after_remove'),
):
hooks += ''.join(
' --{}={}/{}'.format(scripts, workspace_path, script)
for script in (getattr(self, type) or [])
)
package_command = '''
fpm -s dir -t deb -n {project_name} -v {version} -x "*.pyc" \
--iteration={iteration} \
{dependencies} \
{hooks} {dir_to_package}
'''.format(
project_name=self.project_name,
dependencies=dependencies,
hooks=hooks,
dir_to_package=self.target,
version=version,
iteration=iteration,
)
self.run_command(package_command)
return '{project_name}_{version}-{iteration}_{arch}.deb'.format(
project_name=self.project_name,
version=version,
arch='amd64',
iteration=1,
)