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

hatappi.hateblo.jp

前回の記事でlaher/goxcを使ってGoをクロスコンパイルしてGithubReleasesで各プラットフォームにむけてのバイナリを配布する仕組みを作成した

ただこれを毎回のリリースでやるのは面倒なのでCIでデプロイすることにしたのが今回

CIは普段はCircleCIを使うことが多いがOSSとかみるとTravis CI使っていることが多いので今回はTravis CI使ってみた

Travis CIだとDeploy方法がいくつか用意されていてS3やらHerokuなどが自分でスクリプトをかかなくてもyaml形式で記載するTravis CIの設定ファイルに記載するだけで出来る
詳しくはこちら

このdeploymentの機能は今回の目的でもあるGitHub Releasesにリリースする仕組みも備わっているが、今回はgoxcを使ってアップロードまでやるのでTravis CIではScriptを呼び出すだけにする
デプロイ用のスクリプトに関しては下記のようなものを用意しました
goxcに指定しているオプションなどは前回の記事を参考にしてください

#!/bin/sh -ex
VERSION=`echo $TRAVIS_TAG | sed -e "s/v//g"`

echo "*** $VERSION deploy start ***"

goxc \
  -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" \
  -pv=$VERSION \
    publish-github \
      -owner=hatappi \
      -repository=packer-provisioner-mitamae \
      -apikey=$GITHUB_TOKEN \
      -include="*"

echo "*** $VERSION deploy end ***"

今回はgit tagをうったのをトリガーにデプロイをします
Travis CIではTRAVIS_TAGという環境変数にgit tagが入るのでそれを使用します
後はGithub Releasesにuploadする時にAPIをたたくのでTokenが必要です

Tokenは直で書いてしまうと外に出てしまうので、Travis CIで環境変数として定義します
設定自体は https://travis-ci.org/[githubのowner or organaizer]/[githubリポジトリ]/settingsの下記から設定することが出来ます

f:id:hatappi1225:20170615132105p:plain

ここで注意しないといけいないのが、Travis CIで流れるログは第三者からも見られるので今回のトークンのように見られてはいけないような情報は設定時にDisplay value in build logがOFFになっていることを確認します
これを設定しておけばログ上では下記のように[secure]と表示されます

f:id:hatappi1225:20170615132435p:plain

後はTravis CIの設定ファイルを作成します

language: go
install:
  - make dependency
deploy:
  provider: script
  script: sh script/travisci/deploy.sh
  skip_cleanup: true
  on:
    tags: true
    all_branches: true

基本的にはScript Deployのdocを参考にすれば出来ます

on:
    tags: true
    all_branches: true

これを追記することでタグをうった時だけデプロイ処理が走るようになります