Add CI script to retrieve info from build logs
This should serve as a base for retrieving useful information from the kolla build logs. For now, the script warns about obsolete package names and helps track packages that are installed too many times in different images. It only supports rpm-based distros for now. Change-Id: I160b6ede1336bd0c202621a48ca0218f72fc1270
This commit is contained in:
parent
7e770472b1
commit
3a644f7764
80
tests/files/process_build_logs.py
Executable file
80
tests/files/process_build_logs.py
Executable file
@ -0,0 +1,80 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import argparse
|
||||
import collections
|
||||
import glob
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Parse kolla build logs and extract useful information about '
|
||||
'the installed packages.')
|
||||
parser.add_argument('-l', '--logdir',
|
||||
help='Path to the build log files',
|
||||
required=True)
|
||||
parser.add_argument('-b', '--base',
|
||||
help='The kolla base_distro',
|
||||
required=True)
|
||||
args = vars(parser.parse_args())
|
||||
|
||||
if args['base'] not in ['centos', 'rhel', 'oraclelinux']:
|
||||
print("Non rpm-based distros are not yet supported.")
|
||||
sys.exit()
|
||||
|
||||
obsolete = {}
|
||||
pkg_installs = collections.defaultdict(set)
|
||||
|
||||
for filename in glob.glob(os.path.join(args['logdir'], '*.log')):
|
||||
image = os.path.splitext(os.path.basename(filename))[0]
|
||||
with open(filename) as f:
|
||||
for line in f:
|
||||
m = re.search(r"Package (.+) is obsoleted by (.+),", line)
|
||||
if m:
|
||||
if not m.group(1) in obsolete:
|
||||
obsolete[m.group(1)] = {'obsoleted_by': m.group(2),
|
||||
'images': [image]}
|
||||
else:
|
||||
obsolete[m.group(1)]['images'].append(image)
|
||||
|
||||
m = re.search(r"Package (.+)\..+ .+ will be installed", line)
|
||||
if m:
|
||||
pkg_installs[m.group(1)].add(image)
|
||||
|
||||
m = re.search(r"Processing Dependency: (.+)\(", line)
|
||||
if m:
|
||||
pkg_installs[m.group(1)].add(image)
|
||||
|
||||
if obsolete:
|
||||
print("Found %s obsolete(s) package(s):" % len(obsolete))
|
||||
for pkg in obsolete:
|
||||
print("%s is obsoleted by %s (%s)" %
|
||||
(pkg,
|
||||
obsolete[pkg]['obsoleted_by'],
|
||||
', '.join(obsolete[pkg]['images'])))
|
||||
print('')
|
||||
|
||||
move_to_base_candidates = [
|
||||
pkg for pkg in pkg_installs if len(pkg_installs[pkg]) > 10
|
||||
and not ('base' in pkg_installs[pkg]
|
||||
or 'openstack-base' in pkg_installs[pkg])
|
||||
]
|
||||
|
||||
if move_to_base_candidates:
|
||||
print("Consider moving the following packages to a base image:")
|
||||
for pkg in move_to_base_candidates:
|
||||
print("%s (%s)" %
|
||||
(pkg,
|
||||
', '.join(pkg_installs[pkg])))
|
@ -55,6 +55,9 @@
|
||||
# fix the permissions for logs folder
|
||||
sudo chmod -R 777 logs
|
||||
|
||||
# Parse build logs and extract pkg install info
|
||||
tests/files/process_build_logs.py -l logs/build -b {{ base_distro }} > logs/packages-info.txt
|
||||
|
||||
# rename files to .txt; this is so that when displayed via
|
||||
# logs.openstack.org clicking results in the browser shows the
|
||||
# files, rather than trying to send it to another app or make you
|
||||
|
Loading…
Reference in New Issue
Block a user