Commit | Line | Data |
---|---|---|
017c762b JR |
1 | enum KernelVersioning { |
2 | MAJOR,MINOR,REVISION,BUILD | |
3 | } | |
4 | ||
5 | class KernelVersion implements Comparable<KernelVersion> { | |
6 | int major = -1 | |
7 | int minor = -1 | |
8 | int revision = -1 | |
9 | int build = -1 | |
10 | int rc = -1 | |
5a67a345 | 11 | String gitRefs |
017c762b JR |
12 | |
13 | // Default Constructor | |
14 | KernelVersion() {} | |
15 | ||
16 | // Parse a version string of format X,Y,Z,W-A | |
5a67a345 JR |
17 | KernelVersion(String version, String ref) { |
18 | gitRefs = ref | |
19 | def tokenVersion | |
017c762b JR |
20 | def token |
21 | if (version.contains('-')) { | |
22 | // Release canditate | |
23 | token = version.tokenize('-') | |
24 | tokenVersion = token[0] | |
25 | if (token[1].isInteger()) { | |
26 | rc = token[1].toInteger() | |
27 | } | |
28 | } else { | |
29 | tokenVersion = version | |
30 | } | |
31 | ||
32 | tokenVersion = tokenVersion.tokenize('.') | |
33 | ||
34 | def tagEnum = KernelVersioning.MAJOR | |
35 | tokenVersion.each { | |
36 | if (it.isInteger()) { | |
37 | switch (tagEnum) { | |
38 | case KernelVersioning.MAJOR: | |
39 | major = it.toInteger() | |
40 | tagEnum = KernelVersioning.MINOR | |
41 | break | |
42 | case KernelVersioning.MINOR: | |
43 | minor = it.toInteger() | |
44 | tagEnum = KernelVersioning.REVISION | |
45 | break | |
46 | case KernelVersioning.REVISION: | |
47 | revision = it.toInteger() | |
48 | tagEnum = KernelVersioning.BUILD | |
49 | break | |
50 | case KernelVersioning.BUILD: | |
51 | build = it.toInteger() | |
52 | tagEnum = -1 | |
53 | break | |
54 | default: | |
55 | println("Unsupported version extension") | |
56 | println("Trying to parse: ${version}") | |
57 | println("Invalid sub version value: ${it}") | |
58 | //TODO: throw exception for jenkins | |
59 | } | |
60 | } | |
61 | } | |
62 | } | |
63 | ||
64 | ||
65 | String print() { | |
66 | String ret = "" | |
67 | if (major != -1) { | |
68 | ret += major | |
69 | if (minor != -1) { | |
70 | ret += "." + minor | |
71 | if (revision != -1) { | |
72 | ret += "." + revision | |
73 | if (build != -1) { | |
74 | ret += "." + build | |
75 | } | |
76 | } | |
77 | } | |
78 | if (rc != -1) { | |
5a67a345 | 79 | ret += "-rc" + rc |
017c762b JR |
80 | } |
81 | } | |
82 | return ret | |
83 | } | |
84 | ||
85 | @Override | |
86 | int compareTo(KernelVersion kernelVersion) { | |
87 | return major <=> kernelVersion.major ?: minor <=> kernelVersion.minor ?: revision <=> kernelVersion.revision ?: build <=> kernelVersion.build ?: rc <=> kernelVersion.rc | |
88 | } | |
89 | } | |
90 | ||
5a67a345 | 91 | def cutoff = [major: 3, minor: 19,revision:-1, build:-1, rc:-1] |
017c762b JR |
92 | def linuxURL = "git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git" |
93 | def modulesURL = "git://git.lttng.org/lttng-modules.git" | |
94 | ||
95 | // Linux specific variable | |
96 | String linuxCheckoutTo = "linux-source" | |
97 | String recipeCheckoutTo = "recipe" | |
98 | String modulesCheckoutTo = "lttng-modules" | |
99 | ||
100 | def linuxGitReference = "/home/jenkins/gitcache/linux-stable.git" | |
101 | String process = "git ls-remote -t $linuxURL | cut -c42- | sort -V" | |
102 | ||
81f87da0 JR |
103 | // Chekf if we are on jenkins |
104 | // Useful for outside jenkins devellopment related to groovy only scripting | |
105 | def isJenkinsInstance = binding.variables.containsKey('JENKINS_HOME') | |
106 | ||
017c762b JR |
107 | // Split the string into sections based on | |
108 | // And pipe the results together | |
109 | def out = new StringBuilder() | |
110 | def err = new StringBuilder() | |
111 | Process result = process.tokenize( '|' ).inject( null ) { p, c -> | |
112 | if( p ) | |
113 | p | c.execute() | |
114 | else | |
115 | c.execute() | |
116 | } | |
117 | ||
118 | result.waitForProcessOutput(out,err) | |
119 | ||
120 | if ( result.exitValue() == 0 ) { | |
121 | def branches = out.readLines().collect { | |
81f87da0 | 122 | // Scrap special string tag |
5a67a345 | 123 | it.replaceAll("\\^\\{\\}", '') |
017c762b JR |
124 | } |
125 | ||
126 | branches = branches.unique() | |
017c762b | 127 | |
81f87da0 | 128 | List versions = [] |
017c762b | 129 | branches.each { branch -> |
5a67a345 JR |
130 | def stripBranch = branch.replaceAll("rc", '').replaceAll(/refs\/tags\/v/,'') |
131 | KernelVersion kVersion = new KernelVersion(stripBranch, branch) | |
017c762b JR |
132 | versions.add(kVersion) |
133 | } | |
134 | ||
81f87da0 | 135 | // Sort the version via Comparable implementation of KernelVersion |
017c762b JR |
136 | versions = versions.sort() |
137 | ||
81f87da0 | 138 | // Find the version cut of |
017c762b JR |
139 | def cutoffPos = versions.findIndexOf{(it.major >= cutoff.major) && (it.minor >= cutoff.minor) && (it.revision >= cutoff.revision) && (it.build >= cutoff.build) && (it.rc >= cutoff.rc)} |
140 | ||
017c762b JR |
141 | // Get last version and include only last rc |
142 | def last | |
143 | def lastNoRcPos | |
144 | last = versions.last() | |
145 | if (last.rc != -1) { | |
146 | int i = versions.size()-1 | |
147 | while (i > -1 && versions[i].rc != -1 ) { | |
148 | i-- | |
149 | } | |
150 | lastNoRcPos = i + 1 | |
151 | } else { | |
152 | lastNoRcPos = versions.size() | |
153 | } | |
154 | ||
81f87da0 | 155 | // Actual job creation |
017c762b | 156 | for (int i = cutoffPos; i < versions.size() ; i++) { |
81f87da0 JR |
157 | |
158 | // Only create for valid build | |
017c762b JR |
159 | if ( (i < lastNoRcPos && versions[i].rc == -1) || (i >= lastNoRcPos)) { |
160 | println ("Preparing job for") | |
161 | String kernel = versions[i].print() | |
162 | String jobName = "kernel-${kernel}" | |
163 | String moduleJobName = "lttng-modules-master-kernel-${kernel}" | |
164 | println(jobName) | |
165 | println(moduleJobName) | |
81f87da0 JR |
166 | |
167 | // Jenkins only dsl | |
168 | if (isJenkinsInstance) { | |
169 | matrixJob("${jobName}") { | |
170 | using("linux-master") | |
171 | scm { | |
172 | git { | |
173 | remote { | |
174 | url("${linuxURL}") | |
175 | } | |
176 | branch(versions[i].gitRefs) | |
177 | shallowClone(true) | |
178 | relativeTargetDir(linuxCheckoutTo) | |
179 | reference(linuxGitReference) | |
180 | } | |
181 | } | |
182 | publishers { | |
183 | downstream(moduleJobName, 'SUCCESS') | |
184 | } | |
185 | } | |
186 | // Corresponding Module job | |
187 | matrixJob("${moduleJobName}") { | |
188 | using("modules") | |
189 | multiscm { | |
190 | git { | |
191 | remote { | |
192 | name("linux") | |
193 | url("${linuxURL}") | |
194 | } | |
195 | branch(versions[i].gitRefs) | |
196 | shallowClone(true) | |
197 | relativeTargetDir(linuxCheckoutTo) | |
198 | reference(linuxGitReference) | |
199 | } | |
200 | git { | |
201 | remote { | |
202 | name("lttng-modules") | |
203 | url(modulesURL) | |
204 | } | |
205 | branch("master") | |
206 | relativeTargetDir(modulesCheckoutTo) | |
207 | } | |
208 | } | |
209 | steps { | |
210 | copyArtifacts("${jobName}/arch=\$arch", "linux-artifact/**", '', false, false) { | |
211 | latestSuccessful(true) // Latest successful build | |
212 | } | |
213 | shell(readFileFromWorkspace('lttng-modules/lttng-modules-dsl-master.sh')) | |
214 | } | |
215 | } | |
216 | } | |
217 | } | |
218 | } | |
017c762b | 219 | } |