Rust 製アプリを GitHub Actions 上で本番用にビルド (シングルバイナリ)
投稿: 2022年8月12日
FX 取引をするボットを Rust で書いて、1 年くらい動かしている。
もともと興味があったので勉強がてら Rust を使ってみたのだが、Rust にして良かったと思っている。よく言われる話だが、Rust は速く、安全で、それでいて書き心地が良いので、お気に入りのプログラミング言語になった。
運用面では、シングルバイナリを吐き出せるので、本番サーバーにはファイルを置くだけで、何もインストールする必要がないのも嬉しい。 AWS で t2.micro
な EC2 インスタンスで動かし続けているが、いままで全くトラブルになったことが無い。ちなみに EC2 でやっているのは安いからで、ECS なども検討したが、やはり EC2 が最安だった。
デプロイは GitHub Actions 上で行っている。やっていることは、素の Ubuntu で動くシングルバイナリを生成して、 Ansible で配置するだけ。かなり前に作ったもので、 toolchain やキャッシュの設定を見直したところ、設定ファイルは簡潔になり、ビルド時間も 10 分から 3 分に短縮された。
自分の中のテンプレとして残しておく。
name: deploy
on:
push:
branches:
- release
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v3
with:
key: v1-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}
path: |
target
~/.cargo
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
target: x86_64-unknown-linux-musl
- name: Install native dependencies to compile the app for musl
run: |
sudo apt-get -y update
sudo apt-get -y install libdbus-1-dev pkg-config libssl-dev musl musl-dev musl-tools
- name: Build app
run: cargo build --release --target x86_64-unknown-linux-musl
- name: Deploy
run: ansible-playbook ansible/deploy.yml --tags app
少しだけ解説。
- キャッシュに関しては
Swatinem/rust-cache@v1
を使っていたが、なぜかキャッシュが効いていなかった- 単純に
target
と~/.cargo
をキャッシュするようにしたら良くなった
- 単純に
- musl-tools を入れないと
ring
のビルドで失敗する- 作っているものによっては、 apt-get の部分は不要かもしれない
- 最後の Ansible のところは、構成に合わせて
rsync
なりdocker build
なりに変更すれば良い
ちなみに Ansible の Playbook では下記を行っている。
- 生成したシングルバイナリを本番サーバーの
/usr/local/bin
に配置 - 環境変数を設定
systemd
サービスの登録と起動
Ansible は GitHub Actions で最初からインストールされていて使いやすいのと、構成管理とデプロイを同時にできるのが気に入っている。
Rust のアプリケーションについても、このブログに適宜投稿していきたい。