📌

[GraphQL][Github] createdAtとpublishedAtの違いを検証してみた

2024/03/10に公開

この記事で言いたいこと

この検証の限りは違いなし。
createdAtとpublishedAtは同じ日時を示していた。

はじめに

開発チームの生産性測定の一貫として、GithubのPR作成日時とcloseした時間の差分の平均を測定しようと思い立った。
そこでGithubのGraphQL APIを使って、実際に上記を試そうと思ったが、API DocumentのObjects - pullRequestの項目を読むとそれらしき日時がたくさんあった。

https://docs.github.com/en/graphql/reference/objects#pullrequest

  • mergedAt : マージした日時。
  • closedAt : closeした日時、これは採用。
  • createdAt : PR作成日時
  • publishedAt : PRの公開日時?ドラフト -> オープンにした日時?

publishedAtのAPIDocumentは以下の記述となっている。

publishedAt (DateTime)
Identifies when the comment was published at.

publishedAtがいまいち英語のニュアンスが掴みづらい。
commentが公開されたとは。自らのPRの本文もcomment扱いなのか、他者からのcommentがトリガーなのか。
ということでpublishedAtについて、検証してみた。

やったこと

開発環境

  • vscode
  • python3

事前準備

  • pip3 install gql
  • githubからprivateなaccess token取得

検証方法

まず以下の3種類のPRを作成

  • publicリポジトリでPRをDraftで作成(PR1)
  • publicリポジトリでPRをDraftで作成 -> Openへ変更(PR2)
  • publicリポジトリでPRをDraftで作成 -> Openへ変更、自らコメントを付ける(PR3)

次のスクリプトでGraphQLのAPIを叩いて、それぞれのpublishedAtの日付を確認する。

get_github_info_test_publishedAt.py
from gql import gql, Client
from gql.transport.requests import RequestsHTTPTransport
import json

test_publishedAt_query="""
  query {
    repository(owner:"masakid", name:"github-sample") {
      pullRequests(last: 10) {
        nodes {
          title
          url
          createdAt
          publishedAt
          closedAt
        }
      }
    }
  }
"""


# token
with open('token_file.txt', 'r') as f:
    token = f.read().strip()

# トランスポートの設定
transport = RequestsHTTPTransport(
    url='https://api.github.com/graphql',
    headers={"Authorization": f"bearer {token}"},
    use_json=True,
)

def post(query):
    # クライアントインスタンスを作成
    client = Client(transport=transport, fetch_schema_from_transport=True)

    # クエリを実行して結果を取得
    result = client.execute(query)
    # 実行結果を出力
    with open("test_publishedAt_query.txt", 'w', encoding='utf-8') as f:
        f.write(json.dumps(result, indent=4, ensure_ascii=False))
    return result

def main():
    query = gql(test_publishedAt_query)
    post(query)

if __name__ == '__main__':
  main()


結果

それぞれのPRでcreatedAtとpublishedAtは同じ日時となっていた。

{
    "repository": {
        "pullRequests": {
            "nodes": [
                {
                    "title": "PR1 : add file",
                    "url": "https://github.com/masakid/github-sample/pull/1",
                    "createdAt": "2024-03-10T06:38:47Z",
                    "publishedAt": "2024-03-10T06:38:47Z",
                    "closedAt": null
                },
                {
                    "title": "PR2 : add file",
                    "url": "https://github.com/masakid/github-sample/pull/2",
                    "createdAt": "2024-03-10T13:09:55Z",
                    "publishedAt": "2024-03-10T13:09:55Z",
                    "closedAt": null
                },
                {
                    "title": "PR3 : add file",
                    "url": "https://github.com/masakid/github-sample/pull/3",
                    "createdAt": "2024-03-10T13:10:20Z",
                    "publishedAt": "2024-03-10T13:10:20Z",
                    "closedAt": null
                }
            ]
        }
    }
}

まとめ

少なくともPRのDraft、OpenではcreatedAtとpublishedAtは変わらず、
当初の目的である「GithubのPR作成日時とcloseした時間の差分」については
どっちを使ってもいいということがわかった。

最後に

もし有識者の方がいれば、どんなときにcreatedAtとpublishedAtが変わるのか
教えていただけると助かります!

Discussion