表題の通り.いくらかポイントがあったのでメモとして記す.
基本的にこの記事の内容を真似した.
あらかじめ,CircleCIの側の設定でGITHUB_TOKEN
という環境変数を登録しておく.なおGitHubのPersonal access tokenにはrepoのpermissionを付与しておく.
とは言えこれでは動かない.理由はghr (ghrについてはこちら: 高速に自作パッケージをGithubにリリースするghrというツールをつくった | SOTA) がcontextに依存しているからで,contextはgo 1.7以降でないと利用できない.しかしながらCircleCIのgolang環境は1.6系が使える内の最新なので *1 このままではghrをgo getすることが出来ない.
というわけでCircleCI上でgo 1.7を使うようにしましょう,ということでそういうconfigをcircle.ymlに書く.基本的にこのgistの真似.
しかしこのgistにはタイポがあってそのままでは動かない.ので以下のようにする.
machine: environment: GODIST: "go1.7.3.linux-amd64.tar.gz" post: - mkdir -p downloads - test -e downloads/$GODIST || curl -o downloads/$GODIST https://storage.googleapis.com/golang/$GODIST - sudo rm -rf /usr/local/go - sudo tar -C /usr/local -xzf downloads/$GODIST
こうしておくとgo 1.7.3がビルド時に利用されるようになる.
そして以下のようなdeploymentセクションを書く.オリジナルの記事ではmasterにpushする度にGitHub Releasesにアップロードされてしまうので,git tagがpushされた時にだけリリース処理が走るようにする (deployment.release.tag
の部分でそうしている).
deployment: release: tag: /[0-9]+\.[0-9]+\.[0-9]+/ commands: - go get github.com/tcnksm/ghr - make clean - make VERSION=`git describe --tags | perl -anlE 'm/\A([^\-]+)-?/; print $1'` - rm bin/.gitkeep - ghr -t $GITHUB_TOKEN -u $CIRCLE_PROJECT_USERNAME -r $CIRCLE_PROJECT_REPONAME --replace `git describe --tags | perl -anlE 'm/\A([^\-]+)-?/; print $1'` bin/
その他の細々した差としては,ghrのオプション部分で--replace `git describe --tags`
として渡されている部分を--replace `git describe --tags | perl -anlE 'm/\A([^\-]+)-?/; print $1'`
というperlのワンライナーを噛ませた形に書き換えている.git describe --tags
を実行すると{タグ名}-{ハッシュ}
という結果が出てくる場合があるので,タグ名以降の内容を落とすためにそうしている.
あとは.gitkeep
がアップロード元のディレクトリに含まれているとghrのアップロード時に失敗する (そんなものアップロードするな,みたいなエラーが出る) のであらかじめ消しておくという感じ.
なおビルド自体はmakeコマンドを叩くだけでglide installからクロスコンパイルまでやるという感じにしている (Makefileはこんな感じ
https://github.com/moznion/linenotcat/blob/4349058d9557d49e1f2fc9a23ebeb79e2279f81d/Makefile).
最終的なcircle.ymlとしては以下のような感じ.
machine: environment: GODIST: "go1.7.3.linux-amd64.tar.gz" post: - mkdir -p downloads - test -e downloads/$GODIST || curl -o downloads/$GODIST https://storage.googleapis.com/golang/$GODIST - sudo rm -rf /usr/local/go - sudo tar -C /usr/local -xzf downloads/$GODIST deployment: release: tag: /[0-9]+\.[0-9]+\.[0-9]+/ commands: - go get github.com/tcnksm/ghr - make clean - make VERSION=`git describe --tags | perl -anlE 'm/\A([^\-]+)-?/; print $1'` - rm bin/.gitkeep - ghr -t $GITHUB_TOKEN -u $CIRCLE_PROJECT_USERNAME -r $CIRCLE_PROJECT_REPONAME --replace `git describe --tags | perl -anlE 'm/\A([^\-]+)-?/; print $1'` bin/
これでtagをpushしたら自動的にGitHub Releasesにビルド成果物がリリースされるようになった.めでたしめでたし.それはそうとghr便利ですね.
[追記]
@moznion すいません.使われるのはバイナリかなと思い標準のcontextにしちゃいました
— Taichi Nakashima (@deeeet) 2016年11月16日
確かに!!!! ghrのバイナリダウンロードしてくれば良いですね.