blob: d1c23a16b77dbb72bef74f35bf49bf539991cdb3 [file] [log] [blame]
Jakub Josef83379312017-03-29 18:12:34 +02001
2/**
3 * Test salt models pipeline
4 * DEFAULT_GIT_REF
5 * DEFAULT_GIT_URL
6 * CREDENTIALS_ID
7 */
8
Jakub Josefc5a223a2017-03-01 14:40:08 +01009def common = new com.mirantis.mk.Common()
10def gerrit = new com.mirantis.mk.Gerrit()
Filip Pytloun38005aa2017-03-06 10:26:38 +010011def ssh = new com.mirantis.mk.Ssh()
12def git = new com.mirantis.mk.Git()
Jakub Josefc5a223a2017-03-01 14:40:08 +010013
Filip Pytloun19376a82017-03-07 12:29:00 +010014def gerritRef
15try {
16 gerritRef = GERRIT_REFSPEC
17} catch (MissingPropertyException e) {
18 gerritRef = null
19}
20
Jakub Josef83379312017-03-29 18:12:34 +020021def defaultGitRef, defaultGitUrl
Filip Pytloun19376a82017-03-07 12:29:00 +010022try {
Jakub Josef83379312017-03-29 18:12:34 +020023 defaultGitRef = DEFAULT_GIT_REF
24 defaultGitUrl = DEFAULT_GIT_URL
Filip Pytloun19376a82017-03-07 12:29:00 +010025} catch (MissingPropertyException e) {
Jakub Josef83379312017-03-29 18:12:34 +020026 defaultGitRef = null
27 defaultGitUrl = null
Filip Pytloun19376a82017-03-07 12:29:00 +010028}
Jakub Josef83379312017-03-29 18:12:34 +020029def checkouted = false
Jakub Joseffcb615e2017-04-10 14:34:40 +020030def merged = false
Filip Pytloun19376a82017-03-07 12:29:00 +010031
chnyda14e44292017-05-13 19:00:06 +020032def testMinion(minion)
chnyda51b03142017-05-10 17:15:27 +020033{
chnyda14e44292017-05-13 19:00:06 +020034 return sh(script: "reclass-salt -p ${minion}", returnStatus:true)
chnydaa9c88702017-05-09 16:51:07 +020035}
36
chnyda14e44292017-05-13 19:00:06 +020037
38
chnyda51b03142017-05-10 17:15:27 +020039def setupandtest(master) {
chnyda14e44292017-05-13 19:00:06 +020040 def img = docker.image("ubuntu:latest")
chnydaa9c88702017-05-09 16:51:07 +020041 def saltOpts = "--retcode-passthrough --force-color"
chnyda6c509b82017-05-11 08:41:12 +020042 def common = new com.mirantis.mk.Common()
43 def workspace = common.getWorkspace()
chnydaa9c88702017-05-09 16:51:07 +020044
chnyda14e44292017-05-13 19:00:06 +020045// -v ${workspace}:/srv/salt/reclass
46 img.inside("-u root:root --hostname=${master}") {
chnyda6c509b82017-05-11 08:41:12 +020047 wrap([$class: 'AnsiColorBuildWrapper']) {
chnyda14e44292017-05-13 19:00:06 +020048
49 sh("mkdir -p /srv/salt/ || true")
50 sh("cp -r ${workspace} /srv/salt/reclass")
Tomáš Kukrál500c0182017-05-11 13:46:19 +020051 sh("apt-get update && apt-get install -y curl subversion git python-pip sudo python-pip python-dev zlib1g-dev reclass git")
chnydace3b0d72017-05-11 17:01:09 +020052 sh("svn export --force https://github.com/salt-formulas/salt-formulas/trunk/deploy/scripts /srv/salt/scripts")
chnyda6c509b82017-05-11 08:41:12 +020053 sh("git config --global user.email || git config --global user.email 'ci@ci.local'")
Tomáš Kukrál500c0182017-05-11 13:46:19 +020054 sh("git config --global user.name || git config --global user.name 'CI'")
chnydac0016dc2017-05-11 11:08:37 +020055 sh("ls -lRa /srv/salt/reclass")
chnydaa9c88702017-05-09 16:51:07 +020056
chnyda6c509b82017-05-11 08:41:12 +020057 // setup iniot and verify salt master and minions
chnyda14e44292017-05-13 19:00:06 +020058 withEnv(["FORMULAS_SOURCE=pkg", "DEBUG=1", "MASTER_HOSTNAME=${master}", "MINION_ID=${master}", "HOSTNAME=cfg01","DOMAIN=mk-ci.local"]){
59 sh("bash -c 'echo $MASTER_HOSTNAME'")
60 sh("bash -c 'source /srv/salt/scripts/salt-master-init.sh; cd /srv/salt/scripts && system_config'")
61 sh("bash -c 'source /srv/salt/scripts/salt-master-init.sh; cd /srv/salt/scripts && saltmaster_bootstrap'")
62 sh("bash -c 'source /srv/salt/scripts/salt-master-init.sh; cd /srv/salt/scripts && saltmaster_init'")
chnyda6c509b82017-05-11 08:41:12 +020063 }
chnydaa9c88702017-05-09 16:51:07 +020064
chnyda14e44292017-05-13 19:00:06 +020065 def nodes
66 if (DEFAULT_GIT_URL.contains("mk-ci")) {
67 nodes = sh script: "find /srv/salt/reclass/nodes -name '*.yml' | grep -v 'cfg*.yml'", returnStdout: true
68 } else {
69 nodes = sh script:"find /srv/salt/reclass/nodes/_generated -name '*.yml' | grep -v 'cfg*.yml'", returnStdout: true
70 }
71 for (minion in nodes.tokenize()) {
72 def basename = sh script: "basename ${minion} .yml", returnStdout: true
73 testMinion(basename.trim())
74 }
75
chnydaa9c88702017-05-09 16:51:07 +020076 }
chnydaa9c88702017-05-09 16:51:07 +020077
78 }
79
chnyda14e44292017-05-13 19:00:06 +020080 return 0
chnydaa9c88702017-05-09 16:51:07 +020081}
82
chnydafa4b0ec2017-05-05 15:49:27 +020083node("python&&docker") {
Jakub Josefc5a223a2017-03-01 14:40:08 +010084 try{
85 stage("checkout") {
Filip Pytloun19376a82017-03-07 12:29:00 +010086 if (gerritRef) {
Jakub Josef83379312017-03-29 18:12:34 +020087 // job is triggered by Gerrit
Jakub Joseffcb615e2017-04-10 14:34:40 +020088 // test if change aren't already merged
89 def gerritChange = gerrit.getGerritChange(GERRIT_NAME, GERRIT_HOST, GERRIT_CHANGE_NUMBER, CREDENTIALS_ID)
90 merged = gerritChange.status == "MERGED"
91 if(!merged){
92 checkouted = gerrit.gerritPatchsetCheckout ([
93 credentialsId : CREDENTIALS_ID
94 ])
chnydaa9c88702017-05-09 16:51:07 +020095 } else{
96 common.successMsg("Change ${GERRIT_CHANGE_NUMBER} is already merged, no need to gate them")
Jakub Joseffcb615e2017-04-10 14:34:40 +020097 }
Jakub Josef83379312017-03-29 18:12:34 +020098 } else if(defaultGitRef && defaultGitUrl) {
Jakub Josefe1407ac2017-03-30 14:10:19 +020099 checkouted = gerrit.gerritPatchsetCheckout(defaultGitUrl, defaultGitRef, "HEAD", CREDENTIALS_ID)
Filip Pytloun19376a82017-03-07 12:29:00 +0100100 }
Jakub Josef83379312017-03-29 18:12:34 +0200101 if(checkouted){
102 if (fileExists('classes/system')) {
103 ssh.prepareSshAgentKey(CREDENTIALS_ID)
Filip Pytloun19376a82017-03-07 12:29:00 +0100104 dir('classes/system') {
Jakub Josef83379312017-03-29 18:12:34 +0200105 remoteUrl = git.getGitRemote()
106 ssh.ensureKnownHosts(remoteUrl)
Filip Pytloun19376a82017-03-07 12:29:00 +0100107 }
Jakub Josef83379312017-03-29 18:12:34 +0200108 ssh.agentSh("git submodule init; git submodule sync; git submodule update --recursive")
Filip Pytloun19376a82017-03-07 12:29:00 +0100109 }
Jakub Joseffcb615e2017-04-10 14:34:40 +0200110 }else if(!merged){
Jakub Josef5ce6a362017-03-31 13:41:17 +0200111 throw new Exception("Cannot checkout gerrit patchset, GERRIT_REFSPEC and DEFAULT_GIT_REF is null")
Filip Pytloun38005aa2017-03-06 10:26:38 +0100112 }
Jakub Josefc5a223a2017-03-01 14:40:08 +0100113 }
chnydaa9c88702017-05-09 16:51:07 +0200114
115 def nodes
116 dir ('nodes') {
Tomáš Kukrál500c0182017-05-11 13:46:19 +0200117 nodes = sh script: "find ./ -type f -name 'cfg*.yml'", returnStdout: true
chnydaa9c88702017-05-09 16:51:07 +0200118 }
119
chnyda14e44292017-05-13 19:00:06 +0200120 stage("test-nodes") {
121 def buildSteps = [:]
chnyda51b03142017-05-10 17:15:27 +0200122 for (masterNode in nodes.tokenize()) {
chnyda14e44292017-05-13 19:00:06 +0200123 def basename = sh script: "basename ${masterNode} .yml", returnStdout: true
124 buildSteps[basename.trim()] = { setupandtest(basename.trim()) }
Jakub Josefc5a223a2017-03-01 14:40:08 +0100125 }
chnyda14e44292017-05-13 19:00:06 +0200126 parallel buildSteps
chnyda51b03142017-05-10 17:15:27 +0200127 }
chnyda14e44292017-05-13 19:00:06 +0200128
Jakub Josefc5a223a2017-03-01 14:40:08 +0100129 } catch (Throwable e) {
130 // If there was an error or exception thrown, the build failed
131 currentBuild.result = "FAILURE"
132 throw e
133 } finally {
134 common.sendNotification(currentBuild.result,"",["slack"])
135 }
Tomáš Kukrál500c0182017-05-11 13:46:19 +0200136}