読者です 読者をやめる 読者になる 読者になる

内製ライブラリのリビジョン情報を整形して Wiki に投稿するスクリプトを書いてみた

python

内製ライブラリのビルド担当者になっているので、ビルド依頼が来るたびに

  • Jenkins のリリースビルド用ジョブを実行
  • Wiki に書いているライブラリのリビジョン情報を更新

という作業を行っている。ビルド自体は Rake と Jenkins で自動化したけど、Wiki の更新は今だに手作業。Wiki の更新が単純なくせに面倒くさくって、1日に何度もビルド依頼が来たりしたら、一気にやる気が無くなってしまう。

こればかりは手作業でやるしかないのかなと半ば諦めていたところ、Selenium を使っていて閃いた。Selenium みたいなツールを使って、ブラウザを自動操作してやればいいじゃなか、ってね。

Python で、Subversion リポジトリからリビジョン番号を取得し、整形して、wiki に投稿するスクリプトを書いてみた。Subversion の操作には pysvn、リビジョン情報の整形には Jinja2、wiki の投稿には mechanize を使っている。

update_wiki.py
# -*- coding: utf-8 -*-
import os
import time
import pysvn

# pysvn.Client をラップする
class SvnClient(object):
    def __init__(self):
        self._client = pysvn.Client()

    # 指定したリポジトリの最新のリビジョン番号を取得します。
    def get_recent_revision(self, path, revdate=None):
        if revdate is None:
            start_revision = pysvn.Revision(pysvn.opt_revision_kind.head)
        else:
            start_revision = pysvn.Revision(pysvn.opt_revision_kind.date, revdate)

        # ログを取得
        entry_list = self._client.log(path,
                                      limit=1,
                                      revision_start=start_revision)
        # リビジョン番号と日付を返す
        recent_log = entry_list[0]
        return recent_log["revision"].number, recent_log["date"]


def format_revision_date(revdate):
    st = time.localtime(revdate)
    return time.strftime("%Y/%m/%d", st)
    

context = {}
client = SvnClient()

# 内製ライブラリのアセンブリのリビジョンを取得
BIN_URL = "アセンブリのリポジトリの URL"
context["bin_rev"], revdate = client.get_recent_revision(BIN_URL)

# 内製ライブラリのソースコードのリビジョンを取得
SRC_URL = "ソースコードリポジトリの URL"
context["src_rev"], revdate = client.get_recent_revision(SRC_URL, revdate)

# リビジョンの日付を取得
context["build_date"] = format_revision_date(revdate)

# Jinja2 を使って Wiki 書式を作成
from jinja2 import Environment, FileSystemLoader
template_dir_path = os.path.join(os.path.dirname(__file__), "templates")
env = Environment(loader=FileSystemLoader(template_dir_path))
template = env.get_template("library_template.txt")
content = template.render(**context)
print(content)

# mechanize を使って Wiki にポスト
import mechanize
WIKI_EDIT_PAGE_URL = "Wiki の編集ページの URL"
br = mechanize.Browser()
br.open(WIKI_EDIT_PAGE_URL)
br.select_form(nr=0)
br["msg"] = content.encode("utf_8")
br.submit(name="write") # write ボタンをクリックして投稿
library_template.txt
**ライブラリバージョン

|ビルド日付|{{ build_date }}|
|ソースコードのリビジョン|{{ src_rev }}|
|アセンブリのリビジョン|{{ bin_rev }}|

あとは、このスクリプトを Jenkins のジョブとして実行すればいい。

これだけのスクリプト書くのに、調査も含めて3時間くらいかかった。でも、ビルド作業で中断された集中力を取り戻すのには結構時間かかるから、必要な時間投資だな。むしろ、さっさと自動化するべきだった。