blob: 34434bcd27c9218ee5776886bc1b03f79a90ff2f [file] [log] [blame]
Jakub Josef1b75ca82017-02-20 16:08:13 +01001package com.mirantis.mk
2
Jakub Josefc70c2a32017-03-29 16:38:30 +02003import java.util.regex.Pattern
Jakub Josef1b75ca82017-02-20 16:08:13 +01004/**
5 * Gerrit functions
6 *
7 */
8
9/**
10 * Execute git clone and checkout stage from gerrit review
11 *
12 * @param config LinkedHashMap
13 * config includes next parameters:
14 * - credentialsId, id of user which should make checkout
Jakub Josefbccd7862017-05-30 14:27:15 +020015 * - withMerge, merge master before build
16 * - withLocalBranch, prevent detached mode in repo
Jakub Josef1b75ca82017-02-20 16:08:13 +010017 * - withWipeOut, wipe repository and force clone
Jakub Josefbccd7862017-05-30 14:27:15 +020018 * Gerrit properties like GERRIT_SCHEMA can be passed in config as gerritSchema or will be obtained from env
19 * @param extraScmExtensions list of extra scm extensions which will be used for checkout (optional)
Jakub Josefc70c2a32017-03-29 16:38:30 +020020 * @return boolean result
Jakub Josef1b75ca82017-02-20 16:08:13 +010021 *
22 * Usage example:
23 * //anonymous gerrit checkout
24 * def gitFunc = new com.mirantis.mcp.Git()
25 * gitFunc.gerritPatchsetCheckout([
26 * withMerge : true
27 * ])
28 *
29 * def gitFunc = new com.mirantis.mcp.Git()
30 * gitFunc.gerritPatchsetCheckout([
31 * credentialsId : 'mcp-ci-gerrit',
32 * withMerge : true
33 * ])
34 */
Jakub Josefbccd7862017-05-30 14:27:15 +020035def gerritPatchsetCheckout(LinkedHashMap config, List extraScmExtensions = []) {
Jakub Josef1b75ca82017-02-20 16:08:13 +010036 def merge = config.get('withMerge', false)
37 def wipe = config.get('withWipeOut', false)
Jakub Josefbccd7862017-05-30 14:27:15 +020038 def localBranch = config.get('withLocalBranch', false)
Jakub Josef1b75ca82017-02-20 16:08:13 +010039 def credentials = config.get('credentialsId','')
Jakub Josef71c46a62017-03-29 14:55:33 +020040 def gerritScheme = config.get('gerritScheme', env["GERRIT_SCHEME"] ? env["GERRIT_SCHEME"] : "")
41 def gerritRefSpec = config.get('gerritRefSpec', env["GERRIT_REFSPEC"] ? env["GERRIT_REFSPEC"] : "")
42 def gerritName = config.get('gerritName', env["GERRIT_NAME"] ? env["GERRIT_NAME"] : "")
43 def gerritHost = config.get('gerritHost', env["GERRIT_HOST"] ? env["GERRIT_HOST"] : "")
44 def gerritPort = config.get('gerritPort', env["GERRIT_PORT"] ? env["GERRIT_PORT"] : "")
45 def gerritProject = config.get('gerritProject', env["GERRIT_PROJECT"] ? env["GERRIT_PROJECT"] : "")
46 def gerritBranch = config.get('gerritBranch', env["GERRIT_BRANCH"] ? env["GERRIT_BRANCH"] : "")
chnyda96a1e8a2017-03-28 16:02:13 +020047 def path = config.get('path', "")
chnyda7d25fc92017-03-29 10:51:59 +020048 def depth = config.get('depth', 0)
49 def timeout = config.get('timeout', 20)
Jakub Josef1b75ca82017-02-20 16:08:13 +010050
Jakub Josefc70c2a32017-03-29 16:38:30 +020051 if(_validGerritConfig(config)){
52 // default parameters
53 def scmExtensions = [
54 [$class: 'CleanCheckout'],
55 [$class: 'BuildChooserSetting', buildChooser: [$class: 'GerritTriggerBuildChooser']],
56 [$class: 'CheckoutOption', timeout: timeout],
57 [$class: 'CloneOption', depth: depth, noTags: false, reference: '', shallow: depth > 0, timeout: timeout]
58 ]
59 def scmUserRemoteConfigs = [
60 name: 'gerrit',
Jakub Josefc70c2a32017-03-29 16:38:30 +020061 ]
Jakub Josef30fc9212017-04-04 11:47:19 +020062 if(gerritRefSpec && gerritRefSpec != ""){
63 scmUserRemoteConfigs.put('refspec', gerritRefSpec)
64 }
Jakub Josef1b75ca82017-02-20 16:08:13 +010065
Jakub Josefc70c2a32017-03-29 16:38:30 +020066 if (credentials == '') {
67 // then try to checkout in anonymous mode
68 scmUserRemoteConfigs.put('url',"${gerritScheme}://${gerritHost}/${gerritProject}")
69 } else {
70 // else use ssh checkout
71 scmUserRemoteConfigs.put('url',"ssh://${gerritName}@${gerritHost}:${gerritPort}/${gerritProject}.git")
72 scmUserRemoteConfigs.put('credentialsId',credentials)
73 }
Jakub Josef1b75ca82017-02-20 16:08:13 +010074
Jakub Josefc70c2a32017-03-29 16:38:30 +020075 // if we need to "merge" code from patchset to GERRIT_BRANCH branch
76 if (merge) {
Jakub Josefbccd7862017-05-30 14:27:15 +020077 scmExtensions.add([$class: 'PreBuildMerge', options: [fastForwardMode: 'FF', mergeRemote: 'gerrit', mergeStrategy: 'default', mergeTarget: gerritBranch]])
Jakub Josefc70c2a32017-03-29 16:38:30 +020078 }
79 // we need wipe workspace before checkout
80 if (wipe) {
81 scmExtensions.add([$class: 'WipeWorkspace'])
82 }
Jakub Josef1b75ca82017-02-20 16:08:13 +010083
Jakub Josefbccd7862017-05-30 14:27:15 +020084 if(localBranch){
85 scmExtensions.add([$class: 'LocalBranch', localBranch: gerritBranch])
86 }
87
88 if(!extraScmExtensions.isEmpty()){
89 scmExtensions.addAll(extraScmExtensions)
90 }
Jakub Josefc70c2a32017-03-29 16:38:30 +020091 if (path == "") {
chnyda96a1e8a2017-03-28 16:02:13 +020092 checkout(
93 scm: [
94 $class: 'GitSCM',
95 branches: [[name: "${gerritBranch}"]],
96 extensions: scmExtensions,
97 userRemoteConfigs: [scmUserRemoteConfigs]
98 ]
99 )
Jakub Josefc70c2a32017-03-29 16:38:30 +0200100 } else {
101 dir(path) {
102 checkout(
103 scm: [
104 $class: 'GitSCM',
105 branches: [[name: "${gerritBranch}"]],
106 extensions: scmExtensions,
107 userRemoteConfigs: [scmUserRemoteConfigs]
108 ]
109 )
110 }
chnyda96a1e8a2017-03-28 16:02:13 +0200111 }
Jakub Josefc70c2a32017-03-29 16:38:30 +0200112 return true
Jakub Josef73d62142017-03-29 17:07:18 +0200113 }else{
Jakub Josef30fc9212017-04-04 11:47:19 +0200114 throw new Exception("Cannot perform gerrit checkout, given config file is not valid")
chnyda96a1e8a2017-03-28 16:02:13 +0200115 }
Jakub Josef30fc9212017-04-04 11:47:19 +0200116 return false
Jakub Josefc70c2a32017-03-29 16:38:30 +0200117}
118/**
119 * Execute git clone and checkout stage from gerrit review
120 *
Jakub Josefad34dbf2017-03-29 17:52:31 +0200121 * @param gerritUrl gerrit url with scheme
Jakub Josefc70c2a32017-03-29 16:38:30 +0200122 * "${GERRIT_SCHEME}://${GERRIT_NAME}@${GERRIT_HOST}:${GERRIT_PORT}/${GERRIT_PROJECT}.git
Jakub Josefad34dbf2017-03-29 17:52:31 +0200123 * @param gerritRef gerrit ref spec
124 * @param gerritBranch gerrit branch
125 * @param credentialsId jenkins credentials id
Jakub Josefc70c2a32017-03-29 16:38:30 +0200126 * @return boolean result
127 */
Jakub Josefad34dbf2017-03-29 17:52:31 +0200128def gerritPatchsetCheckout(gerritUrl, gerritRef, gerritBranch, credentialsId) {
129 def gerritParams = _getGerritParamsFromUrl(gerritUrl)
Jakub Josefd383f392017-03-29 16:52:04 +0200130 if(gerritParams.size() == 5){
Jakub Josefc70c2a32017-03-29 16:38:30 +0200131 gerritPatchsetCheckout([
Jakub Josefad34dbf2017-03-29 17:52:31 +0200132 credentialsId : credentialsId,
133 gerritBranch: gerritBranch,
134 gerritRefSpec: gerritRef,
Jakub Josefd383f392017-03-29 16:52:04 +0200135 gerritScheme: gerritParams[0],
136 gerritName: gerritParams[1],
137 gerritHost: gerritParams[2],
138 gerritPort: gerritParams[3],
139 gerritProject: gerritParams[4]
Jakub Josefc70c2a32017-03-29 16:38:30 +0200140 ])
141 return true
142 }
143 return false
144}
145
Jakub Josef50c9c3a2017-04-10 14:32:35 +0200146/**
147 * Return gerrit change object from gerrit API
Jakub Josef50c9c3a2017-04-10 14:32:35 +0200148 * @param gerritName gerrit user name (usually GERRIT_NAME property)
Jakub Josefb735dd42017-04-10 15:31:19 +0200149 * @param gerritHost gerrit host (usually GERRIT_HOST property)
Jakub Josef50c9c3a2017-04-10 14:32:35 +0200150 * @param gerritChangeNumber gerrit change number (usually GERRIT_CHANGE_NUMBER property)
151 * @param credentialsId jenkins credentials id for gerrit
152 * @return gerrit change object
153 */
Jakub Josefb735dd42017-04-10 15:31:19 +0200154def getGerritChange(gerritName, gerritHost, gerritChangeNumber, credentialsId){
Jakub Josef50c9c3a2017-04-10 14:32:35 +0200155 def common = new com.mirantis.mk.Common()
156 def ssh = new com.mirantis.mk.Ssh()
157 ssh.prepareSshAgentKey(credentialsId)
158 ssh.ensureKnownHosts(gerritHost)
159 return common.parseJSON(ssh.agentSh(String.format("ssh -p 29418 %s@%s gerrit query --format=JSON change:%s", gerritName, gerritHost, gerritChangeNumber)))
160}
161
Jakub Josef4edd7432017-05-10 17:58:56 +0200162/**
163 * Returns list of Gerrit trigger requested builds
164 * @param allBuilds list of all builds of some job
165 * @param gerritChange gerrit change number
166 * @param excludePatchset gerrit patchset number which will be excluded from builds, optional null
167 */
168@NonCPS
169def getGerritTriggeredBuilds(allBuilds, gerritChange, excludePatchset = null){
170 return allBuilds.findAll{job ->
171 def cause = job.causes[0]
172 if(cause instanceof com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritCause &&
173 cause.getEvent() instanceof com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated){
174 if(excludePatchset == null || excludePatchset == 0){
175 return cause.event.change.number.equals(String.valueOf(gerritChange))
176 }else{
177 return cause.event.change.number.equals(String.valueOf(gerritChange)) && !cause.event.patchSet.number.equals(String.valueOf(excludePatchset))
178 }
179 }
180 return false
181 }
182}
183
Jakub Josefd383f392017-03-29 16:52:04 +0200184@NonCPS
185def _getGerritParamsFromUrl(gitUrl){
186 def gitUrlPattern = Pattern.compile("(.+):\\/\\/(.+)@(.+):(.+)\\/(.+)")
187 def gitUrlMatcher = gitUrlPattern.matcher(gitUrl)
188 if(gitUrlMatcher.find() && gitUrlMatcher.groupCount() == 5){
189 return [gitUrlMatcher.group(1),gitUrlMatcher.group(2),gitUrlMatcher.group(3),gitUrlMatcher.group(4),gitUrlMatcher.group(5)]
190 }
191 return []
192}
193
Jakub Josefc70c2a32017-03-29 16:38:30 +0200194def _validGerritConfig(LinkedHashMap config){
Jakub Josef73d62142017-03-29 17:07:18 +0200195 return config.get("gerritScheme","") != null && config.get("gerritScheme","") != "" &&
196 config.get("gerritName","") != null && config.get("gerritName","") != "" &&
197 config.get("gerritHost","") != null && config.get("gerritHost","") != "" &&
198 config.get("gerritPort","") != null && config.get("gerritPort","") != "" &&
199 config.get("gerritProject","") != null && config.get("gerritProject","") != "" &&
Jakub Josef30fc9212017-04-04 11:47:19 +0200200 config.get("gerritBranch","") != null && config.get("gerritBranch","") != ""
Jakub Josef1b75ca82017-02-20 16:08:13 +0100201}