2016年9月5日月曜日

git master ブランチの更新を svn trunk にコミットする CI 環境構築

先日 Jenkins で svn から git に commit / push するジョブの紹介をしました。
今回はその逆 git から svn に commit できるようにしましたので、そちらを紹介したいと思います。

環境
  • Git repo (github)
  • SVN repo (OSDN)
  • 適当な CI サービス(今回は Codeship を使用)
  • アクセス用公開鍵(Codeship 発行)

手順
  1. git/svn ともに公開鍵を登録しておく
  2. svn からチェックアウト
    svn co svn+ssh://path/to/trunk svn
  3. git からもクローンする(別フォルダ)
    git clone git@github.com:srz-zumix/iutest.git git-svn
    
  4. .svn フォルダを git のフォルダにコピー、 .git フォルダを削除し、svn 作業ディレクトリにする
    cp -r svn/.svn git-svn
    rm -rf git-svn/.git
  5. cd git-svn
  6. 削除されたファイルを svn delete する
    if `svn st | grep -q '^!'` ; then svn st | grep '^!' | awk '{print $2}' | xargs svn delete; fi
  7. 追加されたファイルを svn add する
    svn add * --force
  8. svn の HEAD からログを取得し、対応する git commit id を取得する
    これは svn のコミットメッセージを構築するときに使用します。
    export PREVCOMMIT=
    if `svn log . -l 1 | grep -q 'git@[0-9a-zA-Z]*'` ; then export PREVCOMMIT=`svn log . -l 1 | grep 'git@[0-9a-zA-Z]*' | head -1 | sed -e 's/.*git@\([0-9a-zA-Z]*\).*/\1/g'`; fi
    e 's/.*git@\([0-9a-zA-Z]*\).*/\1/g'`; fi
    echo $PREVCOMMIT
  9. git の HEAD ($CI_COMMIT_ID) からログを取得し、svn のコミットメッセージ用にファイル出力する
    git log $CI_COMMIT_ID -n 1 --pretty="%B%ngit@%H%nhttps://github.com/srz-zumix/iutest/commit/%H" > ../svn.msg
  10. PREVCOMMIT があれば、そのコミットから HEAD までのログもコミットメッセージに追加する
    if [ -n "$PREVCOMMIT" ]; then git --no-pager log $PREVCOMMIT..$CI_COMMIT_ID^ --pretty="---------------%n%B%ngit@%H%n" >> ../svn.msg; fi
  11. svn commit する
    svn commit --file ../svn.msg

実際に動作しているところを見てもらいたいところですが、Codeship は private で見れないので割愛させて頂きます。



さて、これで github に push すると自動で svn も更新できる環境ができました。
現在 iutest v1.6.0 リリースに向けて開発中ですが、こちらの開発から git での開発に移行をしました。
バグとか typo とかあると思うので、是非是非プルリクして頂ければと思います。

では。


0 件のコメント:

コメントを投稿