def listTasks(): # Get the first task from the list # Check if we know what to do # Mark it as started # Start doing it parser = OptionParser(usage="%prog list [options]") parser.add_option("--match-arch", metavar="REGEX", dest="matchArch", help="Limit architectures to those matching REGEX", default=".*") parser.add_option("--match-release", metavar="REGEX", dest="matchRelease", help="Limit releases to those matching REGEX", default=".*") parser.add_option("--testbed", metavar="BOOL", dest="useTestBed", help="Use the testbed tag collector to ", action="store_true", default=False) opts, args = parser.parse_args() options = { "release_pattern": opts.matchRelease, "architecture_pattern": opts.matchArch } if opts.useTestBed: options["tcBaseURL"] = TESTBED_URL results = tagCollectorAPI.listPendingTasks(**options) if not results: sys.exit(1) print "\n".join([str(x[0]) for x in results])
def listTasks(): # Get the first task from the list # Check if we know what to do # Mark it as started # Start doing it parser = OptionParser(usage="%prog list [options]") parser.add_option("--match-arch", metavar="REGEX", dest="matchArch", help="Limit architectures to those matching REGEX", default=".*") parser.add_option("--match-release", metavar="REGEX", dest="matchRelease", help="Limit releases to those matching REGEX", default=".*") parser.add_option("--testbed", metavar="BOOL", dest="useTestBed", help="Use the testbed tag collector to ", action="store_true", default=False) opts, args = parser.parse_args() options = {"release_pattern": opts.matchRelease, "architecture_pattern": opts.matchArch} if opts.useTestBed: options["tcBaseURL"] = TESTBED_URL results = tagCollectorAPI.listPendingTasks(**options) if not results: sys.exit(1) print "\n".join([str(x[0]) for x in results])
def process(): # Get the first task from the list # Check if we know what to do # Mark it as started # Start doing it parser = OptionParser(usage="%prog process [options]") parser.add_option("--match-arch", metavar="REGEX", dest="matchArch", help="Limit architectures to those matching REGEX", default=".*") parser.add_option("--match-release", metavar="REGEX", dest="matchRelease", help="Limit releases to those matching REGEX", default=".*") parser.add_option("--work-dir", "--top-dir", metavar="PATH", dest="workdir", help="Work dir where processing happens", default=None) parser.add_option("--jobs", "-j", type="int", metavar="N", dest="jobs", help="Number of parallel building threads", default=1) parser.add_option("--builders", type="int", metavar="N", dest="builders", help="Number of packages built in parallel", default=1) parser.add_option("--debug", metavar="PATH", dest="debug", help="Print out what's happening", action="store_true", default=False) parser.add_option("--dry-run", "-n", metavar="BOOL", dest="dryRun", help="Do not execute", action="store_true", default=False) parser.add_option("--testbed", metavar="BOOL", dest="useTestBed", help="Use the testbed tag collector to ", action="store_true", default=False) parser.add_option("--max-load", type="int", metavar="LOAD", dest="maxLoad", help="Do not execute if average last 15 minutes load > LOAD", default=8) opts, args = parser.parse_args() if not opts.workdir: print "Please specify a workdir" sys.exit(1) if exists("/etc/iss.nologin"): print "/etc/iss.nologin found. Not doing anything and waiting for machine out of maintainance mode." sys.exit(1) opts.workdir = abspath(opts.workdir) thisPath=dirname(__file__) getstatusoutput(format( "%(here)s/syncLogs.py %(workdir)s", here=thisPath, workdir=opts.workdir)) lockPath = join(opts.workdir, "cms", ".cmsLock") lock = Lock(lockPath, True, 60*60*12) if not lock: if opts.debug: print "Lock found in %s" % lockPath sys.exit(1) lock.__del__() if overloaded(opts.maxLoad): print "Current load exceeds maximum allowed of %s." % opts.maxLoad sys.exit(1) options = {"release_pattern": opts.matchRelease, "architecture_pattern": opts.matchArch} if opts.useTestBed: options["tcBaseURL"] = TESTBED_URL tasks = tagCollectorAPI.listPendingTasks(**options) print tasks if not len(tasks): if opts.debug: print "Nothing to be done which matches release %s and architecture %s" % (opts.matchArch, opts.matchRelease) sys.exit(1) # Default payload options. payload = {"debug": False} task_id, architecture_name, release_name, payloadNew = tasks[0] payload.update(payloadNew) if not payload.has_key("build-task"): print "Request task %s is not a valid build task" % task_id sys.exit(1) buildTask = payload["build-task"] if not buildTask in ["build-package"]: print "Unknown task for request %s: %s" % (task_id, buildTask) sys.exit(1) if opts.dryRun: print "Dry run. Not building" sys.exit(1) options = {"request_id": task_id, "release_name": release_name, "machine": socket.gethostname(), "pid": os.getpid()} if opts.useTestBed: options["tcBaseURL"] = TESTBED_URL options["results_url"] = "http://cmssdt.cern.ch/SDT/tc-ib-logs/%s/log.%s.html" % (socket.gethostname(), task_id) ok = tagCollectorAPI.setRequestBuilding(**options) if not ok: print "Could not change request %s state to building" % task_id sys.exit(1) # Build the package. # We gracefully handle any exception (broken pipe, ctrl-c, SIGKILL) # by failing the request if they happen. We also always cat # the log for this build in a global log file. log = "" getstatusoutput(format( "echo 'Log not sync-ed yet' > %(workdir)s/log.%(task_id)s;\n" "%(here)s/syncLogs.py %(workdir)s", task_id=task_id, here=thisPath, workdir=opts.workdir)) try: print "Building..." error, log = getstatusoutput(format("set -e ;\n" "mkdir -p %(workdir)s/%(task_id)s ;\n" "export CMS_PATH=%(workdir)s/cms ;\n" "cd %(workdir)s ;\n" "( export CVSROOT=:pserver:[email protected]/local/reps/CMSSW ;\n" " export CVS_PASSFILE=%(workdir)s/.cvspass ;\n" " echo '/1 :pserver:[email protected]:/cvs_server/repositories/CMSSW %(cvspass)s' > $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]:2401/cvs/CMSSW %(cvspass)s' >> $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]:2401/cvs_server/repositories/CMSSW %(cvspass)s' >> $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]/local/reps/CMSSW %(cvspass)s' >> $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]/local/reps/CMSSW %(cvspass)s' >> $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]:2401/local/reps/CMSSW %(cvspass)s' >> $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]:2401/local/reps/CMSSW %(cvspass)s' >> $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]:2401/local/reps/CMSSW %(cvspass)s' >> $CVS_PASSFILE;\n" " git clone https://github.com/cms-sw/cmsdist.git %(task_id)s/CMSDIST;\n" " pushd %(task_id)s/CMSDIST; git checkout %(cmsdistTag)s; popd;\n" " PKGTOOLS_TAG=\"`echo %(pkgtoolsTag)s | sed -e's/\\(V[0-9]*-[0-9]*\\).*/\\1-XX/'`\";\n" " git clone https://github.com/cms-sw/pkgtools.git %(task_id)s/PKGTOOLS\n" " pushd %(task_id)s/PKGTOOLS; git checkout $PKGTOOLS_TAG; popd;\n" " echo \"### RPM cms dummy `date +%%s`\n%%prep\n%%build\n%%install\n\" > %(task_id)s/CMSDIST/dummy.spec ;\n" " set -x ;\n" " rm -rf %(workdir)s/cms %(workdir)s/b ;\n" " perl -p -i -e 's/### RPM cms cmssw.*/### RPM cms cmssw %(base_release_name)s/' %(task_id)s/CMSDIST/cmssw.spec ;\n" " perl -p -i -e 's/### RPM cms cmssw-patch.*/### RPM cms cmssw-patch %(real_release_name)s/' %(task_id)s/CMSDIST/cmssw-patch.spec ;\n" " %(workdir)s/%(task_id)s/PKGTOOLS/cmsBuild %(debug)s --new-scheduler --cmsdist %(workdir)s/%(task_id)s/CMSDIST %(ignoreErrors)s --builders %(builders)s -j %(jobs)s --repository %(repository)s --architecture %(architecture)s --work-dir %(workdir)s/cms build %(package)s ;\n" " %(workdir)s/%(task_id)s/PKGTOOLS/cmsBuild %(debug)s --new-scheduler --cmsdist %(workdir)s/%(task_id)s/CMSDIST --repository %(repository)s --upload-tmp-repository %(tmpRepository)s %(syncBack)s --architecture %(architecture)s --work-dir %(workdir)s/cms upload %(package)s ;\n" " set +x ;\n" " echo AUTOIB SUCCESS) 2>&1 | tee %(workdir)s/log.%(task_id)s", workdir=opts.workdir, cvspass=CMSSW_CVSPASS, debug=payload["debug"] == True and "--debug" or "", cmsdistTag=sanitize(payload["CMSDIST"]), pkgtoolsTag=sanitize(payload["PKGTOOLS"]), architecture=sanitize(architecture_name), release_name=sanitize(release_name), base_release_name=re.sub("_[^_]*patch[0-9]*$", "", sanitize(payload["real_release_name"])), real_release_name=sanitize(payload["real_release_name"]), package=sanitize(payload["package"]), repository=sanitize(payload["repository"]), syncBack=payload["syncBack"] == True and "--sync-back" or "", ignoreErrors=payload["ignoreErrors"] == True and "-k" or "", tmpRepository=sanitize(payload["tmpRepository"]), task_id=task_id, jobs=opts.jobs, builders=opts.builders)) getstatusoutput(format("echo 'Task %(task_id)s completed successfully.' >> %(workdir)s/log.%(task_id)s", workdir=opts.workdir, task_id=task_id)) except Exception, e: log = open(format("%(workdir)s/log.%(task_id)s", workdir=opts.workdir, task_id=task_id)).read() log += "\nInterrupted externally." log += str(e) getstatusoutput(format("echo 'Interrupted externally' >> %(workdir)s/log.%(task_id)s", workdir=opts.workdir, task_id=task_id))
def process(): # Get the first task from the list # Check if we know what to do # Mark it as started # Start doing it parser = OptionParser(usage="%prog process [options]") parser.add_option("--match-arch", metavar="REGEX", dest="matchArch", help="Limit architectures to those matching REGEX", default=".*") parser.add_option("--match-release", metavar="REGEX", dest="matchRelease", help="Limit releases to those matching REGEX", default=".*") parser.add_option("--work-dir", "--top-dir", metavar="PATH", dest="workdir", help="Work dir where processing happens", default=None) parser.add_option("--jobs", "-j", type="int", metavar="N", dest="jobs", help="Number of parallel building threads", default=1) parser.add_option("--builders", type="int", metavar="N", dest="builders", help="Number of packages built in parallel", default=1) parser.add_option("--debug", metavar="PATH", dest="debug", help="Print out what's happening", action="store_true", default=False) parser.add_option("--dry-run", "-n", metavar="BOOL", dest="dryRun", help="Do not execute", action="store_true", default=False) parser.add_option("--testbed", metavar="BOOL", dest="useTestBed", help="Use the testbed tag collector to ", action="store_true", default=False) parser.add_option( "--max-load", type="int", metavar="LOAD", dest="maxLoad", help="Do not execute if average last 15 minutes load > LOAD", default=8) opts, args = parser.parse_args() if not opts.workdir: print "Please specify a workdir" sys.exit(1) if exists("/etc/iss.nologin"): print "/etc/iss.nologin found. Not doing anything and waiting for machine out of maintainance mode." sys.exit(1) opts.workdir = abspath(opts.workdir) thisPath = dirname(__file__) getstatusoutput( format("%(here)s/syncLogs.py %(workdir)s", here=thisPath, workdir=opts.workdir)) lockPath = join(opts.workdir, "cms", ".cmsLock") lock = Lock(lockPath, True, 60 * 60 * 12) if not lock: if opts.debug: print "Lock found in %s" % lockPath sys.exit(1) lock.__del__() if overloaded(opts.maxLoad): print "Current load exceeds maximum allowed of %s." % opts.maxLoad sys.exit(1) options = { "release_pattern": opts.matchRelease, "architecture_pattern": opts.matchArch } if opts.useTestBed: options["tcBaseURL"] = TESTBED_URL tasks = tagCollectorAPI.listPendingTasks(**options) print tasks if not len(tasks): if opts.debug: print "Nothing to be done which matches release %s and architecture %s" % ( opts.matchArch, opts.matchRelease) sys.exit(1) # Default payload options. payload = {"debug": False} task_id, architecture_name, release_name, payloadNew = tasks[0] payload.update(payloadNew) if not payload.has_key("build-task"): print "Request task %s is not a valid build task" % task_id sys.exit(1) buildTask = payload["build-task"] if not buildTask in ["build-package"]: print "Unknown task for request %s: %s" % (task_id, buildTask) sys.exit(1) if opts.dryRun: print "Dry run. Not building" sys.exit(1) options = { "request_id": task_id, "release_name": release_name, "machine": socket.gethostname(), "pid": os.getpid() } if opts.useTestBed: options["tcBaseURL"] = TESTBED_URL options[ "results_url"] = "http://cmssdt.cern.ch/SDT/tc-ib-logs/%s/log.%s.html" % ( socket.gethostname(), task_id) ok = tagCollectorAPI.setRequestBuilding(**options) if not ok: print "Could not change request %s state to building" % task_id sys.exit(1) # Build the package. # We gracefully handle any exception (broken pipe, ctrl-c, SIGKILL) # by failing the request if they happen. We also always cat # the log for this build in a global log file. log = "" getstatusoutput( format( "echo 'Log not sync-ed yet' > %(workdir)s/log.%(task_id)s;\n" "%(here)s/syncLogs.py %(workdir)s", task_id=task_id, here=thisPath, workdir=opts.workdir)) try: print "Building..." error, log = getstatusoutput( format( "set -e ;\n" "mkdir -p %(workdir)s/%(task_id)s ;\n" "export CMS_PATH=%(workdir)s/cms ;\n" "cd %(workdir)s ;\n" "( export CVSROOT=:pserver:[email protected]/local/reps/CMSSW ;\n" " export CVS_PASSFILE=%(workdir)s/.cvspass ;\n" " echo '/1 :pserver:[email protected]:/cvs_server/repositories/CMSSW %(cvspass)s' > $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]:2401/cvs/CMSSW %(cvspass)s' >> $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]:2401/cvs_server/repositories/CMSSW %(cvspass)s' >> $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]/local/reps/CMSSW %(cvspass)s' >> $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]/local/reps/CMSSW %(cvspass)s' >> $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]:2401/local/reps/CMSSW %(cvspass)s' >> $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]:2401/local/reps/CMSSW %(cvspass)s' >> $CVS_PASSFILE ;\n" " echo '/1 :pserver:[email protected]:2401/local/reps/CMSSW %(cvspass)s' >> $CVS_PASSFILE;\n" " git clone https://github.com/cms-sw/cmsdist.git %(task_id)s/CMSDIST;\n" " pushd %(task_id)s/CMSDIST; git checkout %(cmsdistTag)s; popd;\n" " PKGTOOLS_TAG=\"`echo %(pkgtoolsTag)s | sed -e's/\\(V[0-9]*-[0-9]*\\).*/\\1-XX/'`\";\n" " git clone https://github.com/cms-sw/pkgtools.git %(task_id)s/PKGTOOLS\n" " pushd %(task_id)s/PKGTOOLS; git checkout $PKGTOOLS_TAG; popd;\n" " echo \"### RPM cms dummy `date +%%s`\n%%prep\n%%build\n%%install\n\" > %(task_id)s/CMSDIST/dummy.spec ;\n" " set -x ;\n" " rm -rf %(workdir)s/cms %(workdir)s/b ;\n" " perl -p -i -e 's/### RPM cms cmssw.*/### RPM cms cmssw %(base_release_name)s/' %(task_id)s/CMSDIST/cmssw.spec ;\n" " perl -p -i -e 's/### RPM cms cmssw-patch.*/### RPM cms cmssw-patch %(real_release_name)s/' %(task_id)s/CMSDIST/cmssw-patch.spec ;\n" " %(workdir)s/%(task_id)s/PKGTOOLS/cmsBuild %(debug)s --new-scheduler --cmsdist %(workdir)s/%(task_id)s/CMSDIST %(ignoreErrors)s --builders %(builders)s -j %(jobs)s --repository %(repository)s --architecture %(architecture)s --work-dir %(workdir)s/cms build %(package)s ;\n" " %(workdir)s/%(task_id)s/PKGTOOLS/cmsBuild %(debug)s --new-scheduler --cmsdist %(workdir)s/%(task_id)s/CMSDIST --repository %(repository)s --upload-tmp-repository %(tmpRepository)s %(syncBack)s --architecture %(architecture)s --work-dir %(workdir)s/cms upload %(package)s ;\n" " set +x ;\n" " echo AUTOIB SUCCESS) 2>&1 | tee %(workdir)s/log.%(task_id)s", workdir=opts.workdir, cvspass=CMSSW_CVSPASS, debug=payload["debug"] == True and "--debug" or "", cmsdistTag=sanitize(payload["CMSDIST"]), pkgtoolsTag=sanitize(payload["PKGTOOLS"]), architecture=sanitize(architecture_name), release_name=sanitize(release_name), base_release_name=re.sub( "_[^_]*patch[0-9]*$", "", sanitize(payload["real_release_name"])), real_release_name=sanitize(payload["real_release_name"]), package=sanitize(payload["package"]), repository=sanitize(payload["repository"]), syncBack=payload["syncBack"] == True and "--sync-back" or "", ignoreErrors=payload["ignoreErrors"] == True and "-k" or "", tmpRepository=sanitize(payload["tmpRepository"]), task_id=task_id, jobs=opts.jobs, builders=opts.builders)) getstatusoutput( format( "echo 'Task %(task_id)s completed successfully.' >> %(workdir)s/log.%(task_id)s", workdir=opts.workdir, task_id=task_id)) except Exception, e: log = open( format("%(workdir)s/log.%(task_id)s", workdir=opts.workdir, task_id=task_id)).read() log += "\nInterrupted externally." log += str(e) getstatusoutput( format( "echo 'Interrupted externally' >> %(workdir)s/log.%(task_id)s", workdir=opts.workdir, task_id=task_id))