def run(self): time.sleep(5) signal_runbuilds() time.sleep(1) pidfile_path = os.path.join(os.environ.get("BUILDDIR", "."), ".runbuilds.pid") with open(pidfile_path) as pidfile: pid = pidfile.read() os.kill(int(pid), signal.SIGTERM)
def run(self): time.sleep(5) signal_runbuilds() time.sleep(1) pidfile_path = os.path.join(os.environ.get("BUILDDIR", "."), ".runbuilds.pid") with open(pidfile_path) as pidfile: pid = pidfile.read() os.kill(int(pid), signal.SIGTERM)
def triggerBuild(self, bitbake, layers, variables, targets, brbe): layers = self.setLayers(bitbake, layers, targets) is_merged_attr = bitbake.req.project.merged_attr git_env = os.environ.copy() # (note: add custom environment settings here) try: # insure that the project init/build uses the selected bitbake, and not Toaster's del git_env['TEMPLATECONF'] del git_env['BBBASEDIR'] del git_env['BUILDDIR'] except KeyError: pass # init build environment from the clone if bitbake.req.project.builddir: builddir = bitbake.req.project.builddir else: builddir = '%s-toaster-%d' % (self.be.builddir, bitbake.req.project.id) oe_init = os.path.join(self.pokydirname, 'oe-init-build-env') # init build environment try: custom_script = ToasterSetting.objects.get(name="CUSTOM_BUILD_INIT_SCRIPT").value custom_script = custom_script.replace("%BUILDDIR%" ,builddir) self._shellcmd("bash -c 'source %s'" % (custom_script),env=git_env) except ToasterSetting.DoesNotExist: self._shellcmd("bash -c 'source %s %s'" % (oe_init, builddir), self.be.sourcedir,env=git_env) # update bblayers.conf if not is_merged_attr: bblconfpath = os.path.join(builddir, "conf/toaster-bblayers.conf") with open(bblconfpath, 'w') as bblayers: bblayers.write('# line added by toaster build control\n' 'BBLAYERS = "%s"' % ' '.join(layers)) # write configuration file confpath = os.path.join(builddir, 'conf/toaster.conf') with open(confpath, 'w') as conf: for var in variables: conf.write('%s="%s"\n' % (var.name, var.value)) conf.write('INHERIT+="toaster buildhistory"') else: # Append the Toaster-specific values directly to the bblayers.conf bblconfpath = os.path.join(builddir, "conf/bblayers.conf") bblconfpath_save = os.path.join(builddir, "conf/bblayers.conf.save") shutil.copyfile(bblconfpath, bblconfpath_save) with open(bblconfpath) as bblayers: content = bblayers.readlines() do_write = True was_toaster = False with open(bblconfpath,'w') as bblayers: for line in content: #line = line.strip('\n') if 'TOASTER_CONFIG_PROLOG' in line: do_write = False was_toaster = True elif 'TOASTER_CONFIG_EPILOG' in line: do_write = True elif do_write: bblayers.write(line) if not was_toaster: bblayers.write('\n') bblayers.write('#=== TOASTER_CONFIG_PROLOG ===\n') bblayers.write('BBLAYERS = "\\\n') for layer in layers: bblayers.write(' %s \\\n' % layer) bblayers.write(' "\n') bblayers.write('#=== TOASTER_CONFIG_EPILOG ===\n') # Append the Toaster-specific values directly to the local.conf bbconfpath = os.path.join(builddir, "conf/local.conf") bbconfpath_save = os.path.join(builddir, "conf/local.conf.save") shutil.copyfile(bbconfpath, bbconfpath_save) with open(bbconfpath) as f: content = f.readlines() do_write = True was_toaster = False with open(bbconfpath,'w') as conf: for line in content: #line = line.strip('\n') if 'TOASTER_CONFIG_PROLOG' in line: do_write = False was_toaster = True elif 'TOASTER_CONFIG_EPILOG' in line: do_write = True elif do_write: conf.write(line) if not was_toaster: conf.write('\n') conf.write('#=== TOASTER_CONFIG_PROLOG ===\n') for var in variables: if (not var.name.startswith("INTERNAL_")) and (not var.name == "BBLAYERS"): conf.write('%s="%s"\n' % (var.name, var.value)) conf.write('#=== TOASTER_CONFIG_EPILOG ===\n') # If 'target' is just the project preparation target, then we are done for target in targets: if "_PROJECT_PREPARE_" == target.target: logger.debug('localhostbecontroller: Project has been prepared. Done.') # Update the Build Request and release the build environment bitbake.req.state = BuildRequest.REQ_COMPLETED bitbake.req.save() self.be.lock = BuildEnvironment.LOCK_FREE self.be.save() # Close the project build and progress bar bitbake.req.build.outcome = Build.SUCCEEDED bitbake.req.build.save() # Update the project status bitbake.req.project.set_variable(Project.PROJECT_SPECIFIC_STATUS,Project.PROJECT_SPECIFIC_CLONING_SUCCESS) signal_runbuilds() return # clean the Toaster to build environment env_clean = 'unset BBPATH;' # clean BBPATH for <= YP-2.4.0 # run bitbake server from the clone if available # otherwise pick it from the PATH bitbake = os.path.join(self.pokydirname, 'bitbake', 'bin', 'bitbake') if not os.path.exists(bitbake): logger.info("Bitbake not available under %s, will try to use it from PATH" % self.pokydirname) for path in os.environ["PATH"].split(os.pathsep): if os.path.exists(os.path.join(path, 'bitbake')): bitbake = os.path.join(path, 'bitbake') break else: logger.error("Looks like Bitbake is not available, please fix your environment") toasterlayers = os.path.join(builddir,"conf/toaster-bblayers.conf") if not is_merged_attr: self._shellcmd('%s bash -c \"source %s %s; BITBAKE_UI="knotty" %s --read %s --read %s ' '--server-only -B 0.0.0.0:0\"' % (env_clean, oe_init, builddir, bitbake, confpath, toasterlayers), self.be.sourcedir) else: self._shellcmd('%s bash -c \"source %s %s; BITBAKE_UI="knotty" %s ' '--server-only -B 0.0.0.0:0\"' % (env_clean, oe_init, builddir, bitbake), self.be.sourcedir) # read port number from bitbake.lock self.be.bbport = -1 bblock = os.path.join(builddir, 'bitbake.lock') # allow 10 seconds for bb lock file to appear but also be populated for lock_check in range(10): if not os.path.exists(bblock): logger.debug("localhostbecontroller: waiting for bblock file to appear") time.sleep(1) continue if 10 < os.stat(bblock).st_size: break logger.debug("localhostbecontroller: waiting for bblock content to appear") time.sleep(1) else: raise BuildSetupException("Cannot find bitbake server lock file '%s'. Aborting." % bblock) with open(bblock) as fplock: for line in fplock: if ":" in line: self.be.bbport = line.split(":")[-1].strip() logger.debug("localhostbecontroller: bitbake port %s", self.be.bbport) break if -1 == self.be.bbport: raise BuildSetupException("localhostbecontroller: can't read bitbake port from %s" % bblock) self.be.bbaddress = "localhost" self.be.bbstate = BuildEnvironment.SERVER_STARTED self.be.lock = BuildEnvironment.LOCK_RUNNING self.be.save() bbtargets = '' for target in targets: task = target.task if task: if not task.startswith('do_'): task = 'do_' + task task = ':%s' % task bbtargets += '%s%s ' % (target.target, task) # run build with local bitbake. stop the server after the build. log = os.path.join(builddir, 'toaster_ui.log') local_bitbake = os.path.join(os.path.dirname(os.getenv('BBBASEDIR')), 'bitbake') if not is_merged_attr: self._shellcmd(['%s bash -c \"(TOASTER_BRBE="%s" BBSERVER="0.0.0.0:%s" ' '%s %s -u toasterui --read %s --read %s --token="" >>%s 2>&1;' 'BITBAKE_UI="knotty" BBSERVER=0.0.0.0:%s %s -m)&\"' \ % (env_clean, brbe, self.be.bbport, local_bitbake, bbtargets, confpath, toasterlayers, log, self.be.bbport, bitbake,)], builddir, nowait=True) else: self._shellcmd(['%s bash -c \"(TOASTER_BRBE="%s" BBSERVER="0.0.0.0:%s" ' '%s %s -u toasterui --token="" >>%s 2>&1;' 'BITBAKE_UI="knotty" BBSERVER=0.0.0.0:%s %s -m)&\"' \ % (env_clean, brbe, self.be.bbport, local_bitbake, bbtargets, log, self.be.bbport, bitbake,)], builddir, nowait=True) logger.debug('localhostbecontroller: Build launched, exiting. ' 'Follow build logs at %s' % log)
def triggerBuild(self, bitbake, layers, variables, targets, brbe): layers = self.setLayers(bitbake, layers, targets) is_merged_attr = bitbake.req.project.merged_attr git_env = os.environ.copy() # (note: add custom environment settings here) try: # insure that the project init/build uses the selected bitbake, and not Toaster's del git_env['TEMPLATECONF'] del git_env['BBBASEDIR'] del git_env['BUILDDIR'] except KeyError: pass # init build environment from the clone if bitbake.req.project.builddir: builddir = bitbake.req.project.builddir else: builddir = '%s-toaster-%d' % (self.be.builddir, bitbake.req.project.id) oe_init = os.path.join(self.pokydirname, 'oe-init-build-env') # init build environment try: custom_script = ToasterSetting.objects.get(name="CUSTOM_BUILD_INIT_SCRIPT").value custom_script = custom_script.replace("%BUILDDIR%" ,builddir) self._shellcmd("bash -c 'source %s'" % (custom_script),env=git_env) except ToasterSetting.DoesNotExist: self._shellcmd("bash -c 'source %s %s'" % (oe_init, builddir), self.be.sourcedir,env=git_env) # update bblayers.conf if not is_merged_attr: bblconfpath = os.path.join(builddir, "conf/toaster-bblayers.conf") with open(bblconfpath, 'w') as bblayers: bblayers.write('# line added by toaster build control\n' 'BBLAYERS = "%s"' % ' '.join(layers)) # write configuration file confpath = os.path.join(builddir, 'conf/toaster.conf') with open(confpath, 'w') as conf: for var in variables: conf.write('%s="%s"\n' % (var.name, var.value)) conf.write('INHERIT+="toaster buildhistory"') else: # Append the Toaster-specific values directly to the bblayers.conf bblconfpath = os.path.join(builddir, "conf/bblayers.conf") bblconfpath_save = os.path.join(builddir, "conf/bblayers.conf.save") shutil.copyfile(bblconfpath, bblconfpath_save) with open(bblconfpath) as bblayers: content = bblayers.readlines() do_write = True was_toaster = False with open(bblconfpath,'w') as bblayers: for line in content: #line = line.strip('\n') if 'TOASTER_CONFIG_PROLOG' in line: do_write = False was_toaster = True elif 'TOASTER_CONFIG_EPILOG' in line: do_write = True elif do_write: bblayers.write(line) if not was_toaster: bblayers.write('\n') bblayers.write('#=== TOASTER_CONFIG_PROLOG ===\n') bblayers.write('BBLAYERS = "\\\n') for layer in layers: bblayers.write(' %s \\\n' % layer) bblayers.write(' "\n') bblayers.write('#=== TOASTER_CONFIG_EPILOG ===\n') # Append the Toaster-specific values directly to the local.conf bbconfpath = os.path.join(builddir, "conf/local.conf") bbconfpath_save = os.path.join(builddir, "conf/local.conf.save") shutil.copyfile(bbconfpath, bbconfpath_save) with open(bbconfpath) as f: content = f.readlines() do_write = True was_toaster = False with open(bbconfpath,'w') as conf: for line in content: #line = line.strip('\n') if 'TOASTER_CONFIG_PROLOG' in line: do_write = False was_toaster = True elif 'TOASTER_CONFIG_EPILOG' in line: do_write = True elif do_write: conf.write(line) if not was_toaster: conf.write('\n') conf.write('#=== TOASTER_CONFIG_PROLOG ===\n') for var in variables: if (not var.name.startswith("INTERNAL_")) and (not var.name == "BBLAYERS"): conf.write('%s="%s"\n' % (var.name, var.value)) conf.write('#=== TOASTER_CONFIG_EPILOG ===\n') # If 'target' is just the project preparation target, then we are done for target in targets: if "_PROJECT_PREPARE_" == target.target: logger.debug('localhostbecontroller: Project has been prepared. Done.') # Update the Build Request and release the build environment bitbake.req.state = BuildRequest.REQ_COMPLETED bitbake.req.save() self.be.lock = BuildEnvironment.LOCK_FREE self.be.save() # Close the project build and progress bar bitbake.req.build.outcome = Build.SUCCEEDED bitbake.req.build.save() # Update the project status bitbake.req.project.set_variable(Project.PROJECT_SPECIFIC_STATUS,Project.PROJECT_SPECIFIC_CLONING_SUCCESS) signal_runbuilds() return # clean the Toaster to build environment env_clean = 'unset BBPATH;' # clean BBPATH for <= YP-2.4.0 # run bitbake server from the clone if available # otherwise pick it from the PATH bitbake = os.path.join(self.pokydirname, 'bitbake', 'bin', 'bitbake') if not os.path.exists(bitbake): logger.info("Bitbake not available under %s, will try to use it from PATH" % self.pokydirname) for path in os.environ["PATH"].split(os.pathsep): if os.path.exists(os.path.join(path, 'bitbake')): bitbake = os.path.join(path, 'bitbake') break else: logger.error("Looks like Bitbake is not available, please fix your environment") toasterlayers = os.path.join(builddir,"conf/toaster-bblayers.conf") if not is_merged_attr: self._shellcmd('%s bash -c \"source %s %s; BITBAKE_UI="knotty" %s --read %s --read %s ' '--server-only -B 0.0.0.0:0\"' % (env_clean, oe_init, builddir, bitbake, confpath, toasterlayers), self.be.sourcedir) else: self._shellcmd('%s bash -c \"source %s %s; BITBAKE_UI="knotty" %s ' '--server-only -B 0.0.0.0:0\"' % (env_clean, oe_init, builddir, bitbake), self.be.sourcedir) # read port number from bitbake.lock self.be.bbport = -1 bblock = os.path.join(builddir, 'bitbake.lock') # allow 10 seconds for bb lock file to appear but also be populated for lock_check in range(10): if not os.path.exists(bblock): logger.debug("localhostbecontroller: waiting for bblock file to appear") time.sleep(1) continue if 10 < os.stat(bblock).st_size: break logger.debug("localhostbecontroller: waiting for bblock content to appear") time.sleep(1) else: raise BuildSetupException("Cannot find bitbake server lock file '%s'. Aborting." % bblock) with open(bblock) as fplock: for line in fplock: if ":" in line: self.be.bbport = line.split(":")[-1].strip() logger.debug("localhostbecontroller: bitbake port %s", self.be.bbport) break if -1 == self.be.bbport: raise BuildSetupException("localhostbecontroller: can't read bitbake port from %s" % bblock) self.be.bbaddress = "localhost" self.be.bbstate = BuildEnvironment.SERVER_STARTED self.be.lock = BuildEnvironment.LOCK_RUNNING self.be.save() bbtargets = '' for target in targets: task = target.task if task: if not task.startswith('do_'): task = 'do_' + task task = ':%s' % task bbtargets += '%s%s ' % (target.target, task) # run build with local bitbake. stop the server after the build. log = os.path.join(builddir, 'toaster_ui.log') local_bitbake = os.path.join(os.path.dirname(os.getenv('BBBASEDIR')), 'bitbake') if not is_merged_attr: self._shellcmd(['%s bash -c \"(TOASTER_BRBE="%s" BBSERVER="0.0.0.0:%s" ' '%s %s -u toasterui --read %s --read %s --token="" >>%s 2>&1;' 'BITBAKE_UI="knotty" BBSERVER=0.0.0.0:%s %s -m)&\"' \ % (env_clean, brbe, self.be.bbport, local_bitbake, bbtargets, confpath, toasterlayers, log, self.be.bbport, bitbake,)], builddir, nowait=True) else: self._shellcmd(['%s bash -c \"(TOASTER_BRBE="%s" BBSERVER="0.0.0.0:%s" ' '%s %s -u toasterui --token="" >>%s 2>&1;' 'BITBAKE_UI="knotty" BBSERVER=0.0.0.0:%s %s -m)&\"' \ % (env_clean, brbe, self.be.bbport, local_bitbake, bbtargets, log, self.be.bbport, bitbake,)], builddir, nowait=True) logger.debug('localhostbecontroller: Build launched, exiting. ' 'Follow build logs at %s' % log)