goa で静的ファイル配信に go-bindata を使う

goa には静的ファイル配信のための DSL として Files が用意されており、以下のような定義を行うと FileServer を生成してくれます。

Files("/swagger/*filepath", "public/swagger/")

生成される FileServerhttp.FileSystem という interface を通してファイルオープンを行うのですが、従来は http.Dir という実装を固定で使う仕様になっていました。 http.Dir は実行環境のネイティブファイルシステムからファイルオープンを行います。これは、ビルドしたバイナリを実行環境にデプロイする際に Files で定義した静的ファイルもそのファイルシステム上に配置する必要がある、ということを意味します。

Go は、ビルドしたバイナリひとつをデプロイすれば動作する、いわゆるシングルバイナリが魅力のひとつですが、 goa の FileServer でそれを実現するためには http.Dir 以外の http.FileSystem 実装を使えた方が都合がいいです。という訳で変更できるようにしました。

github.com

使い方は簡単です。例として go-bindata を使って実装してみましょう。あらかじめ go-bindata で目的の静的ファイルを Go のソースコード化しておき、該当の controller をマウントする前にそのコードを使用するよう FileSystem というフィールドを差し替えます。

c1 := controllers.NewSwaggerController(service)
c1.FileSystem = func(dir string) http.FileSystem {
    return &assetfs.AssetFS{
        Asset:     Asset,
        AssetDir:  AssetDir,
        AssetInfo: AssetInfo,
        Prefix:    dir,
    }
}
app.MountSwaggerController(service, c1)

go-bindata で生成されたコードを http.FileSystem にラップするライブラリとして go-bindata-assetfs を使用しています。これで該当の静的ファイルは Go の内部でオープンされるようになるのでデプロイする必要がなくなります。ちなみに、記事のタイトルと例では go-bindata を取り上げましたが、 FileSystem フィールドの関数は http.FileSystem を返せば良いので他のライブラリを使うこともできます。

より詳細な例は以下をご覧ください。

github.com

goa へのプルリクエストの送り方 (バックポート編)

goa へのプルリクエストの送り方 (バックポート編) です。

goa では互換性維持のため master と v1 を別ブランチで管理しています。そのため、プルリクエストが master にマージされたあと、その変更を v1 ブランチにバックポートするようお願いされることがあります。本編ではその手順について解説します。

1. リポジトリに移動

コンソールで以下のコマンドを実行します。

$ cd $GOPATH/src/github.com/goadesign/goa

2. v1 から新しいブランチをチェックアウト

コンソールで以下のコマンドを実行します。

$ git fetch
$ git checkout -b $BRANCHNAME origin/v1

$BRANCHNAME には任意のブランチ名を入れてください。例えばブランチ名を foo-bar-v1 とする場合は以下の様になります。

$ git checkout -b foo-bar-v1 origin/v1

3. master にマージされたコミットのハッシュを取得

コンソールで以下のコマンドを実行し、 master にマージされたブランチから対象コミットのハッシュを取得します。

$ git log --oneline $TOPICBRANCHNAME

$TOPICBRANCHNAME にはプルリクエスト編の 2. で指定したブランチ名を入れてください。今回の例ではブランチ名を foo-bar としていたため以下の様になります。

$ git log --oneline foo-bar

コマンドを実行すると以下のようにコミットログが出力されます。

a5e8203 Use os.Getwd instead of filepath.Abs
2e47e58 Delete a debug print
f54c587 Smart package name for gen_controller

先頭カラム (a5e8203 の部分) がコミットハッシュなのでこれを控えておきます。

4. master にマージされたコミットをチェリーピック

コンソールで以下のコマンドを実行し、 3. で取得したコミットをチェリーピックします。

$ git cherry-pick $COMMITHASH

$COMMITHASH には 3. で取得したコミットハッシュを入れてください。コミットが複数ある場合はチェリーピックもその回数行います。

5. make できることを確認

コンソールで以下のコマンドを実行します。

$ make

これにはプログラムのビルドやテストコードの実行が含まれています。何らかのエラーが発生した場合はコードを修正しそれらを解決します。

6. リモートリポジトリにプッシュ

コンソールで以下のコマンドを実行します。

$ git push -u mine $BRANCHNAME

$BRANCHNAME には 2. で指定したブランチ名を入れてください。今回の例ではブランチ名を foo-bar-v1 としていたため以下の様になります。

$ git push -u mine foo-bar-v1

7. GitHub でプルリクエストを作成

プルリクエスト編の「 7. GitHub でプルリクエストを作成」を参考にプルリクエストを作成します。

これで完了です。じきにプルリクエストがマージされるでしょう。 v1 ブランチはセマンティックバージョニングされており、数ヶ月毎に新しいマイナーバージョンがリリースされています。そのルールに従って、今回の修正も次のマイナーバージョンに含まれることになるでしょう。

goa へのプルリクエストの送り方 (プルリクエスト編)

goa へのプルリクエストの送り方 (プルリクエスト編) です。本記事の内容を実施する前に準備編を済ませておいてください。

1. リポジトリに移動

コンソールで以下のコマンドを実行します。

$ cd $GOPATH/src/github.com/goadesign/goa

2. master から新しいブランチをチェックアウト

コンソールで以下のコマンドを実行します。

$ git fetch
$ git checkout -b $BRANCHNAME origin/master

$BRANCHNAME には任意のブランチ名を入れてください。例えばブランチ名を foo-bar とする場合は以下の様になります。

$ git checkout -b foo-bar origin/master

3. ソースコードやテストコードを追加・修正しコミット

コードが書けたら、コンソールで以下のコマンドを実行し、コミットします。

$ git add .
$ git commit

もちろん複数回コミットしても構いません。

