LoginSignup
2
0

More than 3 years have passed since last update.

Octokitを使用してGithubのIssueを取得・追加する

Last updated at Posted at 2020-06-30

はじめに

本記事は、GitHub APIとのやり取りを簡単にするためのライブラリであるOctokitを使用して得た知見をまとめることを目的としています。

事前準備

はじめに、GitHubにアクセスするためのトークンが必要なので作成します。
詳しいやり方はこちらがわかりやすいので参考にしてください。
なお、GitHubで作成したトークンは忘れてしまうと後で見ることができないので、使用するまではどこかに控えておいた方がいいです。
続いて、OctokitをNugetパッケージからインストールします。インストール先のプロジェクトをVisualStudio上で右クリックして、[NuGetパッケージの管理]をクリックします。参照タブを選択して[Octokit]と検索ボックスに入力すると先頭に出るので、画面右側のインストールボタンを押してインストールします。
2020-06-30_11h43_52.png

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/

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0