LoginSignup
34
31

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-09-08

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のリンクに階層構造を反映
  • 何らかのポリシーに基づくソート
34
31
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
31