2017-06-27 46 views
2

我面臨一個我無法弄清楚的問題。我想實現的是有一個gradle任務,它產生一個作爲mssql服務器的docker-compose進程,然後使用liquibase啓動所有遷移併爲數據庫創建種子。使用gradle獲得sh的輸出

但問題是碼頭需要一些時間才能啓動服務器,並且liquibase在啓動之前運行。

我做了什麼,開始使用-d標誌在後臺泊塢窗,撰寫,然後用一個循環來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) 
     } 
    } 
} 

我從上面的代碼得到的是表明該泊塢窗從來沒有得到它的循環。但是,如果我打開另一個終端並手動進行ping操作,它就會起作用,並且數據庫實際上已啓動(我甚至試圖使用telnet,具有相同的結果)

我需要做什麼,實現從gradle ping,如果成功conecting數據庫讓任務繼續?

+0

結果我從上面的代碼中得到的是: SH:0:無法打開NC -zv本地主機1433 SH:0:無法打開NC -zv本地主機1433 SH:0:無法打開NC -zv localhost 1433 sh:0:無法打開nc -zv localhost 1433 sh:0:無法打開nc -zv localhost 1433 –

回答

2

-csh的標誌在最後exec塊中丟失。另一個問題是,你從來沒有設置shouldStop爲真,所以最後一個循環將永遠不會終止。你可以例如檢查exec退出狀態:

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

請注意,你也應該限制的嘗試次數傳播服務器出現故障,而不是永遠等待。

+0

我知道它永不止息,它只是一個測試,以檢查是否我得到一個連接。我會嘗試使用-c標誌並查看我得到的結果 –

+0

在sh上使用「-c」標誌執行操作!謝謝 ! –