この記事はhttp://qiita.com/advent-calendar/2013/jenkinsciの5日目の記事です。
前回は@akiko_pusuさんのhttp://qiita.com/akiko-pusu/items/8b084107132572e5c73eでした。
今回はタイトルの通りJenkinsとgithub連携時のパスワード問題です。
Jenkinsとgithubを絡めて運用している時に、困るのが鍵のパスワードでした。
https://username:password@github.com/user/test-repo.git
こんな感じになっちゃいますよね。。
見えるのがいやだったのでビルドトリガをスケジュールにしてしまって、ローカルのリポジトリに対してJenkinsの処理を走らせるように変更しました。
ローカルのリポジトリの更新はcronで回してます。
ssh鍵をパス無しで運用するのがあれだったので、対話式shellで無理やり解決してみました。
そうです。
よく考えたらJenkins一切関係ありません。shellの話ですね。。
え?フック??
Repository Settings権限もってない場合もあるんですよ。。
「Orgで運用していて権限ないけど、ソースがcommitされたら最新のapkをTestFlightに上げたい」とか、
「redmineのgithub連携用に定期的にfetchしたい」
みたいなシーンでは役に立つと思います。
gitfetchexpectコマンド
#!/usr/bin/env bash
# Analize argument
while getopts s:p:h: OPT
do
case $OPT in
"p" ) PASSWORD="$OPTARG" ;;
"s" ) SOURCEDEST="$OPTARG" ;;
* ) exit 1 ;;
esac
done
# Check argument
if [ ! ${PASSWORD} ]; then
echo "password not found."
exit 1
fi
if [ ! ${SOURCEDEST} ]; then
echo "password not found."
exit 1
fi
cd $SOURCEDEST
echo "Updating Source..."
expect <<- DONE
set timeout 240
spawn git fetch origin -v
# stdout buffer
match_max 100000
# Look for passwod prompt
expect "Enter passphrase for key *: "
# Send password aka $PASSWORD
send -- "$PASSWORD\r"
# send blank line (\r) to make sure we get back to gui
send -- "\r"
expect eof
DONE
echo $(git reset --hard origin/master)
echo $(git log -1 --oneline)
ぱっと説明です。
- cd $SOURCEDESTの行までは、stdinからパラメータを受け取ってるだけです。
- expectコマンドの部分から対話開始です。
- spawn git fetch origin -v
コマンドを実行してstdoutを出力します。
- match_max 100000
bufferをこれだけ確保しました。これ以上出てしまうと失敗します。
- expect "Enter passphrase for key *: "
バッファから文字列を引っかけます。
sshコマンド叩いたときのパスフレーズ入れるEnter passphrase for /home/test/.ssh/id_rsa:の文字列ですね
実行環境によって違うと思うので、自分の環境でコマンド結果をキャプチャする必要があります。
- send -- "$PASSWORD\r"
引っかかったら、パラメータで受け取ったパスワードを送信します。
- send -- "\r"
expect eof
GUIに戻り、EOFが出るまで待ちます。
- echo $(git reset --hard origin/master)
echo $(git log -1 --oneline)
fetchが出来てるので、HEADに持ってきます。
ログに出したかったので、実行を変数展開しています。
使い方
こんな感じです。
[ec2-user@ip-0-0-0-0 ~]$ crontab -l
LOG_DIR=/usr/test/log/crontab
*/15 * * * * /home/test/bin/gitfetchexpect -p ssh_password -s /opt/test/jenkins/workspace/testrepo >> $LOG_DIR/gitfetchexpect.log
「crontab叩いたらパス丸見えじゃん」ていう炎上ワードは禁句です。