読者です 読者をやめる 読者になる 読者になる

#2 最近goで色々作った話 ~ 今年も残り18営業日 ~

はじめに

こんにちは、1日目担当の@p_chinから褒められてるのか嫌味なのか分からない紹介をうけ、更には 頼りGayのある先輩とtypoされ下からの突き上げが厳しいなぁ…と感じる今日この頃。

@Konboi です。

今年の teck kayac AdventCalendar2014 のテーマは 「自分のなかのアツいあれな話」

Go言語推しでいこう!ということもあり、最近はGoが自分の中でアツいです!激アツです!!

鉄は熱いうちになんとかというのでアツいうちに色々つくってみたので、今日は最近Goで作ったものを紹介しようと思います。

ghooks

ghooks

こちらはGithubのWeb hookのレシーバーで Github::Hooks::Receiver, octoks のGolang製だと思っていただければと思います。

これは現在携わっているプロジェクトの開発環境にも導入しており

  • pushされた際にJenkinsのテストを自動で回す
  • pushされたブランチ名によって回すテストを変える
  • masterブランチからreleaseブランチへpull request を送った際にrelease用のテストを自動で回す

のように使っており非常に便利です。 ここにのっているイベントに対して設定できるので是非使って見て下さい。

package main

import (
    "fmt"
    "log"

    "github.com/Konboi/ghooks"
)


func main() {
    port := 8080
    hooks := ghooks.NewServer(port)

    hooks.On("push", pushHandler)
    hooks.Run()
}

func pushHandler(payload interface{}) {
    fmt.Println("puuuuush")
}

ちなみに、payloadにはここのレスポンスをそのまま返しているので go-jsonpointerなどを使うと簡単に扱えます

bbhooks

bbhooks

これは bitbucketのWeb hook receiver で 先ほど紹介した ghooksのbitbucket版です。

最近、個人のプロジェクトでbitbucketを使っていて、masterブランチにpushしたら自動でテストサーバーを最新の状態に更新して欲しいと思っていたのでghooksをいじってbitbucket版のhooks receiverをつくってみました。

ドキュメントを見てみましたが、push,pull_requestとbranchに変更があったときにhookが走るだけで、特にイベント名がとれないみたいなのでghooksのようにイベントごとに設定することはできませんが、 pushされたらpullしてサーバーをrestartするという最低限のことはできるようになっています。

必要だった最低限のことはできるので、bitbucketを使っている方は試してみてください。

package main

import (
    "fmt"

    "bitbucket.org/Konboi/bbhooks"
)

func main() {
    port := 2299
    hooks := bbhooks.NewServer(port)

    hooks.On(someHandler)
    hooks.Run()
}

func someHandler(payload interface{}) {
    fmt.Printf("#v", payload)
}

gokun

gokun

gokunはgolangでirc botを簡単に書くためのframeworkです。

goでirc botを書く記事は色々ありますが、個人的に少々面倒だなと思っていました。

また、衣玖さんが大好きな会社の先輩irc-clientをgoで作っているのを見つけたのでそれを使って作ってみました。

package main

import(
    "log"

    "github.com/Konboi/gokun"
)

func main() {
    gokun, err := gokun.New(&gokun.Config{
        Server:    "irc.example.com",
        Port:      6667,
        Nick:      "gokun",
        Channnels: "#test",
    })
    if err != nil {
        log.Fatalf("%s", err.Error())
    }

    gokun.OnCommand("hello", hello)

    gokun.Run()
}

func hello(r *gokun.Receiver) {
    r.PrivMsg(fmt.Sprintf("%s: What's ??", r.FromNick))
}

条件のマッチ部分(上記のサンプルだと “hello”の部分)を正規表現で渡せるようになったらもう少し便利になるかなと思っていますが、とりあえず大体のことはできると思います!

使ってみて バグ・不満 またこう書いたほうがいいよ等々ありましたらissue、pr いただけると嬉しいです!!!

さいごに

本日含めて今年も残り18営業日となりましたが、テンションあげて2014を突っ走りたいと思います!!

さて、明日はこのAdvent Calendar 2014を取りまとめてくれているイケメソエンジニア @Maco_Tasu が 3日目にふさわしい記事を書いてくれると思います!!