Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
31
Help us understand the problem. What is going on with this article?
@waddy_u

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のリンクに階層構造を反映
  • 何らかのポリシーに基づくソート
31
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
waddy_u

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
31
Help us understand the problem. What is going on with this article?