LoginSignup
5
3

More than 5 years have passed since last update.

iMacrosを使って別リポジトリにGithub issueを一括移動させる

Posted at

前提

ある事情により数百件ほどあるGithub issueを別リポジトリに移動させたかったが、Github公式ではそのような機能はなく、
3rd party製のツールでも1つ1つ移すしか方法がなかった。

数百件ほどのissueを1つずつ移していては日が暮れてしまうのでiMacrosを使って移行作業を自動化した。その時のメモ。

やりたかったこと

  • リポジトリを跨いでGithub issueを移動させたい(ex. AリポのissueをBリポに移動)
  • 数百件ほど対象のissueがあるので一括で移動させたい

使うもの

※1 最初は常用しているChromeでiMacrosを使っていたが必要な機能が使えなかったのでFirefox版を使った。

やり方の流れ

  1. 移行対象のGithub issueのIDを取得しリストを作る
  2. iMacrosでIssue Mover For Github(by Google)を使う作業を自動化する
  3. iMacrosをjsで操作して移行対象リストをループで処理

 やってみる

1. 移行対象のGithub issueのIDを取得しリストを作る

今回はGithub APIを使う。
Tokenを取得し、それを使ってOpenなissueリストを取得。簡単なシェル芸でidリストを作成する。

$ curl -H "Authorization: token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" https://api.github.com/repos/fortkle/test_a/issues > issue.txt
$ cat issue.txt | grep number | awk '{ print $2}'

こんな感じ。カンマ区切りになってると尚良し。

170,
168,
162,
158,
146,
135,
134,
133,
132,
116,
107,
93,
83,
80,
77,
73,
67,
66,
62,
61,
58,
57,
55,
50,
45,
43,
41,
40,
39,
38,

(ちなみに私はZenhubの特定のpipelineに属するissueだけを移行したかったので、 ZenhubのAPIを使ってidリストを作成した。ほぼ同じやり方なので詳細は割愛。)

2. iMacrosでIssue Mover For Github(by Google)を使う作業を自動化する

iMacrosとはブラウザの操作をマクロ化するツールである。Chrome, Firefoxで拡張機能として使うことができる。
Issue Mover For Github(by Google)とはGoogleが提供しているissue移動ツールでコメントやlabelなども含めて移動してくれる(実際には移行元の内容を移行先にコピーして、移行元をcloseする)。

問題点として、 Issue Mover For Github(by Google)は1件ずつしかissueを移動させることができない。

勘の良い方ならお気づきだと思うが、「移動作業をiMacrosで自動化してしまえば数百件でも処理できる!!」ということである。

下準備

マクロを組む

まずは1件ずつIssue Mover For Github(by Google)を操作するマクロを組もう。
iMacrosの使い方はこちらを参考にさせたもらった。15~30分ぐらいで簡単に理解できる。
http://imacros.doorblog.jp/

組んだマクロはこちら。

IssueMoverForGithub.iim
VERSION BUILD=9030808 RECORDER=FX
TAB T=1
URL GOTO=https://github-issue-mover.appspot.com/
TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:sf1 ATTR=ID:issue CONTENT=fortkle/test_a#100
TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:sf1 ATTR=ID:repo CONTENT=fortle/test_b
WAIT SECONDS=2
TAG POS=1 TYPE=BUTTON ATTR=ID:move
WAIT SECONDS=10
TAG POS=1 TYPE=BUTTON ATTR=ID:close

上記は「fortkle/test_aにあるissue#100をfortkle_test_bに移動する」作業のマクロである。

ハマりどころだけ解説すると、
WAIT SECONDS=2 とあるが、ここで2秒ほど待たないとボタンがクリックできなかった。
また、 WAIT SECONDS=10と書いてあるところは10秒でなくても良いが、issueのコメントの移動に時間がかかるので平均10秒ほどsleepを入れればほとんどのissueは問題なく移動できた。10秒待つとだいたい15件ほどのコメントが付いたissueなら問題なく移行できる。
もし15件以上のissueがあるなら手動で移しておくか、 WAIT SECONDS=10の数字をもっと大きくすればよい。

ここまでで、1件移動させる作業を自動化させることができた。

3. iMacrosをjsで操作して移行対象リストをループで処理

iMacros for Firefoxではjsを使って連携することができる。jsを使ってiMacrosのマクロを呼び出し、ループさせて数百件のissueを一括移動させれば目的を達成できる。

さっそくiMacrosを操作するjsを作成する。
その前に、事前に作成したマクロを外から対象issueを渡せるようにしておく。

IssueMoverForGithub.iim
VERSION BUILD=9030808 RECORDER=FX
TAB T=1
URL GOTO=https://github-issue-mover.appspot.com/
TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:sf1 ATTR=ID:issue CONTENT=fortkle/test_a#{{!VAR1}}
TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:sf1 ATTR=ID:repo CONTENT=fortle/test_b
WAIT SECONDS=2
TAG POS=1 TYPE=BUTTON ATTR=ID:move
WAIT SECONDS=10
TAG POS=1 TYPE=BUTTON ATTR=ID:close

変わった点は fortkle/test_a#{{!VAR1}}のように移行対象のissue idを引数で渡せるようにした点だけだ。

では、上記のマクロをjsで操作してみる。 マクロ(IssueMoverForGithub.iim)と同じ階層に js(仮に exec.js)を作成する。

Issue_Mover_for_GitHub.png

exec.js
var targetIssueId = [
// ここに 作業 1. で取得移行対象のidを貼り付ける。
100,
101,
102,
];
for(var i=0; i<targetIssueId.length; i++){
  iimSet("!VAR1", targetIssueId[i]);
  iimPlay("IssueMoverForGithub");
}

最後にこのexec.jsを実行すれば数百件でも作業を自動化できる。

5
3
0

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
5
3