githubにgoのライブラリを公開する手順メモ

## 概要

ffprobeコマンドのgolangバインドをライブラリとして公開してみる

動画であれば対象ファイルの動画ストリーム情報や
オーディオストリーム情報を表示してくれるffprobeコマンドを
golangの構造体にバインドしてみる。

リポジトリはライブラリとして公開したいので下記を表示するようにしたい。

- buildに成功する
- カバレッジ
- godocへのリンク
- ライセンス

__公開先はgithubを前提に書いています__

## 結果

こんな感じになりました

![スクリーンショット 2017-11-09 23.19.56.png](https://qiita-image-store.s3.amazonaws.com/0/47896/7c775ca7-7971-2ea9-e66b-99e7e1f9be9d.png)

リポジトリはこちら
https://github.com/smith-30/go-ffprobe

## 手順

### リポジトリを作る

LICENSEもこのタイミングで作ってしまいましょう。

![スクリーンショット 2017-11-11 01.12.22.png](https://qiita-image-store.s3.amazonaws.com/0/47896/f509601f-af18-715a-8e36-e28bd512f368.png)

### travisに登録

CIはtravisを使っていきます

__無料__

https://travis-ci.org より
ダッシュボードから作成リポジトリをOnにする

### coverallsに登録

__無料__

https://coveralls.io より
ダッシュボードから作成リポジトリをOnにする

### .travis.ymlの設定

```yml:.travis.yml
language: go
sudo: false
go:
  - 1.8
  - 1.9
  - tip

matrix:
  allow_failures:
    - go: tip

install:
  - go get golang.org/x/tools/cmd/cover
  - go get github.com/modocache/gover
  - go get github.com/mattn/goveralls
  - go get honnef.co/go/tools/cmd/gosimple
  - go get honnef.co/go/tools/cmd/unused
  - go get honnef.co/go/tools/cmd/staticcheck
  - go get -v -t ./...

script:
  - go vet $(go list ./... | grep -v /vendor/)
  - unused $(go list ./... | grep -v /vendor/)
  - gosimple $(go list ./... | grep -v /vendor/)
  - staticcheck $(go list ./... | grep -v /vendor/)
  - go test -cover -coverpkg github.com/smith-30/go-ffprobe -coverprofile go-ffprobe.coverprofile

after_script:
  - gover
  - goveralls -coverprofile=gover.coverprofile -repotoken $COVERALLS_TOKEN
```

一応、ソースコードの品質も担保したいのでテスト以外に

- vet
- gosimple
- unused
- staticcheck

を使って静的解析しています。

### coverallのtoken設定

`.travis.yml` に `$COVERALLS_TOKEN`の記述がありますがこの設定をしていきます

```bash
$ sudo gem install travis

# プロジェクトルートで打つこと、そうするとtravis設定ファイルに書き込まれる
$ travis encrypt COVERALLS_TOKEN=<your-token> --add
```

`<your-token>` はcoverallsで有効にしているリポジトリのページから取ってきてください。

### travisを回してみる

CI連携ができるか下記ファイルをリモートリポジトリにpush

```go:ffprobe.go
package go_ffprobe

func GetFileInfo(fileName string) string {
	return fileName
}
```

```go:ffprobe_test.go
package go_ffprobe_test

import (
	"testing"

	ffprobe "github.com/smith-30/go-ffprobe"
)

func TestGetFileInfo(t *testing.T) {
	exp := "test"
	act := ffprobe.GetFileInfo(exp)

	if exp != act {
		t.Errorf("failed.")
	}
}
```

travisが動けば成功

### カバレッジやbuild成功のバッチを出す

README.mdの先頭を編集してpush

```
[![Build Status](https://secure.travis-ci.org/smith-30/go-ffprobe.png?branch=master)](http://travis-ci.org/smith-30/go-ffprobe)
[![Coverage Status](https://coveralls.io/repos/smith-30/go-ffprobe/badge.svg?branch=master)](https://coveralls.io/r/smith-30/go-ffprobe?branch=master)
[![GoDoc](https://godoc.org/github.com/smith-30/go-ffprobe?status.svg)](https://godoc.org/github.com/smith-30/go-ffprobe)
[![license](https://img.shields.io/badge/license-MIT-4183c4.svg)](https://github.com/smith-30/go-ffprobe/blob/master/LICENSE)
```

__smith-30/go-ffprobe__ は適宜変えてください

カバレッジやバッチが出てれば成功です。

### まとめ

サクッとバッチ付きのライブラリ公開できるので
まだやったことがない方は試してみてはいかがでしょうか。

リポジトリのCI連携をやったことがない人にもオススメです。
pushしたら勝手にテスト回ったり静的解析やってくれるのは幸せですね。しかも無料。ありがたい。

goverallsやgoの静的解析ツール作られた方にはただただ感謝です。
json <-> go structはこのサービス使いました。
jsonから、goのstructを表示してくれます
https://mholt.github.io/json-to-go/

今年も残りわずかですが引き続きよいgo lifeを楽しんでいきましょう。