使用 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
请注意,您还应该限制传播服务器故障的尝试次数,而不是永远等待。
我遇到了一个我无法弄清楚的问题。我想要实现的是有一个 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
请注意,您还应该限制传播服务器故障的尝试次数,而不是永远等待。