Scala
Bitbucket
Jenkins

Bitbucket wikiのページのリンクを集めたHome.mdを自動生成する(+Jenkinsで自動化する)

More than 5 years have passed since last update.


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に集めてしまいます。ざっくりとこれからやることを書くと、

1. wikiをcloneしてローカルで編集する

2. このときプログラムでHome.mdを自動生成する(scala使います)

3. git push


wikiをクローン

詳細は飛ばしますが、Bitbucketのwikiのページでclone wikiすればOKです。


Home.md自動生成

以下コードをコピペってMDTree.scalaなどのファイルにペーストします。

このscalaファイルはcloneしたwikiのトップディレクトリにおいてください。


MDTree.scala

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は以下のようなイメージになります。

mdtree.JPG


JenkinsでHome.md生成を自動化

もうちょい楽しましょう。上でやったscalaプログラム実行からpushの流れをJenkinsにまかせてしまいます。gitやscalaなど、必要なパッケージをひと通り揃えたら、以下のような設定のジョブを作ります

jenkins.JPG

ポイントは、


  • SCMポーリングによってwikiの変更を感知して自動でHome.mdを再生成

  • ビルドはすべでシェルで、git pull、scalaプログラムに実行、git pushまでの流れを実行

これで、Home.mdに関しては人間が気にしなくてよくなります。テスト的にSCMポーリング間隔を5分にしてますが、実際はwikiの使用頻度に合わせて調節してください。1日1回とかでもいいと思います。


TODO


  • Home.mdのリンクに階層構造を反映

  • 何らかのポリシーに基づくソート