Rust CI/CD: CircleCI VS Travis CI
こんにちはmizukmb.icon*3
↑のリンクに自己紹介書いてます
趣味で作っている 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
こんな感じに出力してくれるので、あとはこれを今日の日報にコピペすれば今日書いた記事を残せる
Rust 製 CLI アプリの CI/CD で以下のことをしたい 自動テストしたい
cargo test --all
master ブランチと PR 毎に
よくある感じ
自動リリースしたい
git tag で設定したタグを push したら自動で cargo build --target foo --release して releases page に置いてほしい
けどクロスコンパイルも後々やりたいのでその辺も考慮しつつ
最低限この2つをやりたい。 cache とか lint は今は考えない
自動テストしたい
簡単にできた
code:.circle/config.yml
version: 2
jobs:
build:
docker:
- image: circleci/rust
steps:
- checkout
- run:
name: Test
command: cargo test
config.ymlは雰囲気で書いてる。mizukmb.icon
circleci/rust は公式が提供している Docker イメージを利用している。 自動リリースしたい
やれなくもないが、非常に面倒で config.yml も複雑になる
なぜかというと、macOS 向けのバイナリを Linux でクロスコンパイルするためにはリンカが必要で、それを用意するのに XCode をダウンロードしないといけなくて、それをダウンロードするために AppleID でログインする必要があって、自動化できない CIrcleCI は最近 macOS 上でビルドしてくれるプランを発表したので、それ使えば macOS 用のバイナリは作れると思うが
https://gyazo.com/2d4475e5f17b2e06818fa2ebf052fbac
💰が…
自動テストしたい
簡単
code:.travis.yml
language: rust
os: osx
rust: stable
env: TARGET=x86_64-apple-darwin
cache: cargo # これ書くだけで dependencies の cache もしてくれる
script:
- cargo test --all
CircleCI と同じく Travis CI も 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
で、これで git tag でタグ作って push したら勝手にジョブが起動して cargo build --release で macOS 向けのバイナリをビルドして zip に固めてリリースに含めるまでを自動でやってくれるようになった
https://gyazo.com/7c646d5a51c753118ca82fc0b55ff77a
Travis CI は matrix を使うと複数環境を並列で実行できるので、 Lunix 向けと macOS 向けのバイナリを作ってリリースする、ということも簡単にできる
非常に便利mizukmb.icon*2