gpt4 book ai didi

java - 使用gradle获取sh的输出

转载 作者:行者123 更新时间:2023-12-03 03:12:52 25 4
gpt4 key购买 nike

我面临一个我无法解决的问题。我要实现的任务是创建一个gradle任务,该任务会生成一个mssql服务器的docker-compose进程,然后使用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命令,并且如果成功完成与数据库的连接,则该任务可以继续吗?

最佳答案

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

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

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

关于java - 使用gradle获取sh的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44791685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com