NulabのbacklogからJiraへのポーティングのやり方

途中参加したプロジェクトでbacklogを利用していたけど、GitHubとの連携とかも含めて、やはりJiraのほうが洗練されていてやりやすいので、移行した。なので、課題をポーティングしたのでやり方を書いておきます。

要件

  • IDの連番はbacklogのときと同じ数字にしたい
    • 探しやすいしみやすい
    • 後述のリンクの作成もできるし
    • Jiraのプロジェクトは新規で作成して課題が何もない状態にしています
  • コメントも綺麗に入れたい
  • もとのbacklogへのリンクも入れたい
    • 最初のコメントとして登録する
  • backlogで本文、コメントに書いてリンクにしていたものはJiraの関連リンクとして入れたい
  • 今までマイルストンだったのはそのままリリースバージョンに移行したい
  • 添付ファイルがエクスポートできなかったので、手動でいい

やり方

backlogから課題一覧をCSVでダウンロードしている前提で、そのCSVへ手を加えていきます。

  1. (オプショナル) エンコーディングスキームをUTF-8に変える
  2. (オプショナル) IDでソート
  3. 名前がyamadaみたいな形式で入っているので、Atlassianアカウントに登録されているメールアドレスに置換する
    1. 人数多ければスクリプトでやる
  4. コメントのカラム分割
    1. 2020/04/24 13:16 shirakawa.hiroyuki@example.com¥¥nFoobar みたいな形式で入っているので、 2020/04/24 13:16; shirakawa.hiroyuki@example.com;¥¥nFoobar みたいな形式に置換する。こうすると、コメントの日時、投稿者が正しく保存される
    2. "(\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}) ([a-z\.]+@velc\.co\.jp) , $1; $2;みたいな正規表現を使うと便利
  5. backlogの課題へのリンクがあった方が安心感があるのでキーを元にしてリンクのカラムを追加する
    1. ここからはGoogle Spreadsheetを使うのが便利
  6. backlogとJiraで課題キーの連番が揃っていた方がスッキリするので、課題キーのカラムを追加する
    1. Google Spreadsheetのconcatで適宜 =concat('FOO-', $A2) みたいな。
  7. backlogの課題キーのリンクをJiraの関連リンクとして扱いたいので、適当なスクリプトで抽出する。適当なやつを補足に記載
    1. スプレッドシートに貼り付けて、ヘッダを追加
  8. 改行が¥¥nになっているので、\nに置換する

コツなど

  • インポート設定はダウンロードできるので、保存しておくと便利。試行錯誤がしやすい
  • すでに存在する課題キーで登録しようとするとわりと不安定なので、インポートを試す前に全部消した方がいい。消すと安定して動く

補足

リンク抽出スクリプト。不完全かも。

import csv
import re

reg = re.compile(r"(ISSUE_KEY-\d+)")


def find_key(src):
    return reg.findall(src)


def read():
    result = []
    with open("src.csv") as csvfile:
        reader = csv.DictReader(csvfile)
        max = 0
        for row in reader:
            temp = find_key(row["詳細"])
            for i in range(1, 10): # コメントカラムの数まで
                temp += find_key(row[f"コメント{i}"])
            t2 = list(set(temp))
            if max < len(t2):
                max = len(t2)
            print(f"{row["課題キー"]}\t{"\t".join(t2)}")
            result.append(t2)
    print(max)


def main():
    read()


if __name__ == "__main__":
    main()