【问题标题】:Get output of sh using gradle使用 gradle 获取 sh 的输出
【发布时间】:2017-06-27 23:53:04
【问题描述】:

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

但问题是docker需要一些时间来启动服务器,而liquibase在它启动之前就已经运行了。

我所做的是使用 -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,如果成功连接到数据库,让任务继续?

【问题讨论】:

  • 我从上面的代码得到的结果是: sh: 0: Can't open nc -zv localhost 1433 sh: 0: Can't open nc -zv localhost 1433 sh: 0: Can't打开 nc -zv localhost 1433 sh: 0: 无法打开 nc -zv localhost 1433 sh: 0: 无法打开 nc -zv localhost 1433

标签: java gradle docker-compose gradlew


【解决方案1】:

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

def result = exec { ... }
shouldStop = result.exitValue == 0

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

【讨论】:

  • 我知道它永远不会停止,它只是一个测试我是否得到了连接。我会尝试使用 -c 标志,看看我得到了什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多