BitbucketのHome.mdを自動生成
Bitbucket使っていますか?
個人利用では主にプライベートリポジトリとして有用だと思います。
markdown対応のissue tracketやwikiもあるので、githubとの親和性もなかなかではないでしょうか。
問題点:作成したページ一覧を確認する手段が用意されていない
こんな素敵なBitbucketなのですが、1点問題点があります。
私は作業ログや環境情報のログなどに、リポジトリのwikiを使ってMarkdownでメモをとって記録しているのですが、
このwiki、作成したページ一覧を確認するビューもなければ、それらしき設定もないのです。
つまり、「作成したwikiのページ名を記憶なり記録してURLに打ち込まなければそのベージに飛べない」
というわけです。
そんなわけねーだろ!と思って必死でググったりしていたのですが、2013/09/09現在でも実装されていない模様。以下issueでは「一度作ったページ見る手段がないんだけど」「都度URLコピペするしかないんですか」的なやりとりが展開されています:
https://bitbucket.org/site/master/issue/2659/no-way-to-see-newly-online-created-wiki
解決策:ファイルリストからページリストを持つHome.mdを自動生成する
本題です。要は作ったページへ飛ぶことができれば良いので、それらへのリンクをHome.mdに集めてしまいます。ざっくりとこれからやることを書くと、
- wikiをcloneしてローカルで編集する
- このときプログラムでHome.mdを自動生成する(scala使います)
- git push
wikiをクローン
詳細は飛ばしますが、Bitbucketのwikiのページでclone wikiすればOKです。
Home.md自動生成
以下コードをコピペってMDTree.scalaなどのファイルにペーストします。
このscalaファイルはcloneしたwikiのトップディレクトリにおいてください。
import java.io.{ File, PrintWriter }
def ls_r(path: String): Seq[(String, String)] = {
val file = new File(path)
file.listFiles().flatMap {
case f if f.isDirectory() => ls_r(f.getPath())
case x => List((x.getPath(), x.getName()))
}
}
def linkMarkdown(url: String, name: String) = {
"- [" + name + "]" + "(" + url + " \"" + name + "\")"
}
def execute(documentRoot: String, homePageName: String): Unit = {
val file = new File(homePageName)
if (file.exists) file.delete()
val homePage = new PrintWriter(homePageName)
homePage.println("""
Wiki Indexes
===========================
---
""")
ls_r("./").filter(_._2.endsWith(".md")).foreach { a =>
homePage.println(linkMarkdown((documentRoot.replaceAll("/$", "") + a._1.substring(1).replace("\\", "/")).replace(".md", ""), a._2.replace(".md", "")))
homePage.flush
}
homePage.close
}
execute(args(0), args(1))
gitでcommitする前に、
scala https://bitbucket.org/account_name/repository_name/wiki/ Home.md
とします。これでHome.mdは各ページへのリンクを持つMarkdownファイルとなります。このあとは例のごとくリモートへプッシュしてください。Home.mdは以下のようなイメージになります。
JenkinsでHome.md生成を自動化
もうちょい楽しましょう。上でやったscalaプログラム実行からpushの流れをJenkinsにまかせてしまいます。gitやscalaなど、必要なパッケージをひと通り揃えたら、以下のような設定のジョブを作ります
ポイントは、
- SCMポーリングによってwikiの変更を感知して自動でHome.mdを再生成
- ビルドはすべでシェルで、git pull、scalaプログラムに実行、git pushまでの流れを実行
これで、Home.mdに関しては人間が気にしなくてよくなります。テスト的にSCMポーリング間隔を5分にしてますが、実際はwikiの使用頻度に合わせて調節してください。1日1回とかでもいいと思います。
TODO
- Home.mdのリンクに階層構造を反映
- 何らかのポリシーに基づくソート