GoでGitHubAPIを操作する〜Enterpriseから逃げるは恥だが役に立ったはず

  • 7
    いいね
  • 0
    コメント

ディップ Advent Calendar 2016 - Qiitaにまたしてもやって参りました。

GoでGitHubAPIを操作するネタです。

なぜやるか

とあるデータをGitHubEnterpriseに自動的にブランチを切ってぶっこんでプルリクまで出したい。  
ʕ•ᴥ•ʔ<とにかくGoでやりたい!

やったこと

APIを読んだ

https://developer.github.com/enterprise/2.8/v3/

go-githubなるものの存在を知った

https://github.com/google/go-github

ʕ•ᴥ•ʔ<go-github!使いたい!
とりあえず検証するためのリポジトリを作り、Tokenでも取得しよう。

ʕ•ᴥ•ʔ<Tokenはココで取得できるよ!

githubでトークンを取得する

importはこんな感じ。

main.go
import (
    "flag"

    "github.com/Sirupsen/logrus"
    "github.com/google/go-github/github"
    "golang.org/x/oauth2"

    config "path/to/config"
)

go-githubを見るとGitHubのユーザと対象のリポジトリ、そして先ほどのTokenが必要そうなので用意しておく。

environments.go
package github

import (
    "os"
)

type Environments struct {
    GitHubOwner      string
    GitHubRepository string
    GitHubToken      string
}

var (
    GetEnvironments = func() *Environments {
        return &Environments{
            GitHubOwner:      os.Getenv("GH_OWNER"),
            GitHubRepository: os.Getenv("GH_REPOSITORY"),
            GitHubToken:      os.Getenv("GH_TOKEN"),
        }
    }
)

サンプルはこんな感じ。
パラメータで渡したブランチを作成してくれる...はず。

main.go
var (
    branchName = flag.String("branch", "", "create branch name")
    baseBranch = "master"
)

func init() {

    logrus.SetLevel(logrus.DebugLevel)
    logrus.SetFormatter(&logrus.JSONFormatter{})

    flag.Parse()
}

func main() {

    client := getGitClient()
    service := client.Git

    createBranch(service)
}

func getGitClient() *github.Client {

    ts := oauth2.StaticTokenSource(
        &oauth2.Token{AccessToken: config.GetEnvironments().GitHubToken},
    )
    tc := oauth2.NewClient(oauth2.NoContext, ts)
    return github.NewClient(tc)
}

func createBranch(service *github.GitService) error {

    base := baseBranch
    new := *branchName

    masterRef, _, _ := service.GetRef(
        config.GetEnvironments().GitHubOwner,
        config.GetEnvironments().GitHubRepository,
        "heads/" + base,
    )


    ref := &github.Reference{
        Ref: github.String("refs/heads/" + new),
        Object: &github.GitObject{
            SHA: masterRef.Object.SHA,
        },
    }
    _, _, err := service.CreateRef(
        config.GetEnvironments().GitHubOwner,
        config.GetEnvironments().GitHubRepository,
        ref,
    )

    return err
}

試しに走らせてみよう!

go run main.go --branch "feature/new_branch"

ʕ•ᴥ•ʔ<Dream!

そして...

お気づきだろうか。
わたしが懸命にテストしていたのは、GitHubなのであって、GitHubEnterpriseではないのでした。

ココの部分なんとかならないのかな。

github.com/google/go-github/blob/master/github/github.go
defaultBaseURL = "https://api.github.com/"

Issueも上がってるし!誰か...誰か...