GitHub Octokit の新しい生成ベースの SDK を使ってみる

| 6 min read
Author: masahiro-kondo masahiro-kondoの画像

はじめに

#

GitHub は WebUI だけでなく多くの API が提供されており、リポジトリのファイルや issue などの情報を API 経由で取得・更新できます。また、多くのプログラミング言語から GitHub の API を利用するための API クライアント Octokit も提供されています。筆者も JavaScript 版の Octokit はリリース作業の自動化などで何度かお世話になっています。

先日 Octokit が生成ベースの SDK に移行するという発表がありました。

Our move to generated SDKs

Microsoft の Kiota という OpenAPI で記述された API のクライアントを生成する CLI ツールを利用して SDK を生成するようです。生成ベースに移行することで、SDK への新機能の提供を早くすることが可能とのことです。

GitHub - microsoft/kiota: OpenAPI based HTTP Client code generator

新しい SDK のリポジトリとして、Go SDK と .NET SDK が公開されています。

GitHub - octokit/go-sdk: A generated Go SDK from GitHub's OpenAPI specification.

GitHub - octokit/dotnet-sdk

Go SDK

#

Go SDK をインストールしてサンプルを動かしてみます。

筆者の環境では、Go の v1.20.4 が入っていました。

$ go version
go version go1.20.4 darwin/arm64

まず、プロジェクトを作成します。

mkdir hello-go-sdk && cd hello-go-sdk
go mod init

プロジェクトに main.go ファイルを追加し、以下のコードを書きます。Octocat のアスキーアートを取得する API を呼び出しています。

package main

import (
	"context"
	"fmt"
	"log"

	abstractions "github.com/microsoft/kiota-abstractions-go"
	http "github.com/microsoft/kiota-http-go"
	auth "github.com/octokit/go-sdk/pkg/authentication"
	"github.com/octokit/go-sdk/pkg/github"
	"github.com/octokit/go-sdk/pkg/github/octocat"
)

func main() {
	tokenProvider := auth.NewTokenProvider(
		auth.WithUserAgent("octokit-study/hello-go-sdk"),
	)
	adapter, err := http.NewNetHttpRequestAdapter(tokenProvider)
	if err != nil {
		log.Fatalf("Error creating request adapter: %v", err)
	}

	client := github.NewApiClient(adapter)

	s := "Hello Octokit Go SDK"

	headers := abstractions.NewRequestHeaders()
	_ = headers.TryAdd("Accept", "application/vnd.github.v3+json")

	octocatRequestConfig := &octocat.OctocatRequestBuilderGetRequestConfiguration{
		QueryParameters: &octocat.OctocatRequestBuilderGetQueryParameters{
			S: &s,
		},
		Headers: headers,
	}
	cat, err := client.Octocat().Get(context.Background(), octocatRequestConfig)
	if err != nil {
		log.Fatalf("error getting octocat: %v", err)
	}
	fmt.Printf("%v\n", string(cat))
}

パッケージをインストールします。

go mod tidy

go.mod ファイルには以下のように依存ライブラリが指定されました。

require (
	github.com/microsoft/kiota-abstractions-go v1.5.3
	github.com/microsoft/kiota-http-go v1.1.1
	github.com/octokit/go-sdk v0.0.4
)

コードを実行します。

go run main.go

無事レスポンスを取得できました。

               MMM.           .MMM
               MMMMMMMMMMMMMMMMMMM
               MMMMMMMMMMMMMMMMMMM      ______________________
              MMMMMMMMMMMMMMMMMMMMM    |                      |
             MMMMMMMMMMMMMMMMMMMMMMM   | Hello Octokit Go SDK |
            MMMMMMMMMMMMMMMMMMMMMMMM   |_   __________________|
            MMMM::- -:::::::- -::MMMM    |/
             MM~:~ 00~:::::~ 00~:~MM
        .. MMMMM::.00:::+:::.00::MMMMM ..
              .MM::::: ._. :::::MM.
                 MMMM;:::::;MMMM
          -MM        MMMMMMM
          ^  M+     MMMMMMMMM
              MMMMMMM MM MM MM
                   MM MM MM MM
                   MM MM MM MM
                .~~MM~MM~MM~MM~~.
             ~~~~MM:~MM~~~MM~:MM~~~~
            ~~~~~~==~==~~~==~==~~~~~~
             ~~~~~~==~==~==~==~~~~~~
                 :~==~==~==~==~~

.NET SDK

#

次に .NET SDK も試してみます。

利用するには .NET 8.0 のインストールが必要です。

.NET 8.0 (Linux、macOS、Windows) をダウンロードする

筆者は、macOS の Arm64 のインストーラーをダウンロードして利用しました。

$ dotnet --version
8.0.100

コンソールアプリのプロジェクトを作成します。

dotnet new console -n HelloDotnetSdk

プロジェクトに Octokit.NET.SDK をインストールします。

cd HelloDotnetSDK
dotnet add package Octokit.NET.SDK

パッケージがダウンロードされ、HelloDotnetSdk.csproj に以下のようにパッケージ参照が追加されます。

<Project Sdk="Microsoft.NET.Sdk">

  <!-- 中略 -->

  <ItemGroup>
    <PackageReference Include="Octokit.NET.SDK" Version="0.0.4" />
  </ItemGroup>

</Project>

Program.cs に以下のようなコードを書きます。リポジトリを指定してプルリクエストのリストを取得して一覧表示しています。

using GitHub;
using GitHub.Client;
using GitHub.Authentication;

var token = Environment.GetEnvironmentVariable("GITHUB_TOKEN") ?? "";
var request = RequestAdapter.Create(new TokenAuthenticationProvider("Octokit.Gen", token));
var gitHubClient = new GitHubClient(request);

var pullRequests = await gitHubClient.Repos["octokit"]["octokit.net"].Pulls.GetAsync();

foreach (var pullRequest in pullRequests)
{
    Console.WriteLine($"#{pullRequest.Number} {pullRequest.Title}");
}
Information

コンソールアプリのプロジェクトに class Program とか static void Main(string[] args) とか書かなくてよくなっているんですね。.NET 6 で変更されたようです。

.NET 6+ での C# コンソール アプリ テンプレートの変更 - .NET

GitHub の PAT を環境変数 GITHUB_TOKEN に指定して、プログラムを実行します。

export GITHUB_TOKEN=your-personal-access-token
dotnet run Program.cs
#2849 build(deps): bump xunit from 2.6.4 to 2.6.5
#2847 [feat] Add Rocket & Eyes reactions to `ReactionSummary`
#2844 Fixes PushId datatype to not overflow (fix user activity exception)
#2787 Rate Limit Handling
#2686 Variables API

無事に取得できました。

さいごに

#

以上、OctoKit が生成ベースの SDK に移行するということで Go SDK と .NET SDK を使ってみました。両者ともバージョンが 0.0.4 になっていますが、これは Kiota の生成バージョンなのかもしれません。

まだ正式リリースは当面先だと思いますが JavaScript 版が出たら使ってみたいと思います。

Octokit/Rest については生成ベースになりますが、GraphQL に関してはどのような扱いになるのか気になるところです。

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。