GoをクロスコンパイルしてGithub Releasesで配布する

hatappi.hateblo.jp

2日前にGoを練習するためのMItamaeを使うPackerプラグインをリリースした
ただこの時のPluginのインストール方法としてはgo getしかなかった

もちろんそれでも良いが折角なのでGithub Releasesからバイナリで配布したい
例: https://github.com/itamae-kitchen/mitamae/releases

実現方法

今回はPackerのプラグインのところでも紹介されていた下記のクロスコンパイルを行ってくれるものを使用した

github.com

Go1.5でクロスコンパイルが出来るので、このツールは使用しなくても良いとも言えるが今回は

  • ロスコンパイル
  • zipやらtar.gzなどに圧縮
  • github releasesにアップロード

をしたかったので個々でスクリプトを書く手間よりもこのツールはすべてを満たしてくれるので使用した

使い方

goxcではbuildしたり圧縮したりバイナリを削除したりといったステップをタスクとして定義している
タスク一覧に関しては下記のコマンドから可能

$ goxc -help tasks

まず今回の完成系から示して順番に解説をしていきます

goxc -pv=0.0.1 \
         -arch="386 amd64" \
         -os="linux darwin" \
         -+tasks=clean,compile,archive \
         -o="{{.Dest}}{{.PS}}{{.Version}}{{.PS}}packer-provisioner-mitamae-{{.Os}}-{{.Arch}}{{.Ext}}" \
         -resources-exclude=".go,LICENSE,README.md" \
         publish-github \
           -owner=hatappi \
           -repository=packer-provisioner-mitamae \
           -apikey=xxxxxxxxxxxxxx \
           -include="*"

順番にオプションを解説していきます

-pv はPackageVersionを指定するものでGIthub Releases上のタグになります

f:id:hatappi1225:20170612210607p:plain

-archと-osでクロスコンパイル対象を指定していきます

-+tasks=clean,compile,archiveでは指定されたタスク(今回だとpublish-githubというgithub releasesにアップロードする処理タスク)の前に行うタスクを記載します
これが指定されたタスクの後にタスクを定義する場合には-tasks+==clean,compile,archiveとなります

-oでバイナリやzipやtar.gzなどのファイルを置き方を指定することが出来ます
今回 -o="{{.Dest}}{{.PS}}{{.Version}}{{.PS}}packer-provisioner-mitamae-{{.Os}}-{{.Arch}}{{.Ext}}" だと

.
└── 0.0.1
    ├── github.md
    ├── packer-provisioner-mitamae-darwin-386
    ├── packer-provisioner-mitamae-darwin-amd64
    ├── packer-provisioner-mitamae-linux-386
    ├── packer-provisioner-mitamae-linux-amd64
    ├── packer-provisioner-mitamae_0.0.1_darwin_386.zip
    ├── packer-provisioner-mitamae_0.0.1_darwin_amd64.zip
    ├── packer-provisioner-mitamae_0.0.1_linux_386.tar.gz
    └── packer-provisioner-mitamae_0.0.1_linux_amd64.tar.gz

のような構造になります

publish-github以降はgithubのデプロイの際にapiを使うのでapikeyを指定したり対象リポジトリを指定します
最後の-includeに関しては何をデプロイ対象とするかでデフォルトが.zip,.tar.gz,.debとなっておりバイナリが含まれないのでにしています

後はコマンドが実行すると下記のリンクのように各バイナリが配置されます

github.com

後はCIからこれを出来るようにするだけですが、それはまた今度