STORES Product Blog

こだわりを持ったお商売を支える「STORES」のテクノロジー部門のメンバーによるブログです。

GitHub Issueにラベルを一括で付けたい

やりたかったこと

指定したIssueすべてに同じラベルを付けたい!!!!

手作業だと数が多すぎたので、なるべく楽にやりたい!!!

(2022/12/14現在、Web上で一括でラベルを付ける方法はありませんでした)

手順

  1. 下準備
  2. Issueのリストを取得する
  3. ラベルをつける

下準備

personal access tokenを作成します。

参考:個人用アクセス トークンの作成 - GitHub Docs

権限は以下で良いです。

  • repo
  • admin:org
    • read:org

トークンは後で使うのでメモしておきましょう。

Issueのリストを出す

すでにラベルを付けたいIssueの、Issue番号が揃っている場合はこの作業をSkipします。 ここでは、2つの場面でのIssueのリストを取得する方法を書いています。

リポジトリに紐づくIssueリストを取得する

ラベルを付けたいIssueがすべて同じリポジトリにある場合に使います。

参考:Issues - GitHub Docs

Query parametersで様々な条件で絞れます。(公式ドキュメント参照)

curl 'https://api.github.com/repos/<OWNER>/<REPO>/issues' \
  -H 'Accept: application/vnd.github+json' \
  -d state=closed \ # statusがclosedになっているものだけ
  -G

取得したIssueがどのプロジェクトに入っているかの情報は入ってきません。

プロジェクトにあるIssueリストを取得する

ラベルを付けたいIssueが、同じプロジェクトに入っている場合に使います。

Issueが複数のリポジトリに所属する場合にも使えます。

カラムを指定してカードを取得する

参考:Project (classic) cards - GitHub Docs

curl 'https://api.github.com/projects/columns/<カラムID>/cards' \
    -H "Accept: application/vnd.github+json" \
    -H "Authorization: Bearer <トークン>"\
    -d per_page=100 \
    -d page=10 \ # 901~1000件目を取得
    -G
  • <トークン>には先程入手した個人用アクセス トークンを入れます。
  • カラムIDは Copy column linkするとコピーされるURLhttps://github.com/XXXX/XXXX/XXXX/1#column-<カラムID>の末尾に入っている数字の部分です。

  • API1回につき最大100件ずつ取得できます。(デフォルトは30件)

    • 100件を超える場合もpageの指定を自分でインクリメントして叩けば、全件取得できます。 (例えば、100件ずつ×page10回で1,000件取得)

取得した結果からIssueの情報を抜き出す

"content_url"の中に、IssueのURLが入っています。

 "content_url": "https://api.github.com/repos/<OWNER>/<REPO>/issues/<Issue番号>"

末尾のIssue番号が必要なので、いい感じに抽出しましょう。

正規表現だと^(?! "content_url).*$\nとするとcontent_urlの行だけ生き残ります。

1つのIssueにLabelを付ける

Issue番号が分かれば、ラベルを付けることができます。 参考:Labels - GitHub Docs

curl \
  -X POST \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer <トークン>"\
  https://api.github.com/repos/<OWNER>/<REPO>/<Issue番号>/labels \
  -d '{"labels":[<付けたいラベル名>]}'

すべて更新ではなく、付けたいラベルだけ追加されます。

付けたいラベル名は""で囲ってください。

ラベルは、,を挟んで複数指定できます。

複数のIssueに同じラベルを付ける

複数のIssueを一括で付けるAPIはないので、APIをぶん回す必要があります。

リポジトリごとにですが、指定したIssueにラベルを付けていくスクリプトを作りました。

【注意】

  • リポジトリが違うIssueに適用したい場合は<OWNER>/<REPO>部分を適宜変更してください。

  • GitHubAPIの使用回数制限があります。下記スクリプトを流す場合は、Issueの数が制限に引っかからないか確認をしてください。

    (2022/12/14時点では、personal access tokenを使ってのリクエストは、1時間あたり6,000回でした。)

参考:REST API のリソース - GitHub Docs

#!/bin/bash

count=0
for issueNum in 111 222 333 # ラベルを付けたいIssueの番号を列挙
do
  echo $issueNum
  curl=`cat <<EOS
  curl
    -X POST
    -H "Accept: application/vnd.github+json"
    -H "Authorization: Bearer <トークン>"
    https://api.github.com/repos/<OWNER>/<REPO>/issues/$issueNum/labels
    -d '{"labels":[<付けたいラベル名>]}'
  EOS`
  eval ${curl}

  count=`expr $count + 1`
  if [ $(( $count % 10 )) -eq 0 ]; then
    echo “pre sleep, count : ${count}
    sleep 3
  fi
done

ごく短期間に全ラベル付け対象件数分のAPIコールを実施した場合、攻撃と見なされる可能性や、攻撃とはみなされないまでもスロットリング等なんらかの制限対象となる可能性を考慮し、 10件叩くごとに3秒のウェイトが入るようになっています。

おまけ

Issueについているlabelを取得

curl \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer <トークン>"\
  -H "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/repos/<OWNER>/<REPO>/issues/<Issue番号>/labels

おわりに

普段やっているiOSエンジニアの仕事とは少し違う作業で、分からないことだらけで困っていたら、所属もチームも違う人達がたくさん教えてくれました。

こういう慣れないことは、原因のアタリを付けられずに迷宮入りして時間を溶かしてしたりしまうので、本当にありがたかったです。

そんなエンジニアと働きたい!と思った人はこちらから!

エンジニア採用サイト|STORES 株式会社