forked from theforeman/theforeman-rel-eng
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathci-jobs
executable file
·122 lines (94 loc) · 3.54 KB
/
ci-jobs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env python3
# pylint: disable=invalid-name
import getpass
import subprocess
from time import sleep
import click
import jenkins
JOBS = ['ping', 'tarballs-release', 'release_packages', 'foreman-release-pipeline',
'katello-release-pipeline', 'client-release-pipeline', 'plugins-release-pipeline']
def parse_pass_lines(lines):
for line in lines:
if not line.startswith('#') and ': ' in line:
yield line.split(': ', 1)
def get_pass(name):
try:
output = subprocess.check_output(['gopass', 'show', name], universal_newlines=True)
except subprocess.CalledProcessError:
return None, {}
lines = output.splitlines()
if not lines:
return None, {}
password = lines[0]
extras = {key: value for key, value in parse_pass_lines(lines[1:])}
return password, extras
def get_connection(url='https://ci.theforeman.org', username=None,
password=None, pass_name='theforeman/jenkins-token'):
if not password or not username:
pass_password, pass_extras = get_pass(pass_name)
if not password:
password = pass_password
if not username:
try:
username = pass_extras['Username']
except KeyError:
username = getpass.getuser()
return jenkins.Jenkins(url, username=username, password=password)
def get_last_build_number(server, job):
job_info = server.get_job_info(job)
return job_info['lastBuild']['number'] if job_info['lastBuild'] else -1
@click.command()
@click.argument('job', type=click.Choice(JOBS))
@click.argument('version')
@click.option('--wait/--no-wait', default=True)
def build(job, version, wait):
"""
Build a job"
"""
server = get_connection()
if job == 'ping':
user = server.get_whoami()
version = server.get_version()
click.echo('Hello %s from Jenkins %s' % (user['fullName'], version))
return
if job in ('release_packages', 'tarballs-release'):
major, minor, _ = version.split('.', 2)
parameters = {
'version': version,
'major_version': f'{major}.{minor}',
}
elif job == 'foreman-release-pipeline':
major, minor, _ = version.split('.', 2)
job = f'foreman-{major}.{minor}-release-pipeline'
parameters = {
'expected_version': version,
}
elif job == 'katello-release-pipeline':
major, minor, _ = version.split('.', 2)
job = f'katello-{major}.{minor}-rpm-pipeline'
parameters = None
elif job == 'client-release-pipeline':
major, minor, _ = version.split('.', 2)
job = f'foreman-client-{major}.{minor}-rpm-pipeline'
parameters = None
elif job == 'plugins-release-pipeline':
major, minor, _ = version.split('.', 2)
job = f'foreman-plugins-{major}.{minor}-rpm-pipeline'
parameters = None
# Get the last build so we can poll later
build_number_before = get_last_build_number(server, job)
server.build_job(job, parameters)
while True:
last_build_number = get_last_build_number(server, job)
if last_build_number > build_number_before:
break
sleep(1)
build_info = server.get_build_info(job, last_build_number)
click.echo(build_info['url'])
if wait:
while build_info['building']:
sleep(1)
build_info = server.get_build_info(job, last_build_number)
click.echo(build_info['result'])
if __name__ == '__main__':
build() # pylint: disable=no-value-for-parameter