RedmineのリポジトリにStashのリポジトリを表示させる

StashとRedmineを連携させる

Redmineサーバ

  • まずミラーリポジトリを作成する。
    • 何故かRedmineが入っているCentOS 6からsshでつながらなかったのでhttpでやってます。
$ cd /var/git/test
$ git clone --mirror http://userid:passwd@git.example.com/scm/test/test.git

f:id:gozuk16:20140805005954p:plain

  • しばらくするとリポジトリが見えるようになります。
  • あとは下のようなのをcronで10分毎とか回しておけばとりあえず連携できるようになるんですけど、なんかいまいちですよね。
$ cd /var/git/test/test.git
$ git fetch --all

StashのHookでfetchするようにする

  • External Post Receive Hookプラグインを使います。
  • サンプルで提示されているtest-params.shは以下のようになっています。
#!/bin/bash

(
        echo "Script name: $0"
        echo "Positional arguments: ${@}"
        echo "STASH_USER_NAME: $STASH_USER_NAME"
        echo "STASH_USER_EMAIL: $STASH_USER_EMAIL"
        echo "STASH_PROJECT_NAME: $STASH_PROJECT_NAME"
        echo "STASH_REPO_NAME: $STASH_REPO_NAME"
        echo "STASH_IS_ADMIN: $STASH_IS_ADMIN"
        echo `env`
        echo `pwd`
        while read from_ref to_ref ref_name; do
                echo "Ref update:"
                echo " Old value: $from_ref"
                echo " New value: $to_ref"
                echo " Ref name:  $ref_name"
                echo " Diff:"
                git show $to_ref | sed 's/^/  /'
        done
) | tee -a /tmp/test-params.log
  • サンプルから取れる情報を見ながらRedmine用にリポジトリがなければmirrorを作り、あればfetchするスクリプトを書きます。
    • Redmineサーバでリポジトリを作るディレクトリは、プロジェクト/リポジトリの階層にします。
    • リポジトリは特定できますが、プロジェクトがわからないので引数で渡すことにしました。
    • git cloneするときにパスワード無しのsshの公開鍵を登録しておいてやるのがスマートだとは思いますが、何故か上手く行かず・・・。
      • サンプルはテスト用の公開リポジトリなんでいいけど、実際はちゃんとsshで出来るようにしないといけないなー。
#!/bin/bash

(
PROJECT=$1
REPO_NAME="$STASH_REPO_NAME.git"
REPO_DIR="/var/git/$PROJECT/$STASH_REPO_NAME.git"

ssh -i /home/stash/.ssh/git_key -l ci -t -t redmine.example.com <<EOF
if [ ! -d /var/git/$PROJECT ] ; then
mkdir /var/git/$PROJECT
cd /var/git/$PROJECT
git clone --mirror http://git.example.com/scm/$PROJECT/$REPO_NAME
fi
cd $REPO_DIR
git fetch --all
exit
EOF
) | tee /tmp/git-mirror.log
  • sshしてから実行するスクリプトにインデントがあると上手く動かないので、見づらいですがインデントなしにします。
  • stashのリポジトリ設定からフックを設定します。
    • リポジトリ選択→設定→フック→External Post Receive Hook
      • Executable: /home/stash/bin/git-mirror.sh
    • Positional parameters: test

f:id:gozuk16:20140805010819p:plain

これでpushするたびにRedmineのGitリポジトリが更新されるようになりました。

コメントにrefs #nnnとかけばチケットにリンクも出来ます。リンクされるのはRedmineサーバのローカルリポジトリなのでちょっと残念です。Stashのリポジトリを見るほうが見やすくていいんですけどね。