#!/usr/bin/python
base_distros = """
squeeze
wheezy
jessie
stretch
sid
""".split()
distro_upgrades = { 'squeeze': 'wheezy',
'wheezy': 'jessie',
'jessie': 'stretch',
'stretch': 'sid' }
oldoldstable = 'squeeze'
# ftp.de.debian.org runs mirror updates at 03:25, 09:25, 15:25 and 21:25 UTC and usually they run 10m...
trigger_times = { 'squeeze': '30 16 25 * *',
'wheezy': '30 16 1,15 * *',
'jessie': '30 10 * * 1,4',
'stretch': '30 10 */2 * *',
'sid': '30 4 * * *' }
targets = """
maintenance
bootstrap
gnome
kde
kde-full
cinnamon
lxde
xfce
full_desktop
qt4
qt5
haskell
developer
education-tasks
education-menus
education-astronomy
education-chemistry
education-common
education-desktop-gnome
education-desktop-kde
education-desktop-lxde
education-desktop-mate
education-desktop-other
education-desktop-sugar
education-desktop-xfce
education-development
education-electronics
education-geography
education-graphics
education-language
education-laptop
education-logic-games
education-main-server
education-mathematics
education-misc
education-music
education-networked
education-physics
education-services
education-standalone
education-thin-client
education-thin-client-server
education-workstation
""".split()
#
# not all packages are available in all distros
#
def get_targets_in_distro(distro, targets):
targets_in_distro = []
for target in targets:
# haskell, cinnamon, qt5 and edu tests not in squeeze
if distro == 'squeeze' and ( target == 'haskell' or target[:10] == 'education-' or target == 'cinnamon' or target == 'qt5' ):
continue
# qt5, education-desktop-mate and cinnamon weren't in wheezy
if distro == 'wheezy' and ( target == 'education-desktop-mate' or target == 'cinnamon' or target == 'qt5' ):
continue
# sugar has been removed from jessie and thus education-desktop-sugar has been removed from jessie and sid
if (distro == 'sid' or distro == 'jessie') and ( target == 'education-desktop-sugar' ):
continue
targets_in_distro.append(target)
return targets_in_distro
#
# who gets mail for which target
#
def get_recipients(target):
if target == 'maintenance':
return 'qa-jenkins-scm@lists.alioth.debian.org'
elif target == 'haskell':
return 'jenkins+debian-haskell qa-jenkins-scm@lists.alioth.debian.org pkg-haskell-maintainers@lists.alioth.debian.org'
elif target == 'gnome':
return 'jenkins+debian-qa pkg-gnome-maintainers@lists.alioth.debian.org qa-jenkins-scm@lists.alioth.debian.org'
elif target == 'cinnamon':
return 'jenkins+debian-cinnamon pkg-cinnamon-team@lists.alioth.debian.org qa-jenkins-scm@lists.alioth.debian.org'
elif target[:3] == 'kde' or target[:2] == 'qt':
return 'jenkins+debian-qa debian-qt-kde@lists.debian.org qa-jenkins-scm@lists.alioth.debian.org'
elif target[:10] == 'education-':
return 'jenkins+debian-edu debian-edu-commits@lists.alioth.debian.org'
else:
return 'jenkins+debian-qa qa-jenkins-scm@lists.alioth.debian.org'
#
# views for different targets
#
def get_view(target, distro):
if target == 'maintenance':
return 'jenkins.d.n'
elif target == 'haskell':
return 'haskell'
elif target[:10] == 'education-':
if distro in ('squeeze', 'wheezy'):
return 'edu_stable'
else:
return 'edu_devel'
else:
return 'chroot-installation'
#
# special descriptions used for some targets
#
spoken_names = {}
spoken_names = { 'gnome': 'GNOME',
'kde': 'KDE plasma desktop',
'kde-full': 'complete KDE desktop',
'cinnamon': 'Cinnamon',
'lxde': 'LXDE',
'xfce': 'Xfce',
'qt4': 'Qt4 cross-platform C++ application framework',
'qt5': 'Qt5 cross-platform C++ application framework',
'full_desktop': 'four desktop environments and the most commonly used applications and packages',
'haskell': 'all Haskell related packages',
'developer': 'four desktop environments and the most commonly used applications and packages - and the build depends for all of these' }
def get_spoken_name(target):
if target[:10] == 'education-':
return 'the Debian Edu metapackage '+target
elif target in spoken_names:
return spoken_names[target]
else:
return target
#
# nothing to edit below
#
print("""
- defaults:
name: chroot-installation
description: '{my_description}{do_not_edit}'
logrotate:
daysToKeep: 90
numToKeep: 30
artifactDaysToKeep: -1
artifactNumToKeep: -1
triggers:
- timed: '{my_time}'
builders:
- shell: '{my_shell}'
publishers:
- trigger:
project: '{my_trigger}'
- logparser:
parse-rules: '/srv/jenkins/logparse/debian.rules'
unstable-on-warning: 'false'
fail-on-error: 'false'
- email-ext:
recipients: '{my_recipients}'
first-failure: true
fixed: true
subject: '$BUILD_STATUS: $JOB_NAME/$BUILD_NUMBER'
attach-build-log: true
body: 'See $BUILD_URL/console or just $BUILD_URL for more information.'
properties:
- sidebar:
url: https://jenkins.debian.net/userContent/about.html
text: About jenkins.debian.net
icon: /userContent/images/debian-swirl-24x24.png
- sidebar:
url: https://jenkins.debian.net/view/{my_view}/
text: All {my_view} jobs
icon: /userContent/images/debian-jenkins-24x24.png
- sidebar:
url: http://www.profitbricks.com
text: Sponsored by Profitbricks
icon: /userContent/images/profitbricks-24x24.png
- priority:
job-prio: '{my_prio}'
- throttle:
max-total: 6
max-per-node: 6
enabled: true
option: category
categories:
- chroot-installation
wrappers:
- timeout:
timeout: 360
""")
for base_distro in sorted(base_distros):
for target in sorted(get_targets_in_distro(base_distro, targets)):
if target in ('bootstrap', 'maintenance'):
action = target
else:
action = 'install_'+target
# default job
if target == 'maintenance' or base_distro != oldoldstable:
print("""- job-template:
defaults: chroot-installation
name: '{name}_%(base_distro)s_%(action)s'""" %
dict(base_distro=base_distro,
action=action))
# upgrade job
if base_distro in distro_upgrades and action != 'maintenance':
print("""- job-template:
defaults: chroot-installation
name: '{name}_%(base_distro)s_%(action)s_upgrade_to_%(second_base)s'""" %
dict(base_distro=base_distro,
action=action,
second_base=distro_upgrades[base_distro]))
# upgrade job with upgrading apt+dpkg first
if base_distro in distro_upgrades and base_distro != oldoldstable and target[:10] != 'education-' and action != 'maintenance':
print("""- job-template:
defaults: chroot-installation
name: '{name}_%(base_distro)s_%(action)s_upgrade_to_%(second_base)s_aptdpkg_first'""" %
dict(base_distro=base_distro,
action=action,
second_base=distro_upgrades[base_distro]))
print("""
- project:
name: chroot-installation
do_not_edit: '
Job configuration source is chroot-installation.yaml.py.'
jobs:""")
for base_distro in sorted(base_distros):
for target in sorted(get_targets_in_distro(base_distro, targets)):
if target == 'maintenance':
description = 'Maintainance job for chroot-installation_'+base_distro+'_* jobs, do some cleanups and monitoring so that there is a predictable environment.'
shell = '/srv/jenkins/bin/maintenance.sh chroot-installation_'+base_distro
prio = 135
time = trigger_times[base_distro]
if base_distro in distro_upgrades.values():
trigger = 'chroot-installation_'+base_distro+'_bootstrap'
for item in distro_upgrades.items():
if item[1]==base_distro and base_distro in distro_upgrades:
trigger = trigger+', chroot-installation_'+base_distro+'_bootstrap_upgrade_to_'+distro_upgrades[base_distro]+', chroot-installation_'+base_distro+'_bootstrap_upgrade_to_'+distro_upgrades[base_distro]+'_aptdpkg_first'
else:
trigger = 'chroot-installation_'+base_distro+'_bootstrap_upgrade_to_'+distro_upgrades[base_distro]
elif target == 'bootstrap':
description = 'Debootstrap '+base_distro+'.'
shell = '/srv/jenkins/bin/chroot-installation.sh '+base_distro
prio = 131
time = ''
trigger = ''
for trigger_target in get_targets_in_distro(base_distro, targets):
if trigger_target not in ('maintenance', 'bootstrap'):
if trigger != '':
trigger = trigger+', '
trigger = trigger+'chroot-installation_'+base_distro+'_install_'+trigger_target
else:
description = 'Debootstrap '+base_distro+', then install '+get_spoken_name(target)+'.'
shell = '/srv/jenkins/bin/chroot-installation.sh '+base_distro+' '+target
prio = 130
time = ''
trigger = ''
if target in ('bootstrap', 'maintenance'):
action = target
else:
action = 'install_'+target
# default job
if target == 'maintenance' or base_distro != oldoldstable:
print(""" - '{name}_%(base_distro)s_%(action)s':
my_shell: '%(shell)s'
my_prio: '%(prio)s'
my_time: '%(time)s'
my_trigger: '%(trigger)s'
my_recipients: '%(recipients)s'
my_view: '%(view)s'
my_description: '%(description)s'""" %
dict(base_distro=base_distro,
action=action,
shell=shell,
prio=prio,
time=time,
trigger=trigger,
recipients=get_recipients(target),
view=get_view(target, base_distro),
description=description))
# upgrade job
if base_distro in distro_upgrades and action != 'maintenance':
if target == 'bootstrap':
shell = '/srv/jenkins/bin/chroot-installation.sh '+base_distro+' none '+distro_upgrades[base_distro]
description = 'Debootstrap '+base_distro+', then upgrade to '+distro_upgrades[base_distro]+'.'
trigger = ''
for trigger_target in get_targets_in_distro(base_distro, targets):
if trigger_target not in ('maintenance', 'bootstrap'):
if trigger != '':
trigger = trigger+', '
trigger = trigger+'chroot-installation_'+base_distro+'_install_'+trigger_target+'_upgrade_to_'+distro_upgrades[base_distro]
else:
shell = '/srv/jenkins/bin/chroot-installation.sh '+base_distro+' '+target+' '+distro_upgrades[base_distro]
description = 'Debootstrap '+base_distro+', then install '+get_spoken_name(target)+', then upgrade to '+distro_upgrades[base_distro]+'.'
trigger = ''
print(""" - '{name}_%(base_distro)s_%(action)s_upgrade_to_%(second_base)s':
my_shell: '%(shell)s'
my_prio: '%(prio)s'
my_time: ''
my_trigger: '%(trigger)s'
my_recipients: '%(recipients)s'
my_view: '%(view)s'
my_description: '%(description)s'""" %
dict(base_distro=base_distro,
action=action,
shell=shell,
prio=prio,
trigger=trigger,
recipients=get_recipients(target),
view=get_view(target, base_distro),
second_base=distro_upgrades[base_distro],
description=description))
# upgrade job with upgrading apt+dpkg first
if base_distro in distro_upgrades and base_distro != oldoldstable and target[:10] != 'education-' and action != 'maintenance':
description = 'Debootstrap '+base_distro+', then upgrade apt and dpkg to '+distro_upgrades[base_distro]+' and then everything else.'
if target == 'bootstrap':
trigger = ''
for trigger_target in get_targets_in_distro(base_distro, targets):
if trigger_target not in ('maintenance', 'bootstrap'):
if trigger != '':
trigger = trigger+', '
trigger = trigger+'chroot-installation_'+base_distro+'_install_'+trigger_target+'_upgrade_to_'+distro_upgrades[base_distro]+'_aptdpkg_first'
print(""" - '{name}_%(base_distro)s_%(action)s_upgrade_to_%(second_base)s_aptdpkg_first':
my_shell: '%(shell)s'
my_prio: '%(prio)s'
my_time: ''
my_trigger: '%(trigger)s'
my_recipients: '%(recipients)s'
my_view: '%(view)s'
my_description: '%(description)s'""" %
dict(base_distro=base_distro,
action=action,
shell=shell,
prio=prio,
trigger=trigger,
recipients=get_recipients(target),
view=get_view(target, base_distro),
second_base=distro_upgrades[base_distro],
description=description))