2012-05-29 121 views
11

我正在做geb的功能測試。在gradle中執行bash腳本

我的應用程序使用處女座進行部署,並使用HSQLDB來存儲數據。我想對這個工作版本的應用程序進行測試,但我想從空數據庫開始,每次運行webtest時。

我寫了一個簡單的bash腳本

#!/bin/sh 
rm -rf $VIRGO_HOME/aresdb* 
$VIRGO_HOME/bin/shutdown.sh & 
sleep 10 
$VIRGO_HOME/bin/startup.sh & 

其刪除數據庫,並重新啓動處女座。

但是,當我將它添加到我的build.gradle任務執行命令永遠不會結束。

task cleanDB(type: Exec) { 
    commandLine './clean.sh' 
} 

這是爲什麼?當我在控制檯中運行這個腳本時,它會很快返回(但處女座仍然寫入控制檯)。

我試圖在單獨的線程中運行它,但我遇到了以下錯誤:

task cleanDBThread()<<{ 
    def cleanDBThread1 = Thread.start { 
     cleanDB.execute() 
    } 
    sleep 10000 
    println "wake up!" 
} 

Exception in thread "Thread-32" java.lang.IllegalStateException: 
Cannot start long running operation, as the task artifact state cache 
(/home/tomasz/ares/.gradle/1.0-milestone-9/taskArtifacts) has not been locked. 

我也試着設置「創建降」在Hibernate的配置,但也需要重啓處女座。即使重新部署應用程序也無濟於事。

我應該怎麼做才能運行具有空數據庫的webtest?

+1

如果從命令末尾刪除&符號會發生什麼?我看不到您需要在後臺執行您的命令。這是否解決這個問題? – Jared

回答

11

這是奇怪的

我創建了一個任務

task callCL(type: Exec) { 
    commandLine './cl.sh' 
} 

調用cl.sh文件

#!/bin/sh 
echo "starting " 
./acl.sh & 
sleep 10 
./acl.sh & 

調用acl.sh

#!/bin/sh 
echo "I am not doing anything" 

和它的工作!但有一點,當你添加./acl.sh&符&你從一個不同的線程調用任務來啓動gradle,有點看起來像掛了。我會刪除從您的通話將&關閉並開始喜歡這個

#!/bin/sh 
rm -rf $VIRGO_HOME/aresdb* 
$VIRGO_HOME/bin/shutdown.sh 
$VIRGO_HOME/bin/startup.sh 

反正你要在同一個線程等待從關機狀態啓動,並且不需要調用睡覺呢!