GitHub Octokit の新しい生成ベースの SDK を使ってみる
はじめに
#GitHub は WebUI だけでなく多くの API が提供されており、リポジトリのファイルや issue などの情報を API 経由で取得・更新できます。また、多くのプログラミング言語から GitHub の API を利用するための API クライアント Octokit も提供されています。筆者も JavaScript 版の Octokit はリリース作業の自動化などで何度かお世話になっています。
先日 Octokit が生成ベースの SDK に移行するという発表がありました。
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.
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}");
}
コンソールアプリのプロジェクトに class Program
とか static void Main(string[] args)
とか書かなくてよくなっているんですね。.NET 6 で変更されたようです。
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 に関してはどのような扱いになるのか気になるところです。