🧐

GitHub CLIでGithub Project V2(非Classic)へissueを転記する

2023/01/18に公開

こんにちは!

本業の方でGitHub Projectに紐付いていない大量のisssueを任意のProjectを紐付けることになり、
その中で諸々調査した内容を元にアウトプットします。

結果

拡張機能を使う場合

記事を書き始める前に知りました。
こちらの方が断然楽です。😅
(最初からこれを使えば良かったー

https://zenn.dev/shuntaka/articles/edfd9ce2c0ee52

GraphQL APIを使う場合

事前に認証tokenのスコープにprojectのrw権限を追加する必要があります。

gh auth refresh --scopes project

以下のサンプルコードではissueのID一覧を取得して任意のプロジェクトに紐付ける動作をします。

PROJECT_ID="PVT_XXXXXXXXXXXXXXX"

gh issue list --json id | jq -r '.[] | .id' \
| xargs -I {} gh api graphql -f query='
mutation($project_id: ID!, $issue_id: ID!) {
    addProjectV2ItemById(input: {projectId: $project_id, contentId: $issue_id}) {
      item {
        id
      }
    }
  }
' -f project_id=${PROJECT_ID} -f issue_id={}

※ プロジェクトIDは以下のようなクエリで確認できます。

gh api graphql -f query='
  query{
    organization(login: "example") {
      projectsV2(first: 20) {
        nodes {
          id
          title
        }
      }
    }
  }'

調査過程

gh issue editのCLI引数で指定出来るプロジェクト名はclassicしか対応していなかった

gh issue edit 1 --add-project "プロジェクト名"

最初は呑気にこれでいけるだろうと思って試したのですが、
"プロジェクト名" not found なんて言われちゃって、
えっ??となりました😂

調べてみると、旧Classic版のProjectsにしか対応していないんだというのを知りました

https://github.com/cli/cli/issues/4547

GraphQL APIで試してみる

先程のこのissueにはGraphQL APIを使えばいけるよーなんて書いてあったので、
とりあえず鵜呑みにして手を動かしてみました。

するとサンプルコードで書かれている addProjectNextItem というmutationが既に廃止されていたんですね。

https://github.blog/changelog/2022-06-23-the-new-github-issues-june-23rd-update/

そうしたらどうすれば良いよということで、記事に書かれてある通り addProjectV2ItemById を使ってみれば良かったんですが、
目に止まらなかったためそのまま違う方法を模索してしまいました。

updateIssue mutationだとClassic版のProjectしか対応していない

updateIssue というmutationを見つけて紐付いているprojectを更新出来ることを知って試してみたところ、
Oh〜、 これも駄目かーというのを知りました。
Classic版のGithub Projectにしか対応していなかったです。
(公式ドキュメントに明示してくれれば良いんですが見つからなかったです

 gh api graphql -f query='
mutation{
  updateIssue(input: {
    id: "I_XXXXXXXXXXXXXXX",
    projectIds: ["PVT_XXXXXXXXXXXXXXX"],
  }) {
    issue {
      id
      title
    }
  }
}'

addProjectV2ItemByIdだと出来た💪

そこで、 「 addProjectNextItem ってプロジェクトに対してissueを追加することだよなぁ」 と思い、
V2だと代替のある?という思考にやっとたどり着いた感じでした😅
ProjectV2についてのリリース記事ちゃんと読んでおけば良かったー

addProjectV2ItemById

あー、最初から拡張機能探しておけば良かったなーと。笑
もう少し視点を広げて調べていれば無駄に時間を溶かすこと無かったなぁと勉強になりました。
(gh issue editで出来ないと知ってから2時間くらい溶かしちゃいました😢

Discussion