Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make Jenkins pipeline wait until server is up

I am currently starting to convert our builds into a Jenkins build pipeline. At a certain point it is necessary for us to wait for the startup of a web application within a docker container.

My idea was to use something like this:

timeout(120) {
    waitUntil {
        sh 'wget -q http://server:8080/app/welcome.jsf -O /dev/null'
    }
}

Unfortunately this makes the pipeline build fail:

ERROR: script returned exit code 4

Is there any simple way to make this work?

Edit:

I managed to make it work using the following code, but the stage is still marked as failed (although the build continues and is marked green in the end).

timeout(120) {
    waitUntil {
        try {
            sh 'wget -q http://server:8080/app/welcome.jsf -O /dev/null'
            return true
        } catch (exception) {
            return false
        }
    }
}
like image 799
Nitek Avatar asked Jun 20 '16 11:06

Nitek


3 Answers

They just released a new version of the Pipeline Nodes and Processes Plugin which adds support for returning the exit status. This seems to do the job now:

timeout(5) {
    waitUntil {
       script {
         def r = sh script: 'wget -q http://remoterhoste/welcome.jsf -O /dev/null', returnStdout: true
         return (r == 0);
       }
    }
}
like image 139
Nitek Avatar answered Oct 13 '22 20:10

Nitek


You can use wget options to achieve that:

waitUntil {
    sh 'wget --retry-connrefused --tries=120 --waitretry=1 -q http://server:8080/app/welcome.jsf -O /dev/null'
}

120 tries, plus wait 1s between retries, retry even in case of connection refused, this might be slightly more seconds. So to make sure it is only 120s, then you can use timeout from shell:

waitUntil {
    sh 'timeout 120 wget --retry-connrefused --tries=120 --waitretry=1 -q http://server:8080/app/welcome.jsf -O /dev/null'
}
like image 6
Krzysztof Krasoń Avatar answered Oct 13 '22 22:10

Krzysztof Krasoń


If you don't have wget on the jenkins node (e.g. the default docker image) you can also install and use the HTTPRequest Plugin like this.

timeout(5) {
    waitUntil {
        script {
            try {
                def response = httpRequest 'http://server:8080/app/welcome.jsf'
                return (response.status == 200)
            }
            catch (exception) {
                 return false
            }
        }
    }
}
like image 1
zaphod Avatar answered Oct 13 '22 22:10

zaphod