1
2
3
4
5
6
7
8
9
10 """
11 RPM Building steps.
12 """
13
14 from buildbot.steps.shell import ShellCommand
15 from buildbot.process.buildstep import RemoteShellCommand
16
17
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
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
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
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))
145