build-pkgs: Fixed some issues after adding layer build support

Created the list of 'success', 'fail' with the build types
after adding layer build.
Fixed the issue that the binary packages of kernel modules
are removed from deb-local-build by the late build with type
for using the same deb cache.

Story: 2008846
Task: 45088

Test Plan:
Pass: build-pkgs -c -a -b std
Pass: build-image -t std

Signed-off-by: hbai <haiqing.bai@windriver.com>
Change-Id: I957c1e8b39632f2b4481325b9d68bac0705e1569
This commit is contained in:
hbai 2022-04-18 02:14:01 +00:00
parent 75dd6c960a
commit 3e3d8170d5

View File

@ -264,11 +264,9 @@ class BuildController():
'dsc_maker': {},
}
self.lists = {
'success': [],
'fail': [],
'build-needed': [],
'uploaded': []
}
self.build_types = []
self.pkgs_digests = {}
if not self.kits['repo_mgr']:
rlogger = logging.getLogger('repo_manager')
@ -289,8 +287,13 @@ class BuildController():
build_types_to_init = ALL_BUILD_TYPES
if build_types is not None:
build_types_to_init = build_types
self.build_types = build_types_to_init
for build_type in build_types_to_init:
self.lists['success_' + build_type] = []
self.lists['fail_' + build_type] = []
self.lists['build-needed_' + build_type] = []
if not build_type in self.kits['dsc_cache']:
pkl_file = os.path.join(BUILD_ROOT, build_type, 'dsc.pkl')
self.kits['dsc_cache'][build_type] = dsccache.DscCache(logger, pkl_file)
@ -392,7 +395,7 @@ class BuildController():
return ret
def upload_with_deb(self, package, debs_dir):
def upload_with_deb(self, package, debs_dir, build_type):
"""
upload the local build debian binaries to repo manager
Params:
@ -400,8 +403,12 @@ class BuildController():
debs_dir: the directory to debian binaries
"""
logger.debug(' '.join(['Remove all old version of debs for', package]))
debs_clue = os.path.join(os.environ.get('MY_BUILD_PKG_DIR'),
'debs_entry.pkl')
if build_type == 'rt':
debs_clue = os.path.join(os.environ.get('MY_BUILD_PKG_DIR'),
'debs_entry_rt.pkl')
else:
debs_clue = os.path.join(os.environ.get('MY_BUILD_PKG_DIR'),
'debs_entry.pkl')
subdebs = debsentry.get_subdebs(debs_clue, package, logger)
if subdebs:
for deb in subdebs:
@ -502,7 +509,7 @@ class BuildController():
'Finished at')
if 'success' in ret:
self.upload_with_deb(pkg_name, os.path.join(BUILD_ROOT,
build_type, pkg_name))
build_type, pkg_name), build_type)
self.req_kill_task('sbuild')
status = 'success'
return status
@ -555,7 +562,7 @@ class BuildController():
skip_build = True
if self.attrs['avoid'] and skip_build:
self.lists['success'].append(pkg_dir)
self.lists['success_' + build_type].append(pkg_dir)
logger.info(' '.join(['Skip build', pkg_name, 'again']))
logger.info(' '.join(['Force to build, please use -c/--clean']))
return []
@ -593,6 +600,7 @@ class BuildController():
deps_resolver = dsc_depend.Dsc_build_order(dsc_list_file, logger)
build_counter = {}
dscs_list = get_dsc_list_from_dict(pkgs_dsc)
logger.debug('There are %d packages to be built this round', len(dscs_list))
while dscs_list:
pkgs_can_build = deps_resolver.get_build_able_pkg(1)
@ -603,28 +611,38 @@ class BuildController():
logger.info(' '.join(['Depends resolver tells to build',
os.path.basename(dsc_path)]))
pkg_dir = get_pkg_dir_from_dsc(pkgs_dsc, dsc_path)
if pkg_dir in self.lists['success_' + build_type]:
logger.warning("Package %s has been built, wrong layer location? skip", pkg_dir)
dscs_list.remove(dsc_path)
continue
pkg_name = discovery.package_dir_to_package_name(pkg_dir, distro=self.attrs['distro'])
status = self.req_add_task(pkg_dir, dsc_path, build_type=build_type)
if pkg_name in build_counter.keys():
build_counter[pkg_name] += 1
if pkg_dir in build_counter.keys():
build_counter[pkg_dir] += 1
else:
build_counter[pkg_name] = 1
logger.debug("Attempting to build package %s for the %d time", pkg_name, build_counter[pkg_name])
build_counter[pkg_dir] = 1
logger.debug("Attempting to build package %s for the %d time", pkg_dir, build_counter[pkg_dir])
if 'success' in status:
logger.info(' '.join(['Successfully built',
pkg_name]))
pkg_dir]))
deps_resolver.pkg_accomplish(dsc_path)
dscs_list.remove(dsc_path)
self.lists['success'].append(pkg_dir)
logger.info('Removed dsc %s from list after successfully build', dsc_path)
self.lists['success_' + build_type].append(pkg_dir)
logger.info('Added %s to success list success_%s', pkg_dir, build_type)
pkg_md5 = self.pkgs_digests[pkg_dir]
self.kits['dsc_cache'][build_type].set_package_digest(pkg_dir, pkg_md5)
else:
self.lists['fail'].append(pkg_dir)
if build_counter[pkg_name] >= MAX_PKG_BUILD_COUNT:
self.lists['fail_' + build_type].append(pkg_dir)
logger.error('Added %s to fail list fail_%s', pkg_dir, build_type)
if build_counter[pkg_dir] >= MAX_PKG_BUILD_COUNT:
deps_resolver.pkg_accomplish(dsc_path)
logger.warning('Notify depends resolver after %d attempts for %s', MAX_PKG_BUILD_COUNT, pkg_dir)
dscs_list.remove(dsc_path)
logger.error("Failed to build package %s after %d attempts, giving up", pkg_name, build_counter[pkg_name])
logger.info('Removed dsc %s from list after failed attempts', dsc_path)
logger.error("Failed to build package %s after %d attempts, giving up", pkg_dir, build_counter[pkg_dir])
logger.info("For the detailed reasons, please check the logs:")
logger.info("\'cat ${MY_WORKSPACE}/<std or rt>/<failed package>/*.build\'")
else:
@ -763,12 +781,13 @@ class BuildController():
def build_packages(self, pkg_dirs, build_type=STX_DEFAULT_BUILD_TYPE):
# remove duplication
pkg_dirs = list(set(pkg_dirs))
logger.debug(' '.join(['build_packages: Building: ', str(pkg_dirs)]))
fdsc_file = None
packages_dscs = {}
self.lists['build-needed'] = pkg_dirs
logger.debug('Length of build-needed_%s:%d before extending', build_type, len(self.lists['build-needed_' + build_type]))
self.lists['build-needed_' + build_type].extend(pkg_dirs)
logger.debug('Length of build-needed_%s:%d after extending', build_type, len(self.lists['build-needed_' + build_type]))
build_dir = os.path.join(BUILD_ROOT, build_type)
os.makedirs(build_dir, exist_ok=True)
@ -817,34 +836,34 @@ class BuildController():
packages want to build
"""
ret_val = 0
logger.info("Total packages needing to be built: %d", len(self.lists['build-needed']))
success_list = list(set(self.lists['success']))
success_number = len(success_list)
if success_number > 0:
logger.info("Successfully built: %d", success_number)
for pkg_dir in sorted(success_list):
pkg_name = discovery.package_dir_to_package_name(pkg_dir, self.attrs['distro'])
logger.info(pkg_name)
for build_type in self.build_types:
logger.info("Total %s packages needing to be built: %d", build_type, len(self.lists['build-needed_' + build_type]))
success_list = list(set(self.lists['success_' + build_type]))
success_number = len(success_list)
if success_number > 0:
logger.info("Successfully built: %d", success_number)
for pkg_dir in sorted(success_list):
pkg_name = discovery.package_dir_to_package_name(pkg_dir, self.attrs['distro'])
logger.info(pkg_name)
# failed_pkg_dirs is the universal set of failed packages for various reasons
failed_pkg_dirs = list(set(self.lists['build-needed']) - set(self.lists['success']))
failed_number = len(failed_pkg_dirs)
if failed_number > 0:
ret_val = 1
logger.error("Failed to build: %d", failed_number)
for pkg_dir in sorted(failed_pkg_dirs):
pkg_name = discovery.package_dir_to_package_name(pkg_dir, self.attrs['distro'])
logger.error(pkg_name)
# self.lists['fail'] is the subset of failed_pkg_dirs
# particularly refer to those failed packages reported by pkgbuilder
if len(self.lists['fail']) > 0:
logger.info("List of failed packages:")
for pkg_dir in sorted(list(set(self.lists['fail']))):
failed_pkg_dirs = list(set(self.lists['build-needed_' + build_type]) - set(self.lists['success_' + build_type]))
failed_number = len(failed_pkg_dirs)
if failed_number > 0:
ret_val = 1
logger.error("Failed to build: %d", failed_number)
for pkg_dir in sorted(failed_pkg_dirs):
pkg_name = discovery.package_dir_to_package_name(pkg_dir, self.attrs['distro'])
logger.error(pkg_name)
logger.info("For the failure reason, you can check with:")
logger.info("\'cat /localdisk/builder.log | grep ERROR\' or")
logger.info("\'cat ${MY_WORKSPACE}/<std or rt>/<Failed package>/*.build\'")
# self.lists['fail'] is the subset of failed_pkg_dirs
# particularly refer to those failed packages reported by pkgbuilder
if len(self.lists['fail_' + build_type]) > 0:
logger.info("List of failed packages:")
for pkg_dir in sorted(list(set(self.lists['fail_' + build_type]))):
pkg_name = discovery.package_dir_to_package_name(pkg_dir, self.attrs['distro'])
logger.error(pkg_name)
logger.info("For the failure reason, you can check with:")
logger.info("\'cat /localdisk/builder.log | grep ERROR\' or")
logger.info("\'cat ${MY_WORKSPACE}/<std or rt>/<Failed package>/*.build\'")
return ret_val