diff options
Diffstat (limited to 'buildbot/buildbot/steps/package/rpm/rpmbuild.py')
-rw-r--r-- | buildbot/buildbot/steps/package/rpm/rpmbuild.py | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/buildbot/buildbot/steps/package/rpm/rpmbuild.py b/buildbot/buildbot/steps/package/rpm/rpmbuild.py new file mode 100644 index 0000000..38bce85 --- /dev/null +++ b/buildbot/buildbot/steps/package/rpm/rpmbuild.py @@ -0,0 +1,144 @@ +# Dan Radez <dradez+buildbot@redhat.com> +# Steve 'Ashcrow' Milner <smilner+buildbot@redhat.com> +# +# This software may be freely redistributed under the terms of the GNU +# general public license. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +""" +RPM Building steps. +""" + +from buildbot.steps.shell import ShellCommand +from buildbot.process.buildstep import RemoteShellCommand + + +class RpmBuild(ShellCommand): + """ + Build and RPM based on pased spec filename + """ + + import os.path + + name = "rpmbuilder" + haltOnFailure = 1 + flunkOnFailure = 1 + description = ["RPMBUILD"] + descriptionDone = ["RPMBUILD"] + + def __init__(self, + specfile=None, + topdir='`pwd`', + builddir='`pwd`', + rpmdir='`pwd`', + sourcedir='`pwd`', + specdir='`pwd`', + srcrpmdir='`pwd`', + dist='.el5', + autoRelease=False, + vcsRevision=False, + **kwargs): + """ + Creates the RpmBuild object. + + @type specfile: str + @param specfile: the name of the spec file for the rpmbuild + @type topdir: str + @param topdir: the top directory for rpm building. + @type builddir: str + @param builddir: the directory to use for building + @type rpmdir: str + @param rpmdir: the directory to dump the rpms into + @type sourcedir: str + @param sourcedir: the directory that houses source code + @type srcrpmdir: str + @param srcrpmdir: the directory to dump source rpms into + @type dist: str + @param dist: the distribution to build for + @type autoRelease: boolean + @param autoRelease: if the auto release mechanics should be used + @type vcsRevision: boolean + @param vcsRevision: if the vcs revision mechanics should be used + @type kwargs: dict + @param kwargs: All further keyword arguments. + """ + ShellCommand.__init__(self, **kwargs) + self.addFactoryArguments(topdir=topdir, + builddir=builddir, + rpmdir=rpmdir, + sourcedir=sourcedir, + specdir=specdir, + srcrpmdir=srcrpmdir, + specfile=specfile, + dist=dist, + autoRelease=autoRelease, + vcsRevision=vcsRevision) + self.rpmbuild = ( + 'rpmbuild --define "_topdir %s" --define "_builddir %s"' + ' --define "_rpmdir %s" --define "_sourcedir %s"' + ' --define "_specdir %s" --define "_srcrpmdir %s"' + ' --define "dist %s"' % (topdir, builddir, rpmdir, sourcedir, + specdir, srcrpmdir, dist)) + self.specfile = specfile + self.autoRelease = autoRelease + self.vcsRevision = vcsRevision + + def start(self): + """ + Buildbot Calls Me when it's time to start + """ + if self.autoRelease: + relfile = '%s.release' % ( + self.os.path.basename(self.specfile).split('.')[0]) + try: + rfile = open(relfile, 'r') + rel = int(rfile.readline().strip()) + rfile.close() + except: + rel = 0 + self.rpmbuild = self.rpmbuild + ' --define "_release %s"' % rel + rfile = open(relfile, 'w') + rfile.write(str(rel+1)) + rfile.close() + + if self.vcsRevision: + self.rpmbuild = self.rpmbuild + ' --define "_revision %s"' % \ + self.getProperty('got_revision') + + self.rpmbuild = self.rpmbuild + ' -ba %s' % self.specfile + + self.command = ['bash', '-c', self.rpmbuild] + + # create the actual RemoteShellCommand instance now + kwargs = self.remote_kwargs + kwargs['command'] = self.command + cmd = RemoteShellCommand(**kwargs) + self.setupEnvironment(cmd) + self.checkForOldSlaveAndLogfiles() + self.startCommand(cmd) + + def createSummary(self, log): + """ + Create nice summary logs. + + @param log: The log to create summary off of. + """ + rpm_prefixes = ['Provides:', 'Requires(rpmlib):', 'Requires:', + 'Checking for unpackaged', 'Wrote:', + 'Executing(%', '+ '] + rpm_err_pfx = [' ', 'RPM build errors:', 'error: '] + + rpmcmdlog = [] + rpmerrors = [] + + for line in log.readlines(): + for pfx in rpm_prefixes: + if pfx in line: + rpmcmdlog.append(line) + for err in rpm_err_pfx: + if err in line: + rpmerrors.append(line) + self.addCompleteLog('RPM Command Log', "".join(rpmcmdlog)) + self.addCompleteLog('RPM Errors', "".join(rpmerrors)) |