使用 gradle 获取 sh 的输出

Get output of sh using gradle

我遇到了一个我无法弄清楚的问题。我想要实现的是有一个 gradle 任务产生一个 docker-compose 进程,它是一个 mssql 服务器,然后使用 liquibase 运行-up 所有迁移并为数据库播种.

但问题是 docker 需要一些时间才能启动服务器,而 liquibase 在启动之前 运行ning。

我所做的是使用 -d 标志启动 docker-compose 在守护进程中,然后使用循环 ping 服务器直到端口 1433 响应,然后让 gradle 继续与其他相关任务(实际创建数据库并为其播种)。

这是我所做的:

task checkDbStatusAndGetsItUp(){
    group "localEnvironment"
    description "Check current local db is up or sets it up"
    dependsOn 'cloneEntityProject'

    println 'Checking db Status and setting it up'
    println '---------------------------'

    def stdoutDocker = new ByteArrayOutputStream()
    exec{
        executable 'sh'
        args "-c", """
        docker ps | grep microsoft | wc -c
        """
        standardOutput = stdoutDocker
    }

    doLast {
        if (stdoutDocker.toString().trim() == '0') {
            exec {
                executable 'sh'
                workingDir 'setup/dp-entidades'
                args "-c", """
                    docker-compose up -d
                """
            }
        }

        def shouldStop = false;

        while (shouldStop == false){

            def stdoutPing = new ByteArrayOutputStream()
            exec{
                workingDir 'setup/dp-entidades'

                executable 'sh'
                args """
                    nc -zv localhost 1433
                """
                ignoreExitValue = true
                standardOutput = stdoutPing
            }

            println stdoutPing.toString();
            sleep(1000)
        }
    }
}

我从上面的代码中得到的是一个循环,显示 docker 永远不会启动它。但是,如果我打开另一个终端并手动 ping 它,它就会工作,并且数据库实际上已启动。 (我什至尝试使用telnet,结果相同)

我需要做什么,从 gradle 获得 ping,如果连接到数据库成功,让任务继续?

-c sh 的标志在最后一个 exec 块中丢失。另一个问题是您从未将 shouldStop 设置为 true,因此最后一个循环永远不会终止。你可以例如检查 exec:

的退出状态
def result = exec { ... }
shouldStop = result.exitValue == 0

请注意,您还应该限制传播服务器故障的尝试次数,而不是永远等待。