rust製マルチプラットフォームアプリのbundleをgithub actionsで行う
windows(wixを使ってmsiをbundle)、macos(dmg)、debian系(deb)、RHEL系(RPM)のbundleを、github actions workflowで行うためのメモ
前提条件
各環境へのインストーラを作るbundlerは、既にプログラムとして実装されているものとする。
github上では、
・適切なosとマシンCPU(32GB/64GB、amd/arm など) の選択
・事前に必要なツールなどの環境設定を行う
・bundleプログラムを呼び出す
を行う。
参考サイト
基礎知識 buildターゲットの記述(target triple ターゲット・トリプル)について
このようなフォーマットは、何を指しているか?
wasm32-unknown-unknown
Rustコンパイラによって定められたもので、ターゲット・トリプルは、
一般的に"アーキテクチャ" - "ベンダー" - "オペレーティングシステム"
の3つの要素
から構成される。
wasm32-unknown-unknown
は、
「wasm32」は32ビットのWebAssemblyアーキテクチャ
「unknown」は、ベンダーとオペレーティングシステムが不明であることを示す。
(WebAssemblyがオペレーティングシステムやベンダーに依存しない形式であるため)
ターゲット・トリプルに関するルールや慣習は、LLVMプロジェクトで開発されているものを元にしていて、RustはLLVMベースのコンパイラであるため、その慣習に従っている。
サンプル
Windows
x86_64-pc-windows-msvc: 64-bit Windows using the Microsoft Visual C++ toolchain.
i686-pc-windows-msvc: 32-bit Windows using the Microsoft Visual C++ toolchain.
x86_64-pc-windows-gnu: 64-bit Windows using the GNU toolchain (MinGW/MSYS).
i686-pc-windows-gnu: 32-bit Windows using the GNU toolchain (MinGW/MSYS).
aarch64-pc-windows-msvc: ARM64 Windows using the Microsoft Visual C++ toolchain.
Linux
x86_64-unknown-linux-gnu: 64-bit Linux on x86_64 architecture using the GNU toolchain.
i686-unknown-linux-gnu: 32-bit Linux on x86 architecture using the GNU toolchain.
aarch64-unknown-linux-gnu: 64-bit Linux on ARM64 architecture using the GNU toolchain.
arm-unknown-linux-gnueabihf: 32-bit Linux on ARM architecture (hard float) using the GNU toolchain.
arm-unknown-linux-gnueabi: 32-bit Linux on ARM architecture (soft float) using the GNU toolchain.
s390x-unknown-linux-gnu: 64-bit Linux on IBM Z/System z architecture using the GNU toolchain.
Mac (macOS/iOS)
x86_64-apple-darwin: 64-bit macOS on x86_64 architecture.
aarch64-apple-darwin: 64-bit macOS on ARM64 architecture (Apple Silicon).
i686-apple-darwin: 32-bit macOS on x86 architecture (legacy, not supported on recent macOS versions).
x86_64-apple-ios: 64-bit iOS on x86_64 architecture (simulator).
aarch64-apple-ios: 64-bit iOS on ARM64 architecture.
▼公式の記述
Compilation Optionsの --target triple
を参照。
<arch><sub>-<vendor>-<sys>-<abi>
https://doc.rust-lang.org/cargo/commands/cargo-build.html
cacheについて
2023/4/14現在、github actionsのcacheは10Gまで有効で、それを超えると古いものから削除されるらしい。
rustのbuildでは、毎回新規で処理を行うと、モジュールのインストールで大量のdownload/buildが走るので、
これを緩和するためにキャッシュを使う。
いい感じに複雑なキャッシュを制御できるactionがこちら。
特に細かい設定不要であれば1行で設定可能。
- uses: Swatinem/rust-cache@v2
github actionsの設定ファイル(yml)
windows-latest環境のrunコマンドでは、Powershellが走ってるっぽいので、Powershellのコマンドを書く。
複数OSでの実行例。OSのmatrix設定と、各OSの時で処理を分岐させる記述
・・・省略・・・
jobs:
build:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
name: Build on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
steps:
・・・省略・・・
- name: copy deb file
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
cp $GITHUB_WORKSPACE/target/release/bundle/deb/*.deb $GITHUB_WORKSPACE/target/release/upload/
- name: copy dmg file
if: ${{ matrix.os == 'macos-latest' }}
run: |
cp $GITHUB_WORKSPACE/target/release/bundle/dmg/*.dmg $GITHUB_WORKSPACE/target/release/upload/
- name: copy msi file
if: ${{ matrix.os == 'windows-latest' }}
run: |
Copy-Item "${env:GITHUB_WORKSPACE}\target\release\bundle\msi\*.msi" "${env:GITHUB_WORKSPACE}\target\release\upload"
s3 sync
昔から使ってたjakejarvis/s3-sync-action
が、どうやらubuntuしか対応していないようなので、
clowdhaus/aws-github-actions/s3_sync
を利用。
まず、clowdhaus/aws-github-actions/iam_access_credentials
を使って、
aws cliのためのcredentialsを作成してから、
clowdhaus/aws-github-actions/s3_sync
で同期の処理を行う。
- uses: clowdhaus/aws-github-actions/iam_access_credentials@main
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-2
- uses: clowdhaus/aws-github-actions/s3_sync@main
if: ${{ matrix.os == 'windows-latest' }}
with:
local-path: target\release\upload
bucket-name: 'xxxxxxxx'
path-prefix: 'self_update/test'