hisui 2025.3.3

Recording Composition Tool Hisui
name: CI

on:
  workflow_dispatch:
  push:
    branches:
      - "develop"
      - "feature/**"
      - "hotfix/**"
    paths-ignore:
      - "**.md"
  schedule:
    # UTC の 01:00 は JST だと 10:00 。
    # 1-5 で 月曜日から金曜日
    - cron: "0 1 * * 1-5"

env:
  RUST_BACKTRACE: 1
  CUDA_VERSION: 13.0.2

jobs:
  check:
    runs-on: ubuntu-24.04
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v5
      - run: rustup update stable
      - run: rustup default stable
      - name: Install packages to build external dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y meson ninja-build nasm yasm build-essential autoconf automake libtool pkg-config yasm cmake
      - name: Cache cargo
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry/
            ~/.cargo/git/
            target/

            # 以下のファイルのタイムスタンプが変わってしまうと build.rs が常に再実行されてしまうのでキャッシュする
            **/build.rs
            **/Cargo.toml
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-${{ github.job }}-${{ hashFiles('Cargo.lock') }}
          restore-keys: |
            # Cargo.toml と build.rs はキャッシュから復元するので、古いものを復元するのを避けるために候補キーに含める
            ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-${{ github.job }}-
            ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-
      - run: cargo check --workspace --exclude shiguredo_fdk_aac --exclude shiguredo_audio_toolbox --exclude shiguredo_video_toolbox
  clippy:
    runs-on: ubuntu-24.04
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v5
      - run: rustup update stable
      - run: rustup default stable
      - run: rustup component add clippy
      - name: Install packages to build external dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y meson ninja-build nasm yasm build-essential autoconf automake libtool pkg-config yasm cmake
      - name: Cache cargo
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry/
            ~/.cargo/git/
            target/

            # 以下のファイルのタイムスタンプが変わってしまうと build.rs が常に再実行されてしまうのでキャッシュする
            **/build.rs
            **/Cargo.toml
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-${{ github.job }}-${{ hashFiles('Cargo.lock') }}
          restore-keys: |
            # Cargo.toml と build.rs はキャッシュから復元するので、古いものを復元するのを避けるために候補キーに含める
            ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-${{ github.job }}-
            ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-
      - run: cargo clippy --workspace --exclude shiguredo_fdk_aac --exclude shiguredo_audio_toolbox --exclude shiguredo_video_toolbox -- --deny warnings

  test:
    runs-on: ubuntu-24.04
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v5
      - run: rustup update stable
      - run: rustup default stable
      - name: Install packages to build external dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y meson ninja-build nasm yasm build-essential autoconf automake libtool pkg-config yasm cmake
      - name: Cache cargo
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry/
            ~/.cargo/git/
            target/

            # 以下のファイルのタイムスタンプが変わってしまうと build.rs が常に再実行されてしまうのでキャッシュする
            **/build.rs
            **/Cargo.toml
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-${{ github.job }}-${{ hashFiles('Cargo.lock') }}
          restore-keys: |
            # Cargo.toml と build.rs はキャッシュから復元するので、古いものを復元するのを避けるために候補キーに含める
            ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-${{ github.job }}-
            ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-
      - run: cargo test --workspace --exclude shiguredo_fdk_aac --exclude shiguredo_openh264 --exclude shiguredo_audio_toolbox --exclude shiguredo_video_toolbox
  test-nvidia-video-codec:
    runs-on:
      group: Self
      labels: [self-hosted, linux, x64, NVIDIA-Video-Codec-SDK]
    timeout-minutes: 15
    steps:
      - uses: actions/checkout@v5
      - name: Install rustup
        run: |
          curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
      - name: Update PATH
        run: echo "PATH=$HOME/.cargo/bin:$PATH" >> $GITHUB_ENV
      - run: cargo check --no-default-features --features nvcodec -p hisui
      - run: cargo clippy --no-default-features --features nvcodec -p hisui -- --deny warnings
      - run: cargo test --no-default-features --features nvcodec -p hisui -- --test-threads=1

  test-apple-toolbox:
    runs-on:
      group: Self
      labels: [self-hosted, macOS, ARM64]
    timeout-minutes: 15
    steps:
      - uses: actions/checkout@v5
      - name: 🍺 Set up Homebrew
        uses: Homebrew/actions/setup-homebrew@master
      - name: Install rustup
        run: |
          curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
      - name: Update PATH
        run: echo "PATH=$HOME/.cargo/bin:$PATH" >> $GITHUB_ENV
      - name: Install packages to build external dependencies
        run: |
          brew update
          brew install meson ninja nasm yasm cmake automake autoconf libtool pkg-config
      - run: cargo check --no-default-features --workspace --exclude shiguredo_fdk_aac --exclude shiguredo_libvpx
      - run: cargo clippy --no-default-features --workspace --exclude shiguredo_fdk_aac --exclude shiguredo_libvpx -- --deny warnings
      - run: cargo test --no-default-features --workspace --exclude shiguredo_fdk_aac --exclude shiguredo_libvpx --exclude shiguredo_openh264

  test-fdk-aac:
    runs-on: ubuntu-24.04
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v5
      - run: rustup update stable
      - run: rustup default stable
      - name: Install packages to build external dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y meson ninja-build nasm yasm build-essential autoconf automake libtool pkg-config yasm cmake libfdk-aac-dev
      - name: Cache cargo
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry/
            ~/.cargo/git/
            target/

            # 以下のファイルのタイムスタンプが変わってしまうと build.rs が常に再実行されてしまうのでキャッシュする
            **/build.rs
            **/Cargo.toml
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-${{ github.job }}-${{ hashFiles('Cargo.lock') }}
          restore-keys: |
            # Cargo.toml と build.rs はキャッシュから復元するので、古いものを復元するのを避けるために候補キーに含める
            ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-${{ github.job }}-
            ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-
      - run: cargo test --package shiguredo_fdk_aac
      # shiguredo_fdk_aac はリリースビルドでだけセグフォすることがあったので、それもテストする
      # (最終的にはリリースバイナリを使った e2e で置き換えるべき)
      - run: cargo test --release --package shiguredo_fdk_aac
      - run: cargo test --no-default-features --features fdk-aac

      - run: cargo build --no-default-features --features fdk-aac
      - run: ldd target/debug/hisui
      - name: FDK-AAC が動的リンクされることを確認する
        run: ldd target/debug/hisui | grep fdk-aac

      - run: cargo build
      - run: ldd target/debug/hisui
      - name: FDK-AAC がリンクされないことを確認する
        run: if ldd target/debug/hisui | grep -q fdk-aac; then exit 1; else exit 0; fi

  test-openh264:
    runs-on: ubuntu-24.04
    timeout-minutes: 20
    env:
      OPENH264_VERSION: "2.6.0"
      OPENH264_PATH: ${{ github.workspace }}/libopenh264.so
    steps:
      - uses: actions/checkout@v5
      - run: rustup update stable
      - run: rustup default stable
      - name: Install packages to build external dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y meson ninja-build nasm yasm build-essential autoconf automake libtool pkg-config yasm cmake
      - name: Cache cargo
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry/
            ~/.cargo/git/
            target/

            # 以下のファイルのタイムスタンプが変わってしまうと build.rs が常に再実行されてしまうのでキャッシュする
            **/build.rs
            **/Cargo.toml
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-${{ github.job }}-${{ hashFiles('Cargo.lock') }}
          restore-keys: |
            # Cargo.toml と build.rs はキャッシュから復元するので、古いものを復元するのを避けるために候補キーに含める
            ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-${{ github.job }}-
            ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}-${{ hashFiles('**/build.rs') }}-
      - name: Download libopenh264 v${{ env.OPENH264_VERSION }}
        run: |
          curl -LO http://ciscobinary.openh264.org/libopenh264-${{ env.OPENH264_VERSION }}-linux64.8.so.bz2
          bzip2 -d libopenh264-${{ env.OPENH264_VERSION }}-linux64.8.so.bz2
          mv libopenh264-${{ env.OPENH264_VERSION }}-linux64.8.so ${{ env.OPENH264_PATH }}
      - run: cargo test --no-default-features -p hisui -p shiguredo_openh264

  ubuntu-binary:
    name: "Upload Binary for Ubuntu"
    needs: [test]
    strategy:
      matrix:
        platform:
          - name: ubuntu-24.04_x86_64
            runs-on: ubuntu-24.04
          - name: ubuntu-24.04_arm64
            runs-on: ubuntu-24.04-arm
          - name: ubuntu-22.04_x86_64
            runs-on: ubuntu-22.04
          - name: ubuntu-22.04_arm64
            runs-on: ubuntu-22.04-arm
    runs-on: ${{ matrix.platform.runs-on }}
    timeout-minutes: 20
    steps:
      - name: Checkout sources
        uses: actions/checkout@v5

      - name: Install packages to build external dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y meson ninja-build nasm yasm build-essential autoconf automake libtool pkg-config yasm cmake

      # CUDA のインストール (x86_64 のみ)
      - uses: shiguredo/github-actions/.github/actions/setup-cuda-toolkit@main
        if: contains(matrix.platform.name, 'x86_64')
        id: cuda
        with:
          cuda_version: ${{ env.CUDA_VERSION }}
          platform: ${{ matrix.platform.runs-on }}
      - run: rustup update stable
      - run: rustup default stable

      # x86_64 では nvcodec feature を有効化
      - name: Build with NVCODEC (x86_64)
        if: contains(matrix.platform.name, 'x86_64')
        run: cargo build --release --features nvcodec

      # ARM では通常ビルド
      - name: Build (ARM)
        if: contains(matrix.platform.name, 'arm64')
        run: cargo build --release

      - name: Get the version
        id: get_version
        run: |
          VERSION=$(cargo metadata --format-version 1 --no-deps | jq -r '.packages[] | select(.name == "hisui") | .version')
          echo "VERSION=$VERSION" >> $GITHUB_OUTPUT

      - run: |
          mkdir -p hisui-${{ steps.get_version.outputs.version }}_${{ matrix.platform.name }}
          cp target/release/hisui hisui-${{ steps.get_version.outputs.version }}_${{ matrix.platform.name }}/
          tar -czf hisui-${{ steps.get_version.outputs.version }}_${{ matrix.platform.name }}.tar.gz \
            hisui-${{ steps.get_version.outputs.version }}_${{ matrix.platform.name }}
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: hisui-binary-${{ matrix.platform.name }}
          path: hisui-${{ steps.get_version.outputs.version }}_${{ matrix.platform.name }}.tar.gz

  macos-binary:
    name: "Upload Binary for MacOS"
    needs: [test-apple-toolbox]
    strategy:
      matrix:
        platform:
          - name: macos-26_arm64
            runs-on: macos-26
          - name: macos-15_arm64
            runs-on: macos-15
          - name: macos-14_arm64
            runs-on: macos-14
    runs-on: ${{ matrix.platform.runs-on }}
    timeout-minutes: 20
    steps:
      - name: Checkout sources
        uses: actions/checkout@v5

      - name: Get the version
        id: get_version
        run: |
          VERSION=$(cargo metadata --format-version 1 --no-deps | jq -r '.packages[] | select(.name == "hisui") | .version')
          echo "VERSION=$VERSION" >> $GITHUB_OUTPUT

      - run: rustup update stable
      - run: rustup default stable
      - name: Install packages to build external dependencies
        run: |
          brew update
          brew install meson nasm yasm automake autoconf libtool pkg-config
      - run: cargo build --release
      - run: |
          mkdir -p hisui-${{ steps.get_version.outputs.version }}_${{ matrix.platform.name }}
          cp target/release/hisui hisui-${{ steps.get_version.outputs.version }}_${{ matrix.platform.name }}/
          tar -czf hisui-${{ steps.get_version.outputs.version }}_${{ matrix.platform.name }}.tar.gz \
            hisui-${{ steps.get_version.outputs.version }}_${{ matrix.platform.name }}
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: hisui-binary-${{ matrix.platform.name }}
          path: hisui-${{ steps.get_version.outputs.version }}_${{ matrix.platform.name }}.tar.gz

  docs_rs:
    runs-on: ubuntu-24.04
    timeout-minutes: 20
    env:
      DOCS_RS: 1
    steps:
      # docs.rs 向けでは外部ライブラリのビルドは走らないので依存パッケージなどのインストールは不要
      - uses: actions/checkout@v5
      - run: rustup update stable
      - run: rustup default stable
      - run: cargo doc --workspace --exclude hisui

  slack_notify_failed:
    needs:
      - check
      - clippy
      - test
      - test-nvidia-video-codec
      - test-apple-toolbox
      - test-fdk-aac
      - test-openh264
      - ubuntu-binary
      - macos-binary
      - docs_rs
    timeout-minutes: 20
    runs-on: ubuntu-24.04
    if: failure()
    steps:
      - name: Slack Notification
        uses: rtCamp/action-slack-notify@v2
        env:
          SLACK_CHANNEL: hisui
          SLACK_COLOR: danger
          SLACK_ICON_EMOJI: ":japanese_ogre:"
          SLACK_TITLE: "FAILED"
          SLACK_MESSAGE: <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|${{github.event.head_commit.message }}>
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}