让詹金斯管道等到服务器启动

Make Jenkins pipeline wait until server is up

我目前正开始将我们的构建转换为 Jenkins 构建管道。在某个时刻,我们有必要等待 docker 容器中的 Web 应用程序启动。

我的想法是使用这样的东西:

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

不幸的是,这会导致管道构建失败:

ERROR: script returned exit code 4

有什么简单的方法可以做到这一点吗?

编辑:

我设法使用以下代码使其工作,但该阶段仍标记为失败(尽管构建继续并最终标记为绿色)。

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

您可以使用 wget 选项来实现:

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

120 次尝试,加上重试之间等待 1 秒,即使连接被拒绝也会重试,这可能会稍微多一些秒。所以为了确保它只有 120s,那么你可以使用 timeout from shell:

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

他们刚刚发布了 Pipeline Nodes and Processes Plugin which adds support for returning the exit status 的新版本。 现在这似乎可以完成工作:

timeout(5) {
    waitUntil {
       script {
         def r = sh script: 'wget -q http://remoterhoste/welcome.jsf -O /dev/null', returnStdout: true
         return (r == 0);
       }
    }
}

如果您在 jenkins 节点上没有 wget(例如默认 docker 图像),您也可以像这样安装和使用 HTTPRequest Plugin

timeout(5) {
    waitUntil {
        script {
            try {
                def response = httpRequest 'http://server:8080/app/welcome.jsf'
                return (response.status == 200)
            }
            catch (exception) {
                 return false
            }
        }
    }
}