はじめに
本記事は、GitHub APIとのやり取りを簡単にするためのライブラリであるOctokitを使用して得た知見をまとめることを目的としています。
事前準備
はじめに、GitHubにアクセスするためのトークンが必要なので作成します。
詳しいやり方はこちらがわかりやすいので参考にしてください。
なお、GitHubで作成したトークンは忘れてしまうと後で見ることができないので、使用するまではどこかに控えておいた方がいいです。
続いて、OctokitをNugetパッケージからインストールします。インストール先のプロジェクトをVisualStudio上で右クリックして、[NuGetパッケージの管理]をクリックします。参照タブを選択して[Octokit]と検索ボックスに入力すると先頭に出るので、画面右側のインストールボタンを押してインストールします。
GitHub Issueを取得・追加してみる
準備ができました。以下がGitHub Issueの取得・追加している実際のコードです。たった数行書くだけで簡単にできてしまいます。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Octokit;
namespace DensoCreate.Lakewood.Extensions.GitHubIntegration.Services
{
/// <summary>
/// GitHub Issueを取得・追加するために必要なサービスを提供するクラス
/// </summary>
public class GithubService
{
/// <summary>
/// Github Issueを取得する
/// </summary>
/// <param name="settings">GitHubにアクセスするためのトークン、
/// Issueを取得するリポジトリを指定するための情報(リポジトリのオーナー名とリポジトリ名)</param>
/// <returns>GitHub Issueのリスト</returns>
public async Task<List<Issue>> GetIssues(GitHubExtensionSettings settings)
{
// 接続情報の設定
var tokenAuth = new Credentials(settings.Token);
var client = new GitHubClient(new ProductHeaderValue("lr")) {Credentials = tokenAuth};
// GitHub Issueの取得
var gitHubIssues = new List<Issue>();
var issuesAsync = await client.Issue.GetAllForRepository(settings.Owner, settings.Repository);
gitHubIssues = issuesAsync.ToList();
return gitHubIssues
}
/// <summary>
/// Github IssueにIssueを追加する
/// </summary>
/// <param name="settings">GitHubにアクセスするためのトークン、
/// Issueを取得するリポジトリを指定するための情報(リポジトリのオーナー名とリポジトリ名)</param>
/// <param name="issueTitle">Issueのタイトル</param>
/// <param name="issueBody">Issueの本文</param>
/// <returns></returns>
public async Task AddIssue(GitHubExtensionSettings settings, string issueTitle, string issueBody)
{
// 接続情報の設定
var tokenAuth = new Credentials(settings.Token);
var client = new GitHubClient(new ProductHeaderValue(settings.Owner)) {Credentials = tokenAuth};
// Issueを作成し、本文を設定
var createIssue = new NewIssue(issueTitle);
createIssue.Body = issueBody;
// Issueを追加
var newIssue = await client.Issue.Create(settings.Owner, settings.Repository, createIssue);
}
}
}
順番に解説したいと思います。
GitHubにアクセスするにはOctokitのGitHubClientのオブジェクトを作成する必要があります。GitHubClientのコンストラクタ引数にアプリケーション名を入れたProductHeaderValueオブジェクトを渡すことでGitHubへの接続が可能になります。
ただし、プライベートリポジトリへのアクセスやIssueの追加などをする場合にはユーザー認証が必要になるので、GitHubClientオブジェクトに認証情報(OctokitのCredentialsオブジェクト)を渡してやる必要があります。
// 接続情報の設定
var tokenAuth = new Credentials(settings.Token);
var client = new GitHubClient(new ProductHeaderValue("lr")) {Credentials = tokenAuth};
以上で、GitHub Issueへのアクセスが可能になりました。
続いて、GitHub Issueの取得について説明します。
Octokitのデータ取得、追加、更新の各メソッドは全て非同期になっているので、それを前提にコード書く必要があります。
GitHubClientオブジェクトのIssueのGetAllForRepositoryメソッドで引数にリポジトリのオーナーとリポジトリ名を指定することで、すべてのIssueを取得することができます。
// GitHub Issueの取得
var gitHubIssues = new List<Issue>();
var issuesAsync = await client.Issue.GetAllForRepository(settings.Owner, settings.Repository);
gitHubIssues = issuesAsync.ToList();
また、 RepositoryIssueRequestオブジェクトをGetAllForRepositoryメソッドの引数に指定することで取得するIssueにフィルタをかけることもできます。以下の例はOpenなIssueかつ特定のユーザーが Assignee に指定されているものを取得しています。
// GitHub Issueの取得
var gitHubIssues = new List<Issue>();
var assigneeFilter = new RepositoryIssueRequest { State = ItemState.Open, Assignee = username };
var issuesAsync = await client.Issue.GetAllForRepository(settings.Owner, settings.Repository, assigneeFilter);
gitHubIssues = issuesAsync.ToList();
最後に、GitHub Issueへの追加について説明します。
NewIssueオブジェクトのコンストラクタ引数にタイトル、Bodyに本文を設定することができます。なお、タイトルは必ず設定する必要があります。他にもAssignee、MileStoneやLabelを設定できます。ただし、MileStoneとLabelに関しては、あらかじめリポジトリ内に存在する必要があります。
GitHubClientオブジェクトのIssueのCreateメソッドにリポジトリのオーナー名、リポジトリ名、NewIssueオブジェクトを渡すことでIssueを追加できます。
// Issueを作成し、本文を設定
var createIssue = new NewIssue(issueTitle);
createIssue.Body = issueBody;
// Issueを追加
var newIssue = await client.Issue.Create(settings.Owner, settings.Repository, createIssue);
さいごに
今回はIssueの取得・追加を簡単にまとめてみました。すごく簡単にGitHubへアクセスできるので、興味のある方は是非お試しください。Githubへのコミットなどまだまだできることはありますので、色々試してみてください!
参考サイト
https://github.com/octokit/octokit.net
https://octokitnet.readthedocs.io/en/latest/issues/