Open4

rust製マルチプラットフォームアプリのbundleをgithub actionsで行う

yunayuna

windows(wixを使ってmsiをbundle)、macos(dmg)、debian系(deb)、RHEL系(RPM)のbundleを、github actions workflowで行うためのメモ

前提条件

各環境へのインストーラを作るbundlerは、既にプログラムとして実装されているものとする。

github上では、
・適切なosとマシンCPU(32GB/64GB、amd/arm など) の選択
・事前に必要なツールなどの環境設定を行う
・bundleプログラムを呼び出す

を行う。

参考サイト
https://techblog.paild.co.jp/entry/2023/04/10/170218

yunayuna

基礎知識 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

yunayuna

cacheについて

2023/4/14現在、github actionsのcacheは10Gまで有効で、それを超えると古いものから削除されるらしい。
rustのbuildでは、毎回新規で処理を行うと、モジュールのインストールで大量のdownload/buildが走るので、
これを緩和するためにキャッシュを使う。

https://github.com/actions/cache/blob/81b728193625a15a55fcce4c6eb6187358533785/examples.md#rust---cargo

いい感じに複雑なキャッシュを制御できるactionがこちら。
https://github.com/Swatinem/rust-cache

特に細かい設定不要であれば1行で設定可能。
- uses: Swatinem/rust-cache@v2

yunayuna

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'