Jenkinsとgithub連携時のパスワード問題

2013/12/5 10166hit

この記事は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叩いたらパス丸見えじゃん」ていう炎上ワードは禁句です。

前:RSSりーだ 次:AndroidでJavaFX

関連キーワード

[IT]

コメントを投稿する

名前URI
コメント