blob: d768ef9a023314ba7bd1a0aca1124101053b0bc4 [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
chnyda51b03142017-05-10 17:15:27 +020032def testMinion(minion, saltOpts)
33{
chnyda17d877c2017-05-11 09:49:45 +020034 sh("""bash -c 'source /srv/salt/scripts/salt-master-init.sh;
chnyda6c509b82017-05-11 08:41:12 +020035 export SUDO=sudo;
36 export DEBUG=1;
chnyda6c509b82017-05-11 08:41:12 +020037 export MASTER_HOSTNAME=${master}; reclass-salt -p ${minion} > /tmp/${minion}.pillar_verify'""")
chnydaa9c88702017-05-09 16:51:07 +020038}
39
chnyda51b03142017-05-10 17:15:27 +020040def setupandtest(master) {
41 def img = docker.image("ubuntu:trusty")
chnydaa9c88702017-05-09 16:51:07 +020042 def saltOpts = "--retcode-passthrough --force-color"
chnyda6c509b82017-05-11 08:41:12 +020043 def common = new com.mirantis.mk.Common()
44 def workspace = common.getWorkspace()
chnydaa9c88702017-05-09 16:51:07 +020045
chnyda6c509b82017-05-11 08:41:12 +020046 img.inside("-u root:root -v ${workspace}:/srv/salt/reclass") {
47 wrap([$class: 'AnsiColorBuildWrapper']) {
48 sh("apt-get update; apt-get install software-properties-common python-software-properties -y")
49 sh("add-apt-repository ppa:saltstack/salt -y")
50 sh("apt-get update; apt-get install -y curl subversion git python-pip sudo")
51 sh("sudo apt-get install -y salt-master salt-minion salt-ssh salt-cloud salt-doc")
52 sh("svn export --force https://github.com/chnyda/salt-formulas/trunk/deploy/scripts /srv/salt/scripts")
53 //configure git
54 sh("git config --global user.email || git config --global user.email 'ci@ci.local'")
55 sh("git config --global user.name || git config --global user.name 'CI'")
56 //
57 sh("cd /srv/salt/reclass; test ! -e .gitmodules || git submodule update --init --recursive")
58 sh("cd /srv/salt/reclass; git commit -am 'Fake branch update' || true")
chnydaa9c88702017-05-09 16:51:07 +020059
chnyda6c509b82017-05-11 08:41:12 +020060 // setup iniot and verify salt master and minions
61 withEnv(["SUDO=sudo","DEBUG=1", "MASTER_HOSTNAME=${master}"]){
chnyda17d877c2017-05-11 09:49:45 +020062 sh("bash -c 'source /srv/salt/scripts/salt-master-init.sh; system_config'")
63 sh("bash -c 'source /srv/salt/scripts/salt-master-init.sh; saltmaster_bootstrap'")
64 sh("bash -c 'source /srv/salt/scripts/salt-master-init.sh; saltmaster_init > /tmp/${master}.init'")
65 sh("bash -c 'source /srv/salt/scripts/salt-master-init.sh; verify_salt_master'")
chnyda6c509b82017-05-11 08:41:12 +020066 }
chnydaa9c88702017-05-09 16:51:07 +020067
chnyda6c509b82017-05-11 08:41:12 +020068 testSteps = [:]
69 nodes = sh script:"ls /srv/salt/reclass/nodes/_generated"
70 for (minion in nodes.tokenize()) {
71 def basename = sh script: "basename ${minion} .yml", returnStdout: true
72 testSteps = { testMinion(basename.trim())}
73 }
74 parallel testSteps
chnydaa9c88702017-05-09 16:51:07 +020075 }
chnydaa9c88702017-05-09 16:51:07 +020076
77 }
78
79}
80
chnydafa4b0ec2017-05-05 15:49:27 +020081node("python&&docker") {
Jakub Josefc5a223a2017-03-01 14:40:08 +010082 try{
83 stage("checkout") {
Filip Pytloun19376a82017-03-07 12:29:00 +010084 if (gerritRef) {
Jakub Josef83379312017-03-29 18:12:34 +020085 // job is triggered by Gerrit
Jakub Joseffcb615e2017-04-10 14:34:40 +020086 // test if change aren't already merged
87 def gerritChange = gerrit.getGerritChange(GERRIT_NAME, GERRIT_HOST, GERRIT_CHANGE_NUMBER, CREDENTIALS_ID)
88 merged = gerritChange.status == "MERGED"
89 if(!merged){
90 checkouted = gerrit.gerritPatchsetCheckout ([
91 credentialsId : CREDENTIALS_ID
92 ])
chnydaa9c88702017-05-09 16:51:07 +020093 } else{
94 common.successMsg("Change ${GERRIT_CHANGE_NUMBER} is already merged, no need to gate them")
Jakub Joseffcb615e2017-04-10 14:34:40 +020095 }
Jakub Josef83379312017-03-29 18:12:34 +020096 } else if(defaultGitRef && defaultGitUrl) {
Jakub Josefe1407ac2017-03-30 14:10:19 +020097 checkouted = gerrit.gerritPatchsetCheckout(defaultGitUrl, defaultGitRef, "HEAD", CREDENTIALS_ID)
Filip Pytloun19376a82017-03-07 12:29:00 +010098 }
Jakub Josef83379312017-03-29 18:12:34 +020099 if(checkouted){
100 if (fileExists('classes/system')) {
101 ssh.prepareSshAgentKey(CREDENTIALS_ID)
Filip Pytloun19376a82017-03-07 12:29:00 +0100102 dir('classes/system') {
Jakub Josef83379312017-03-29 18:12:34 +0200103 remoteUrl = git.getGitRemote()
104 ssh.ensureKnownHosts(remoteUrl)
Filip Pytloun19376a82017-03-07 12:29:00 +0100105 }
Jakub Josef83379312017-03-29 18:12:34 +0200106 ssh.agentSh("git submodule init; git submodule sync; git submodule update --recursive")
Filip Pytloun19376a82017-03-07 12:29:00 +0100107 }
Jakub Joseffcb615e2017-04-10 14:34:40 +0200108 }else if(!merged){
Jakub Josef5ce6a362017-03-31 13:41:17 +0200109 throw new Exception("Cannot checkout gerrit patchset, GERRIT_REFSPEC and DEFAULT_GIT_REF is null")
Filip Pytloun38005aa2017-03-06 10:26:38 +0100110 }
Jakub Josefc5a223a2017-03-01 14:40:08 +0100111 }
chnydaa9c88702017-05-09 16:51:07 +0200112
113 def nodes
114 dir ('nodes') {
chnyda51b03142017-05-10 17:15:27 +0200115 nodes = sh script: "find -type f -name cfg*.yml", returnStdout: true
chnydaa9c88702017-05-09 16:51:07 +0200116 }
117
Jakub Josef62218bb2017-05-09 18:31:00 +0200118 stage("test") {
chnyda51b03142017-05-10 17:15:27 +0200119 for (masterNode in nodes.tokenize()) {
120 basename = sh script: "basename ${masterNode} .yml", returnStdout: true
chnyda6c509b82017-05-11 08:41:12 +0200121 setupandtest(basename.trim())
Jakub Josefc5a223a2017-03-01 14:40:08 +0100122 }
chnydaa9c88702017-05-09 16:51:07 +0200123
chnyda51b03142017-05-10 17:15:27 +0200124 }
Jakub Josefc5a223a2017-03-01 14:40:08 +0100125 } catch (Throwable e) {
126 // If there was an error or exception thrown, the build failed
127 currentBuild.result = "FAILURE"
128 throw e
129 } finally {
130 common.sendNotification(currentBuild.result,"",["slack"])
131 }
chnyda51b03142017-05-10 17:15:27 +0200132}