前回は、再起動したいスレーブでジョブを実行してマシンを再起動させていました。
今回は、再起動したいスレーブとは別のスレーブでジョブを実行し、
ターゲットスレーブのビルドが終わるのを待ってから、再起動させるようにしました。
import hudson.slaves.OfflineCause.SimpleOfflineCause
import hudson.util.RemotingDiagnostics
def jenkins = hudson.model.Hudson.instance
class OfflineMessage extends org.jvnet.localizer.Localizable {
def message
OfflineMessage() {
super(null, null, [])
def timestr = new Date().format("HH:mm dd/MM/yy z", TimeZone.getTimeZone("UTC"))
this.message = "automated reboot at end of test at " + timestr
}
String toString() {
this.message
}
String toString(java.util.Locale l) {
toString()
}
}
def cause = SimpleOfflineCause.create(new OfflineMessage())
def target_name = manager.build.buildVariables.get("REBOOT_SLAVE")
if ( target_name == null ) {
manager.listener.logger.println("ERROR!! REBOOT_SLAVE is null.")
}
// 同一 PC 上のスレーブをオフライン
def slaves = jenkins.slaves
slaves.each {
def com = it.toComputer()
def name = com.getEnvironment().get("COMPUTERNAME","")
if( name.compareToIgnoreCase(target_name) == 0 ) {
if( com.isOnline() ) {
// スレーブをオフラインにしてアイドル待ち
com.setTemporarilyOffline(true, SimpleOfflineCause.create(new OfflineMessage()))
// 実際にアイドル待ちするのは、全部オフラインにしてから
}
}
}
slaves.each {
def com = it.toComputer()
def name = com.getEnvironment().get("COMPUTERNAME","")
def node_name = it.getNodeName()
if( name.compareToIgnoreCase(target_name) == 0 ) {
if( !com.isIdle() ) {
manager.listener.logger.println("Wait ${node_name} Slave Task...")
while( !com.isIdle() ) {
Thread.sleep(3000)
}
}
}
}
// reboot
def script = """
if (Functions.isWindows()) {
'cmd /c "shutdown /f /r /t 10 -m \\\\\\\\${target_name} /c \"Restarting after Jenkins test completed\""'.execute()
}
"""
def computer = manager.build.getBuiltOn().toComputer()
def channel = computer.getChannel()
manager.listener.logger.println(script)
RemotingDiagnostics.executeGroovy( script, channel )
// 再起動待ち
Thread.sleep(5*60*1000)
// 再接続
slaves.each {
def com = it.toComputer()
def name = com.getEnvironment().get("COMPUTERNAME","")
if( name.compareToIgnoreCase(target_name) == 0 ) {
com.setTemporarilyOffline(false, com.getOfflineCause())
}
}
こちらのコードは github にもアップしています。
0 件のコメント:
コメントを投稿