VagrantでZero to Production in Rust のCI環境をコード化する
やりたいこと
- 単体テストだけではなくDB接続を含んだ結合テストの環境をGitLab CIに組み込みたい
- 結合環境なのでコンテナ仮想化ではなく完全仮想化または準仮想化環境で行いたい(根拠が薄い)
- 環境の手動セットアップはダサい
やること
- 結合テスト環境用のVagrant導入済みマシンを構築
- Vagrantfileに環境をコード化
- GitLab Pipeline に
vagrant up
を組み込み、テストが通ることを確認する
用意したこと
- openSUSE Tumbleweed
sudo zypper in virtualbox vagrant
sudo usermod -aG vboxusers xxx
sudo usermod -aG libvirt xxx
必要なパッケージ類
- postgres (エンジン、クライアント)
- rust sdk、ランタイム
プロビジョン用コマンド
これが後述のVagrantfileで指定するtest_integration.sh
の中身になる。
#!/usr/bin/env sh
cd /vagrant/script
sudo zypper in -y postgresql git docker gcc libopenssl-1_1-devel
sudo usermod -aG docker vagrant
sudo systemctl enable --now docker
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source $HOME/.cargo/env
cargo install --version=0.5.7 sqlx-cli --no-default-features --features postgres
sh ./init_db.sh
cargo test
Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "opensuse/Leap-15.3.x86_64"
config.vm.provision :shell, path: "script/test_integration.sh"
config.vm.provider "virtualbox" do |v|
v.memory = 2048
v.cpus = 2
end
end
課題
環境のゼロから構築、大量のパッケージインストール、コードのビルドをするので、いろいろなリソースをバカ食いする。環境にやさしくない。