Rust 製アプリを GitHub Actions 上で本番用にビルド (シングルバイナリ)

Rust 製のアプリのビルド設定を見直した

FX 取引をするボットを Rust で書いて、1 年くらい動かしている。

もともと興味があったので勉強がてら Rust を使ってみたのだが、Rust にして良かったと思っている。よく言われる話だが、Rust は速く、安全で、それでいて書き心地が良いので、お気に入りのプログラミング言語になった。

運用面では、シングルバイナリを吐き出せるので、本番サーバーにはファイルを置くだけで、何もインストールする必要がないのも嬉しい。 AWS で t2.micro な EC2 インスタンスで動かし続けているが、いままで全くトラブルになったことが無い。ちなみに EC2 でやっているのは安いからで、ECS なども検討したが、やはり EC2 が最安だった。

デプロイは GitHub Actions 上で行っている。やっていることは、素の Ubuntu で動くシングルバイナリを生成して、 Ansible で配置するだけ。かなり前に作ったもので、 toolchain やキャッシュの設定を見直したところ、設定ファイルは簡潔になり、ビルド時間も 10 分から 3 分に短縮された。

自分の中のテンプレとして残しておく。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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 のアプリケーションについても、このブログに適宜投稿していきたい。

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy