blob: 574734c750c9bcffaa3bdf9e800f2f824263120f [file] [log] [blame]
Ilya Kharind2043ca2017-03-29 16:50:26 +04001/**
2* JS testing pipeline
3* CREDENTIALS_ID - gerrit credentials id
Mikhail Ivanovcd0a6f42017-05-17 12:55:42 +04004* COMPOSE_PATH - path to compose file in repository
Ilya Kharind2043ca2017-03-29 16:50:26 +04005* NODE_IMAGE - NodeJS with NPM Docker image name
6* COMMANDS - a list of command(s) to run
7**/
8
9gerrit = new com.mirantis.mk.Gerrit()
10common = new com.mirantis.mk.Common()
11
Mikhail Ivanovcd50cce2017-06-02 17:57:26 +040012def executeCmd(containerName, cmd) {
Ilya Kharin0921c662017-03-30 23:08:18 +040013 stage(cmd) {
Mikhail Ivanovcd50cce2017-06-02 17:57:26 +040014 assert containerName != null
Ilya Kharin0921c662017-03-30 23:08:18 +040015 common.infoMsg("Starting command: ${cmd}")
Ilya Kharin817d6d62017-06-20 19:43:54 +040016 wrap([$class: 'AnsiColorBuildWrapper']) {
17 sh("docker exec ${containerName} ${cmd}")
18 }
Ilya Kharin0921c662017-03-30 23:08:18 +040019 common.successMsg("Successfully completed: ${cmd}")
20 }
21}
22
Mikhail Ivanov854f21f2017-04-14 17:06:31 +040023def gerritRef
24try {
25 gerritRef = GERRIT_REFSPEC
26} catch (MissingPropertyException e) {
27 gerritRef = null
28}
29
30def defaultGitRef, defaultGitUrl
31try {
32 defaultGitRef = DEFAULT_GIT_REF
33 defaultGitUrl = DEFAULT_GIT_URL
34} catch (MissingPropertyException e) {
35 defaultGitRef = null
36 defaultGitUrl = null
37}
38def checkouted = false
39
Mikhail Ivanov98411922017-06-01 16:27:10 +040040node("vm") {
Mikhail Ivanovcd50cce2017-06-02 17:57:26 +040041 def containerName
Mikhail Ivanovcd0a6f42017-05-17 12:55:42 +040042 def uniqId
Ilya Kharind2043ca2017-03-29 16:50:26 +040043 try {
Ilya Kharin0921c662017-03-30 23:08:18 +040044 stage('Checkout source code') {
Mikhail Ivanov854f21f2017-04-14 17:06:31 +040045 if (gerritRef) {
46 // job is triggered by Gerrit
Jakub Joseff59e0bb2017-04-17 11:35:50 +020047 checkouted = gerrit.gerritPatchsetCheckout ([
Mikhail Ivanov854f21f2017-04-14 17:06:31 +040048 credentialsId : CREDENTIALS_ID,
49 withWipeOut : true,
50 ])
51 } else if(defaultGitRef && defaultGitUrl) {
52 checkouted = gerrit.gerritPatchsetCheckout(defaultGitUrl, defaultGitRef, "HEAD", CREDENTIALS_ID)
53 }
54 if(!checkouted){
55 throw new Exception("Cannot checkout gerrit patchset, GERRIT_REFSPEC and DEFAULT_GIT_REF is null")
56 }
Ilya Kharind2043ca2017-03-29 16:50:26 +040057 }
Mikhail Ivanovcd0a6f42017-05-17 12:55:42 +040058 stage('Generate config file for devops portal') {
Mikhail Ivanovcd0a6f42017-05-17 12:55:42 +040059 writeFile (
60 file: "${workspace}/test_config.json",
Mikhail Ivanovcd50cce2017-06-02 17:57:26 +040061 text: "${JSON_CONFIG}"
Mikhail Ivanovcd0a6f42017-05-17 12:55:42 +040062 )
63 }
64 stage('Start container') {
Ilya Kharin0921c662017-03-30 23:08:18 +040065 def workspace = common.getWorkspace()
Mikhail Ivanovcd0a6f42017-05-17 12:55:42 +040066 def timeStamp = new Date().format("HHmmss", TimeZone.getTimeZone('UTC'))
67 if (gerritRef) {
68 uniqId = gerritRef.tokenize('/').takeRight(2).join('') + timeStamp
69 } else {
70 uniqId = defaultGitRef.tokenize('/').takeRight(2).join('') + timeStamp
71 }
72 sh("docker-compose -f ${COMPOSE_PATH} -p ${uniqId} up -d")
Mikhail Ivanovcd50cce2017-06-02 17:57:26 +040073 containerName = "${uniqId}_devopsportal_1"
74 common.successMsg("Container with id ${containerName} started.")
75 sh("docker cp ${workspace}/. ${containerName}:/opt/workspace/")
Ilya Kharind2043ca2017-03-29 16:50:26 +040076 }
Mikhail Ivanovcd50cce2017-06-02 17:57:26 +040077 executeCmd(containerName, "npm install")
Ilya Kharin0921c662017-03-30 23:08:18 +040078 def cmds = COMMANDS.tokenize('\n')
79 for (int i = 0; i < cmds.size(); i++) {
Ilya Kharinea0b6532017-06-05 12:41:10 +040080 timeout(5) {
81 executeCmd(containerName, cmds[i])
82 }
Ilya Kharind2043ca2017-03-29 16:50:26 +040083 }
Ilya Kharin0921c662017-03-30 23:08:18 +040084 } catch (err) {
Ilya Kharind2043ca2017-03-29 16:50:26 +040085 currentBuild.result = 'FAILURE'
Ilya Kharin0921c662017-03-30 23:08:18 +040086 common.errorMsg("Build failed due to error: ${err}")
87 throw err
Ilya Kharind2043ca2017-03-29 16:50:26 +040088 } finally {
89 common.sendNotification(currentBuild.result, "" ,["slack"])
Ilya Kharin54987d92017-06-20 18:55:30 +040090 stage('Attach artifacts') {
91 if (containerName != null) {
92 sh("docker cp ${containerName}:/opt/workspace/test_output ${workspace}/test_output")
93 archiveArtifacts(
94 artifacts: "${workspace}/test_output/screenshots/*.png",
95 )
96 }
97 }
Ilya Kharin0921c662017-03-30 23:08:18 +040098 stage('Cleanup') {
Mikhail Ivanovcd50cce2017-06-02 17:57:26 +040099 if (containerName != null) {
Mikhail Ivanov02d9c202017-05-17 17:12:50 +0400100 dockerCleanupCommands = ['stop', 'rm -f']
Mikhail Ivanovcd0a6f42017-05-17 12:55:42 +0400101 for (int i = 0; i < dockerCleanupCommands.size(); i++) {
102 sh("docker-compose -f ${COMPOSE_PATH} -p ${uniqId} ${dockerCleanupCommands[i]} || true")
103 }
104 sh("docker network rm ${uniqId}_default || true")
105 sh("rm -f ${workspace}/test_config.json || true")
Mikhail Ivanovcd50cce2017-06-02 17:57:26 +0400106 common.infoMsg("Container with id ${containerName} was removed.")
Ilya Kharind2043ca2017-03-29 16:50:26 +0400107 }
108 }
109 }
110}