はじめに

こんにちは。エンジニアの荒井です。
今回は業務効率化のために作った簡易的なツールの紹介と、それを作ったことについてのお話です。

背景

それぞれのサービス・ツール内では自動的にリンクになるけど、サービスを超えた途端にリンクじゃなくなってしまい鬼のコピペ祭りが始まる...
Backlog、Redmineなどタスク管理のツールを使っている方なら一度は経験があるかと思います。
エディタで矩形選択したり、shell芸でスマートに解決することもできそうですが、今回はPythonスクリプトで少しだけリッチにしてみました。

やりたいこと

前提

  • BacklogとRedmineを使ってタスクを二重管理している
  • RedmineチケットのタイトルにBacklogの課題番号が含まれている
  • masterとなるのはBacklog

概要

Backlogのプレフィックスのついた文字列を含むファイルをツールに通すと、以下のような置換・補完ができるものを目指します。

  • Backlogの課題番号がBacklogチケットへのリンクに置換されたマークダウンファイルになる
  • Backlog課題番号がタイトルに含まれるRedmineチケットを探してくれて、リンクになる
  • Redmineへのリンクは、通常のマークダウンのリンク形式およびRedmine記法バージョンの2通り出力できる
  • リンクにしたい部分以外の文字や行はそのまま変換後のファイルにも入れる

以下のようなHOGEプロジェクトに関する自分用のタスクメモがあるとします。

* HOGE-1 hogeAPIの改修
    * xxを改修して動作確認する
* HOGE-2 API仕様書の修正
    * HOGE-1 が終わったら作業する
* Aさんにお願いすること
    * HOGE-3 fugaサーバ証明書の更新

ツールを実行して出力される期待値は以下です。

バージョン1

Backlogチケットへのリンクに置換する

* [HOGE-1](https://hogefuga123.backlog.jp/view/HOGE-1) hogeAPIの改修
    * xxを改修して動作確認する
* [HOGE-2](https://hogefuga123.backlog.jp/view/HOGE-2) API仕様書の修正
    * [HOGE-1](https://hogefuga123.backlog.jp/view/HOGE-1) が終わったら作業する
* Aさんにお願いすること
    * [HOGE-3](https://hogefuga123.backlog.jp/view/HOGE-3) fugaサーバ証明書の更新

バージョン2

Backlogチケットへのリンクに置換する + Redmineチケットへのリンクを追加する

* [HOGE-1](https://hogefuga123.backlog.jp/view/HOGE-1) [#12345](https://www.hogefuga123.com/redmine/issues/12345) hogeAPIの改修
    * xxを改修して動作確認する
* [HOGE-2](https://hogefuga123.backlog.jp/view/HOGE-2) [#12346](https://www.hogefuga123.com/redmine/issues/12346) API仕様書の修正
    * [HOGE-1](https://hogefuga123.backlog.jp/view/HOGE-1) [#12345](https://www.hogefuga123.com/redmine/issues/12345) が終わったら作業する
* Aさんにお願いすること
    * [HOGE-3](https://hogefuga123.backlog.jp/view/HOGE-3) [#TODO](https://www.hogefuga123.com/redmine/issues/TODO) fugaサーバ証明書の更新

バージョン3

Backlogチケットへのリンクに置換する + RedmineチケットのリンクをRedmine記法で追加する
(Redmine記法ではチケット番号の先頭に#をつけるとリンク化されます)

* [HOGE-1](https://hogefuga123.backlog.jp/view/HOGE-1) #12345 hogeAPIの改修
    * xxを改修して動作確認する
* [HOGE-2](https://hogefuga123.backlog.jp/view/HOGE-2) #12346 API仕様書の修正
    * [HOGE-1](https://hogefuga123.backlog.jp/view/HOGE-1) #12345 が終わったら作業する
* Aさんにお願いすること
    * [HOGE-3](https://hogefuga123.backlog.jp/view/HOGE-3) #TODO fugaサーバ証明書の更新

作成したツールについて

Githubリポジトリ

以下が2023/04/12時点での最新です。
https://github.com/milldea/assorted-utility-tools/tree/f7f29f4/ticket_link_generator

開発環境、使用したツールなど

  • MacOS 12.5.1
  • Python 3.9.12
  • Redmine 4.2.4.stable

使い方、注意事項など

詳細はGithubリポジトリのREADMEを参照ください。

作ってみて思ったこと

追加したい機能はどんどん出てくる

最初はRedmine記法にのみ対応させていましたが、途中でRedmineチケットも通常のリンク形式にするオプションを足しました。
Backlog上にあってRedmine上にないチケットを作成するオプションもあったら便利だなと思ったり、逆にRedmineのチケット番号からBacklogのチケットを探索させるのもあっても良いかもとも思っています。

最初から"いずれ直す必要がある"ことが分かっている箇所は、コードに残しておくと良い

作成当初、急ぎで作っていたためRedmineチケットを探索する際にAPIのページング機能を使わない作りにしていました。
そして該当の箇所にログを入れ、"このログが出たらRedmineチケットが探索しきれていないよ、ページングを入れようね"という趣旨のコメントを残していました。
早速ひと月後くらいにそのログが出力されるようになり、修正しました。> pull request:2
ユーザからも"このログが出ているからチケットが探索しきれていないみたいです"という連絡を受けましたが、これをログに出していなかったら"なぜかRedmineのチケットが全部探索されない...不具合?"と思わせてしまっていたと思います。

公開ツールであるという意識が必要

今回githubにて全世界に公開しているため、セキュリティリスクなどを考慮しREADMEに注意書きを入れました。

注意事項
リポジトリはpublicです。
実際に使用されているRedmine, BacklogのURLおよびAPI Keyなどのプロジェクト情報は絶対にコミットしないでください。
事故防止のため、プロジェクト情報はスクリプト上部に用意した定数以外に入れての使用は非推奨とします。

最新の改修で対策を追加

RedmineのURLとAPI Keyがセットで漏洩するなんてこの上なく恐ろしいので、今後の改修で定数部分に変更がある場合コミットできないようにするなどの対策をかけようと思っています。

本記事作成にあたり、上記のような改修予定を書いて社内レビューをお願いしたところこんなアドバイスをもらいました。

api key とかを config.json みたいなファイルにしておいて、 config.json は .gitignore しておくと、多少全公開のリスクは下がるかなと思いました。

確かに!
ということで、早速対応しました。> pull request:4
折角なのでインプット・アウトプットファイルを置く想定のディレクトリ以下も、サンプルファイルを除いて.gitignoreしました。

誰かが使ってくれると嬉しい

このツールは実際に社内で数名のメンバーが使用してくれています。
そうすると、使い方の質問を受けたり、実際に使っているところを見かけたりする機会があります。
"ああ、この書き方では伝わりづらかったんだな"と思ったり、こういうことができるとより便利なのかも?と思ったりして、元は自分のために作ったものだったはずが、いつの間にか良いツールを提供したい!という気持ちになっていました。
コードを書くのは元々好きなので、楽しい&嬉しい&便利で良いことばかりでした。

おわりに

いかがでしたでしょうか。
このツールを一緒に育ててくれる方、何かツールとか細かいスクリプト書くのやってみようかなと思ってくれた方がいたら嬉しいです。
また、本記事の中でも出てきたように既にいくつか改修の構想があります。

  • Backlog上にあってRedmine上にないチケットを作成するオプション
  • Redmineのチケット番号からBacklogのチケットを探索させる

pull requestやその他issueの作成などお待ちしております!