4. make できることを確認

コンソールで以下のコマンドを実行します。

$ make

これにはプログラムのビルドやテストコードの実行が含まれています。何らかのエラーが発生した場合はコードを修正しそれらを解決します。

5. 最新の master にリベース

コンソールで以下のコマンドを実行します。

$ git fetch
$ git rebase origin/master

6. リモートリポジトリにプッシュ

コンソールで以下のコマンドを実行します。

$ git push -u mine $BRANCHNAME

$BRANCHNAME には 2. で指定したブランチ名を入れてください。今回の例ではブランチ名を foo-bar としていたため以下の様になります。

$ git push -u mine foo-bar

7. GitHub でプルリクエストを作成

  1. https://github.com/goadesign/goa を開きます。
  2. Branch メニューの右にある New pull request をクリックします。

    f:id:tchssk:20170622142812p:plain

  3. Compare ページで compare across forks をクリックします。

    f:id:tchssk:20170622142834p:plain

  4. base fork が goadesign/goa になっていることを確認します。 base branch で master を選択します。

    f:id:tchssk:20170622142850p:plain

  5. head fork であなたがフォークしたリポジトリを、 compare branch で 6 でプッシュしたブランチを選択します。今回の例では head fork が tchssk/goa 、 compare branch が foo-bar になります。

    f:id:tchssk:20170622142910p:plain

  6. Title と Description を英語で入力します。

    f:id:tchssk:20170622142925p:plain

  7. Create pull request ボタンをクリックします。

    f:id:tchssk:20170622142949p:plain

参考

Creating a pull request from a fork - User Documentation

以上になります。あとはプルリクエストに対してレビューコメントがつくと思うので、議論しながらコードをブラッシュアップしていきましょう。すべて OK だと認めてもらえたらマージしてもらえるはずです!

goa へのプルリクエストの送り方 (準備編)

goa へのプルリクエストの送り方 (準備編) です。本記事の内容は、プルリクエストを送るための準備として最初に一回だけ行う必要があります。

1. GitHub で goa をフォーク

  1. https://github.com/goadesign/goa を開きます。
  2. ページの右上にある Fork をクリックします。

    f:id:tchssk:20170620120037j:plain

参考

Fork A Repo - User Documentation

2. goa リポジトリをクローン

コンソールで以下のコマンドを実行します。

$ go get -u github.com/goadesign/goa

3. リポジトリに移動

コンソールで以下のコマンドを実行します。

$ cd $GOPATH/src/github.com/goadesign/goa

4. フォークしたリポジトリをリモートとして追加

コンソールで以下のコマンドを実行します。

$ git remote add mine git@github.com:$USERNAME/goa.git

$USERNAME には GitHub 上でのあなたのユーザ名を入れて下さい。例えば筆者のユーザ名は tchssk なので以下の様になります。

$ git remote add mine git@github.com:tchssk/goa.git

これで準備は完了です!

goa へのプルリクエストの送り方

goa へのプルリクエストの送り方について 3 回に分けて解説する連載記事です。これを見れば誰でもコントリビュートできるようになるはずです!

目次

  1. goa へのプルリクエストの送り方 (準備編)
  2. goa へのプルリクエストの送り方 (プルリクエスト編)
  3. goa へのプルリクエストの送り方 (バックポート編)

goa勉強会 in 六本木一丁目で発表してきた

発表してきました。

connpass.com

国内の goa の勉強会としては golang: goa勉強会に次いで 2 回目になるかと思います。当日カミングアウトしましたが私はまだ goa の本番運用をしたことがないので、実際にサービス運用している視点での話がたくさん聞けてよかったです。早く本番デビューしなければ…。

goa の改善と改良

The improvement and enhancement of goa

主催の @deadcheatgreat さん、そして会場提供して下さった istyle さんありがとうございました。参加した皆さまお疲れさまでした。

goa 公式サイトを日本語翻訳した & goa の開発メンバーになった

goa 公式サイトを日本語翻訳した

昨年始めた goa 公式サイトの日本語翻訳が終わりました。

goa.design

日本の開発者にあまり使われてないのは日本語のリソースが少ないからでは、ということで昨年末に ikawaha さんとプロジェクトを開始したのですが、結構分量があったので数ヶ月かかってしまいました。細かい修正は残っているものの、一旦は年度内に完了できてよかったです。 Go で Web API の開発を行う際には是非 goa を候補に加えてみて下さい。

goa の開発メンバーになった

2 月末に goa の開発メンバーになりました。

先日アナウンスされた v1.2.0 のポストでも大きく取り上げてもらいました。

goa.design

以下、引用です。

Taichi was one of the first contributors to goa, his contributions are always of the highest quality. Apart from fixing many bugs and contributing actively to goa v2, Taichi also helped translate the entire https://goa.design/ja website into Japanese.

日本語だと以下のような感じでしょうか。

Taichi は goa の最初のコントリビュータの一人で、彼のコントリビューションはいつも最高のクオリティです。 Taichi は多くのバグ修正や goa v2 にアクティブに貢献している他、 https://goa.design/ja の Web サイト全体を日本語に翻訳するのにも尽力しました。

惜しみない賞賛です。少し照れます😅

2016 年の春くらいから goa を使い始めて、次第にプルリクエストを送るようになりました。 GitHub や Slack でやり取りをするうちに誘われて v2 の開発にも参加するようになり、今回とうとう goa の開発メンバーに加わりました。一応 push 権限を与えられているのでコミッタと呼べそうな気もしますが、今まで通り一人のユーザ、そしてコントリビュータとして goa の開発に携わっていければと思います。

おまけ

翻訳プロジェクトの打ち上げ。最高の肉だった。

f:id:tchssk:20170418161333j:plain