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 のアプリケーションについても、このブログに適宜投稿していきたい。