name: Release on: push: tags: - '*' env: CARGO_TERM_COLOR: always defaults: run: # necessary for windows shell: bash permissions: contents: write packages: write jobs: build-web: name: Build Web frontend runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v5 - name: Install pnpm uses: pnpm/action-setup@v6 with: version: 10.34.5 - name: Install Node.js uses: actions/setup-node@v6 with: node-version: 22 cache: pnpm cache-dependency-path: pnpm-lock.yaml - name: Install frontend dependencies run: pnpm install --frozen-lockfile - name: Build shared Web frontend run: pnpm build:web - name: Upload Web static files uses: actions/upload-artifact@v4 with: name: vnt-web-static path: vnt-web/static retention-days: 1 build: name: Build ${{ matrix.TARGET }} needs: build-web strategy: fail-fast: false matrix: include: - TARGET: x86_64-unknown-linux-musl OS: ubuntu-latest - TARGET: aarch64-unknown-linux-musl OS: ubuntu-latest - TARGET: armv7-unknown-linux-musleabihf OS: ubuntu-latest - TARGET: armv7-unknown-linux-musleabi OS: ubuntu-latest - TARGET: arm-unknown-linux-musleabihf OS: ubuntu-latest - TARGET: arm-unknown-linux-musleabi OS: ubuntu-latest - TARGET: x86_64-apple-darwin OS: macos-latest - TARGET: aarch64-apple-darwin OS: macos-latest - TARGET: i686-pc-windows-msvc OS: windows-latest - TARGET: x86_64-pc-windows-msvc OS: windows-latest - TARGET: aarch64-pc-windows-msvc OS: windows-latest - TARGET: mipsel-unknown-linux-musl OS: ubuntu-latest - TARGET: mips-unknown-linux-musl OS: ubuntu-latest - TARGET: x86_64-unknown-freebsd OS: ubuntu-latest ARTIFACT_NAME: freebsd-13.2-x86_64 BSD_VERSION: 13.2 runs-on: ${{ matrix.OS }} env: NAME: Vnt TARGET: ${{ matrix.TARGET }} OS: ${{ matrix.OS }} steps: - uses: actions/checkout@v5 - name: Replace Web static files with current frontend build run: rm -rf vnt-web/static && mkdir -p vnt-web/static - name: Download Web static files uses: actions/download-artifact@v4 with: name: vnt-web-static path: vnt-web/static - name: Init submodules run: git submodule update --init --recursive --remote && git submodule status - name: Cargo cache uses: actions/cache@v4 with: path: | ~/.cargo/registry ./target key: build-cargo-registry-${{matrix.TARGET}} - name: Install Protobuf (MacOS) if: runner.os == 'macOS' run: brew install protobuf - name: Install Protobuf (Windows) if: runner.os == 'Windows' run: choco install protoc - name: Use strawberry perl if: startsWith(matrix.os, 'windows') run: echo OPENSSL_SRC_PERL=C:/Strawberry/perl/bin/perl >> $GITHUB_ENV - name: List run: find ./ - name: Build Vnt X86_64-FreeBSD uses: cross-platform-actions/action@v0.23.0 if: ${{ endsWith(matrix.TARGET, 'freebsd') }} env: TARGET: ${{ matrix.TARGET }} with: operating_system: freebsd environment_variables: TARGET architecture: x86-64 version: ${{ matrix.BSD_VERSION }} shell: bash memory: 5G cpu_count: 4 run: | uname -a echo $SHELL pwd ls -lah whoami env | sort sudo pkg install -y git protobuf llvm15 curl --proto 'https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y source $HOME/.cargo/env export CC=clang export CXX=clang++ export CARGO_TERM_COLOR=always cargo build --release --verbose --bin vnt2_web --features vnt-web --target $TARGET cargo build --release --verbose --bin vnt2_cli --features vnt-ipc --target $TARGET cargo build --release --verbose --bin vnt2_ctrl --features vnt-ipc --target $TARGET - name: Install and configure dependencies if: ${{ ! endsWith(matrix.TARGET, 'freebsd') }} run: | # dependencies are only needed on ubuntu as that's the only place where # we make cross-compilation if [[ $OS =~ ^ubuntu.*$ ]]; then sudo apt-get update && sudo apt-get install protobuf-compiler clang llvm libc6-dev-i386 crossbuild-essential-arm64 crossbuild-essential-armhf musl-tools libboost-all-dev libc6-dev -y # curl -s musl.cc | grep mipsel case $TARGET in mipsel-unknown-linux-musl) MUSL_URI=mipsel-linux-muslsf-cross URL=mipsel-linux-muslsf ;; aarch64-unknown-linux-musl) MUSL_URI=aarch64-linux-musl-cross ;; armv7-unknown-linux-musleabihf) MUSL_URI=armv7l-linux-musleabihf-cross ;; armv7-unknown-linux-musleabi) MUSL_URI=armv7m-linux-musleabi-cross ;; arm-unknown-linux-musleabihf) MUSL_URI=arm-linux-musleabihf-cross ;; arm-unknown-linux-musleabi) MUSL_URI=arm-linux-musleabi-cross ;; mips-unknown-linux-musl) MUSL_URI=mips-linux-muslsf-cross URL=mips-linux-muslsf ;; esac if [ -n "$MUSL_URI" ]; then mkdir -p ./musl_gcc wget -c https://github.com/rustp2p/musl-cross/releases/download/0.0.1/$MUSL_URI.tgz -P /opt/musl_gcc/ tar zxf /opt/musl_gcc/$MUSL_URI.tgz -C /opt/musl_gcc/ sudo ln -s /opt/musl_gcc/$MUSL_URI/bin/*gcc /usr/bin/ fi fi if [[ $TARGET =~ ^mips.*$ ]]; then cd /opt/musl_gcc/${URL}-cross/lib/gcc/${URL}/11.2.1 cp libgcc_eh.a libunwind.a rustup toolchain install nightly-x86_64-unknown-linux-gnu rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu RUST_LIB_SRC=$HOME/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/ if [[ -f $RUST_LIB_SRC/library/Cargo.lock && ! -f $RUST_LIB_SRC/Cargo.lock ]]; then cp -f $RUST_LIB_SRC/library/Cargo.lock $RUST_LIB_SRC/Cargo.lock fi fi rustup -V # some additional configuration for cross-compilation on linux cat >>~/.cargo/config.toml < "$(basename "$asset").sha256") - name: Upload Android JNI artifact uses: actions/upload-artifact@v4 with: name: Vnt-Android-${{ matrix.abi }} path: artifacts/vnt-jni-${{ matrix.abi }}-${{ github.ref_name }}.so* if-no-files-found: error # deploys to github releases on tag deploy: if: startsWith(github.ref, 'refs/tags/') needs: [build, build-android-jni] runs-on: ubuntu-latest steps: - name: Download artifacts uses: actions/download-artifact@v4 with: path: ./artifacts - name: List run: find ./artifacts - name: Release uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: ./artifacts/*/*.zip tag: ${{ github.ref }} overwrite: true file_glob: true - name: Release Android JNI libraries uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: ./artifacts/Vnt-Android-*/*.so* tag: ${{ github.ref }} overwrite: true file_glob: true desktop-windows: name: Build and publish VNT Desktop for Windows if: startsWith(github.ref, 'refs/tags/') needs: deploy runs-on: windows-latest steps: - name: Check out repository uses: actions/checkout@v5 - name: Install pnpm uses: pnpm/action-setup@v6 with: version: 10.34.5 - name: Install Node.js uses: actions/setup-node@v6 with: node-version: 22 cache: pnpm cache-dependency-path: pnpm-lock.yaml - name: Install Rust uses: dtolnay/rust-toolchain@stable - name: Install frontend dependencies run: pnpm install --frozen-lockfile - name: Verify tag matches desktop version shell: pwsh run: | $config = Get-Content vnt-desktop/src-tauri/tauri.conf.json | ConvertFrom-Json $tagVersion = "${{ github.ref_name }}" -replace '^v', '' if ($tagVersion -ne $config.version) { throw "Tag ${{ github.ref_name }} does not match desktop version $($config.version)" } - name: Build and publish Windows desktop installers uses: tauri-apps/tauri-action@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} with: projectPath: vnt-desktop tagName: ${{ github.ref_name }} releaseName: VNT ${{ github.ref_name }} releaseDraft: false prerelease: false releaseAssetNamePattern: 'VNT.Desktop_[version]_windows_[arch][setup][ext]' args: --bundles nsis,msi release-notes: name: Add download links to release notes if: startsWith(github.ref, 'refs/tags/') needs: desktop-windows runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v5 - name: Update updater metadata and release notes env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: node .github/scripts/update-release-downloads.mjs