Codaybook

サーバサイドエンジニアが必死に作成した!発見した!を綴るブログ



Jenkinsから対話式のシェルを実行

Jenkinsからあるサーバに置いてあるシェルスクリプトを実行しなくてはいけないことになりました。 実行するだけならジョブのシェル実行にssh $HOSTNAME $SHELL_PATHを記述すれば良いですが、 実行しなくてはいけないシェルは対話式になっていました(◞‸◟)
ということで、対話式のシェルを実行するためのシェルを作成してJenkinsからでも実行できるようにしました。

#!/bin/bash

SHELL_PATH="/usr/local/bin/deploy.sh"
TARGET_ENV="develop"
TARGET_BRANCH="master"

expect -c "
set timeout -1
spawn  $SHELL_PATH
expect -re \"Select Environment?.*\"
send   \"${TARGET_ENV}\n\"
expect -re \"Select Branch?.*\"
send   \"${TARGET_BRANCH}\n\"
expect eof
exit
"

対話式に対応させるためにexpectコマンドを使用して実現させました。細かく説明しますと、
expect -c "[コマンド群]"スクリプトを実行する前に、実行するコマンドを指示する。コマンドはシェルに壊されないようにクオートで囲むべきとされている。
set timeout -1タイムアウトにする時間を設定できる。無制限にしたい場合は-1を設定する
spawn [実行コマンド]:ここで実行するシェルを指定する。
expect -re "[対話の対象となる文字文字列]":対話の対象になる文字列を指定する。
send "[対象の応答]":対話に対する応答の文字列を指定する。
expect eof,exit:cronやjenkinsから実行する場合はexpect eofexitとする必要がある。

このシェルを使用すると対話式のシェルでもJenkinsから実行できるようになります。うむ、超絶便利!