Rust CI/CD: CircleCI VS Travis CI
#アドベントカレンダー
Misoca+弥生 Advent Calendar 2018 4日目の記事です
こんにちはmizukmb.icon*3
mizukmb.icon mizukmbといいます
↑のリンクに自己紹介書いてます
Misoca.icon Misocaのプログラマです
趣味で作っている Rust 製の CLI アプリで CI/CD するためにやったことについて書く。
Rust 製 CLI アプリ esa-nippou
GitHub.icon mizukmb/esa-nippou という Rust.icon Rust 製のCLIを作ってる。これは、特定の esa team 内でその日に投稿した記事 (WIP含む) の一覧を Markdown 形式で標準出力してくれる CLI アプリ。
その日と書いたけどオプションで日付は指定できる
https://gyazo.com/2a9eb7692060c613157500a92e2d6083
こんな感じに出力してくれるので、あとはこれを今日の日報にコピペすれば今日書いた記事を残せる
CircleCI と Travis CI
CircleCI.icon CircleCI: https://circleci.com/
Travis CI.icon Travis CI: https://travis-ci.com/
おなじみ SaaS の CI/CD サービス
Rust 製 CLI アプリの CI/CD で以下のことをしたい
自動テストしたい
cargo test --all
master ブランチと PR 毎に
よくある感じ
自動リリースしたい
git tag で設定したタグを push したら自動で cargo build --target foo --release して releases page に置いてほしい
macOS 版のみビルド&リリースしたい
けどクロスコンパイルも後々やりたいのでその辺も考慮しつつ
最低限この2つをやりたい。 cache とか lint は今は考えない
CircleCI の場合
Github.icon https://github.com/mizukmb/esa-nippou/pull/18 で試した
自動テストしたい
簡単にできた
code:.circle/config.yml
version: 2
jobs:
build:
docker:
- image: circleci/rust
steps:
- checkout
- run:
name: Test
command: cargo test
Github.icon https://github.com/mizukmb/esa-nippou/blob/14cb2071bb2c539bf16414f4de9e68f021265f30/.circleci/config.yml
config.ymlは雰囲気で書いてる。mizukmb.icon
circleci/rust は公式が提供している Docker イメージを利用している。
https://hub.docker.com/r/circleci/rust/
自動リリースしたい
やれなくもないが、非常に面倒で config.yml も複雑になる
なぜかというと、macOS 向けのバイナリを Linux でクロスコンパイルするためにはリンカが必要で、それを用意するのに XCode をダウンロードしないといけなくて、それをダウンロードするために AppleID でログインする必要があって、自動化できない
ツールチェインを用意する GitHub.icon tpoechtrager/osxcross があるが、README に XCode の用意が必要と書いてある
CIrcleCI は最近 macOS 上でビルドしてくれるプランを発表したので、それ使えば macOS 用のバイナリは作れると思うが
https://gyazo.com/2d4475e5f17b2e06818fa2ebf052fbac
https://circleci.jp/pricing/#build-os-x
💰が…
Travis CI の場合
GitHub.icon https://github.com/mizukmb/esa-nippou/pull/19 と GitHub.icon https://github.com/mizukmb/esa-nippou/commit/05285a1fb44e34744bfa915f428e16e25b47d47b で導入した
自動テストしたい
簡単
code:.travis.yml
language: rust
os: osx
rust: stable
env: TARGET=x86_64-apple-darwin
cache: cargo # これ書くだけで dependencies の cache もしてくれる
script:
- cargo test --all
Github.icon https://github.com/mizukmb/esa-nippou/blob/14cb2071bb2c539bf16414f4de9e68f021265f30/.travis.yml#L1-L8
CircleCI と同じく Travis CI も Rust は公式でサポートしてる
https://docs.travis-ci.com/user/languages/rust/
公式docが充実してるmizukmb.icon
自動リリースしたい
これも簡単
os: osx と OS を指定すれば、macOS で動かすことができる。クロスコンパイルではないので、リンカの用意も不要
最高mizukmb.icon*2
code:.travis.yml
before_deploy:
- cargo build --target $TARGET --release
- mkdir "esa-nippou_${TRAVIS_TAG}_${TARGET}"
- cp target/$TARGET/release/esa-nippou LICENSE README.md "esa-nippou_${TRAVIS_TAG}_${TARGET}"
- zip "esa-nippou_${TRAVIS_TAG}_${TARGET}.zip" -r "esa-nippou_${TRAVIS_TAG}_${TARGET}"
deploy:
provider: releases
api_key: $GITHUB_TOKEN
file: esa-nippou_${TRAVIS_TAG}_${TARGET}.zip
skip_cleanup: true
on:
repo: mizukmb/esa-nippou
tags: true
GitHub.icon https://github.com/mizukmb/esa-nippou/blob/14cb2071bb2c539bf16414f4de9e68f021265f30/.travis.yml#L10-L23
before_deploy や deploy の書き方は Travis CI で Linux (x86_64, i686, aarch64) 向け(とついでに macOS 向け)に Rust で書いたツールのバイナリをリリースする や GitHub Releases Uploading (公式doc) を参考にしている
で、これで git tag でタグ作って push したら勝手にジョブが起動して cargo build --release で macOS 向けのバイナリをビルドして zip に固めてリリースに含めるまでを自動でやってくれるようになった
https://gyazo.com/7c646d5a51c753118ca82fc0b55ff77a
https://travis-ci.com/mizukmb/esa-nippou/builds/93385452
結論:両方試して Travis CI の方が楽だなーって思いました。特にリリースは簡単
楽というか Travis CI は公式の機能だけで自動リリースの設定ができた
Travis CI は matrix を使うと複数環境を並列で実行できるので、 Lunix 向けと macOS 向けのバイナリを作ってリリースする、ということも簡単にできる
非常に便利mizukmb.icon*2