OLD | NEW |
| (Empty) |
1 # Dan Radez <dradez+buildbot@redhat.com> | |
2 # Steve 'Ashcrow' Milner <smilner+buildbot@redhat.com> | |
3 # | |
4 # This software may be freely redistributed under the terms of the GNU | |
5 # general public license. | |
6 # | |
7 # You should have received a copy of the GNU General Public License | |
8 # along with this program; if not, write to the Free Software | |
9 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
10 """ | |
11 RPM Building steps. | |
12 """ | |
13 | |
14 from buildbot.steps.shell import ShellCommand | |
15 from buildbot.process.buildstep import RemoteShellCommand | |
16 | |
17 | |
18 class RpmBuild(ShellCommand): | |
19 """ | |
20 Build and RPM based on pased spec filename | |
21 """ | |
22 | |
23 import os.path | |
24 | |
25 name = "rpmbuilder" | |
26 haltOnFailure = 1 | |
27 flunkOnFailure = 1 | |
28 description = ["RPMBUILD"] | |
29 descriptionDone = ["RPMBUILD"] | |
30 | |
31 def __init__(self, | |
32 specfile=None, | |
33 topdir='`pwd`', | |
34 builddir='`pwd`', | |
35 rpmdir='`pwd`', | |
36 sourcedir='`pwd`', | |
37 specdir='`pwd`', | |
38 srcrpmdir='`pwd`', | |
39 dist='.el5', | |
40 autoRelease=False, | |
41 vcsRevision=False, | |
42 **kwargs): | |
43 """ | |
44 Creates the RpmBuild object. | |
45 | |
46 @type specfile: str | |
47 @param specfile: the name of the spec file for the rpmbuild | |
48 @type topdir: str | |
49 @param topdir: the top directory for rpm building. | |
50 @type builddir: str | |
51 @param builddir: the directory to use for building | |
52 @type rpmdir: str | |
53 @param rpmdir: the directory to dump the rpms into | |
54 @type sourcedir: str | |
55 @param sourcedir: the directory that houses source code | |
56 @type srcrpmdir: str | |
57 @param srcrpmdir: the directory to dump source rpms into | |
58 @type dist: str | |
59 @param dist: the distribution to build for | |
60 @type autoRelease: boolean | |
61 @param autoRelease: if the auto release mechanics should be used | |
62 @type vcsRevision: boolean | |
63 @param vcsRevision: if the vcs revision mechanics should be used | |
64 @type kwargs: dict | |
65 @param kwargs: All further keyword arguments. | |
66 """ | |
67 ShellCommand.__init__(self, **kwargs) | |
68 self.addFactoryArguments(topdir=topdir, | |
69 builddir=builddir, | |
70 rpmdir=rpmdir, | |
71 sourcedir=sourcedir, | |
72 specdir=specdir, | |
73 srcrpmdir=srcrpmdir, | |
74 specfile=specfile, | |
75 dist=dist, | |
76 autoRelease=autoRelease, | |
77 vcsRevision=vcsRevision) | |
78 self.rpmbuild = ( | |
79 'rpmbuild --define "_topdir %s" --define "_builddir %s"' | |
80 ' --define "_rpmdir %s" --define "_sourcedir %s"' | |
81 ' --define "_specdir %s" --define "_srcrpmdir %s"' | |
82 ' --define "dist %s"' % (topdir, builddir, rpmdir, sourcedir, | |
83 specdir, srcrpmdir, dist)) | |
84 self.specfile = specfile | |
85 self.autoRelease = autoRelease | |
86 self.vcsRevision = vcsRevision | |
87 | |
88 def start(self): | |
89 """ | |
90 Buildbot Calls Me when it's time to start | |
91 """ | |
92 if self.autoRelease: | |
93 relfile = '%s.release' % ( | |
94 self.os.path.basename(self.specfile).split('.')[0]) | |
95 try: | |
96 rfile = open(relfile, 'r') | |
97 rel = int(rfile.readline().strip()) | |
98 rfile.close() | |
99 except: | |
100 rel = 0 | |
101 self.rpmbuild = self.rpmbuild + ' --define "_release %s"' % rel | |
102 rfile = open(relfile, 'w') | |
103 rfile.write(str(rel+1)) | |
104 rfile.close() | |
105 | |
106 if self.vcsRevision: | |
107 self.rpmbuild = self.rpmbuild + ' --define "_revision %s"' % \ | |
108 self.getProperty('got_revision') | |
109 | |
110 self.rpmbuild = self.rpmbuild + ' -ba %s' % self.specfile | |
111 | |
112 self.command = ['bash', '-c', self.rpmbuild] | |
113 | |
114 # create the actual RemoteShellCommand instance now | |
115 kwargs = self.remote_kwargs | |
116 kwargs['command'] = self.command | |
117 cmd = RemoteShellCommand(**kwargs) | |
118 self.setupEnvironment(cmd) | |
119 self.checkForOldSlaveAndLogfiles() | |
120 self.startCommand(cmd) | |
121 | |
122 def createSummary(self, log): | |
123 """ | |
124 Create nice summary logs. | |
125 | |
126 @param log: The log to create summary off of. | |
127 """ | |
128 rpm_prefixes = ['Provides:', 'Requires(rpmlib):', 'Requires:', | |
129 'Checking for unpackaged', 'Wrote:', | |
130 'Executing(%', '+ '] | |
131 rpm_err_pfx = [' ', 'RPM build errors:', 'error: '] | |
132 | |
133 rpmcmdlog = [] | |
134 rpmerrors = [] | |
135 | |
136 for line in log.readlines(): | |
137 for pfx in rpm_prefixes: | |
138 if pfx in line: | |
139 rpmcmdlog.append(line) | |
140 for err in rpm_err_pfx: | |
141 if err in line: | |
142 rpmerrors.append(line) | |
143 self.addCompleteLog('RPM Command Log', "".join(rpmcmdlog)) | |
144 self.addCompleteLog('RPM Errors', "".join(rpmerrors)) | |
OLD | NEW |