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 eof
とexit
とする必要がある。
このシェルを使用すると対話式のシェルでもJenkins
から実行できるようになります。うむ、超絶便利!