name: Release on: # Trigger this workflow when a tag is pushed in the format `v1.2.3`. push: tags: # Pattern syntax: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet - "v[0-9]+.[0-9]+.[0-9]+*" # Trigger this workflow manually via workflow dispatch. workflow_dispatch: inputs: version: description: 'Version number in the format `v1.2.3`' required: true type: string # Configure the release workflow by editing these values. env: # The base filename of the binary produced by `cargo build`. cargo_build_binary_name: maze-ascension # The path to the assets directory. assets_path: assets # Whether to upload the packages produced by this workflow to a GitHub release. upload_to_github: true # The itch.io project to upload to in the format `user-name/project-name`. # There will be no upload to itch.io if this is commented out. upload_to_itch: kristoferssolo/maze-ascension ############ # ADVANCED # ############ # The ID of the app produced by this workflow. # Applies to macOS releases. # Must contain only A-Z, a-z, 0-9, hyphen, and period: https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleidentifier app_id: kristoferssolo.maze-ascension. # The base filename of the binary in the package produced by this workflow. # Applies to Windows, macOS, and Linux releases. # Defaults to `cargo_build_binary_name` if commented out. #app_binary_name: maze-ascension # The name of the `.zip` or `.dmg` file produced by this workflow. # Defaults to `app_binary_name` if commented out. #app_package_name: maze-ascension # The display name of the app produced by this workflow. # Applies to macOS releases. # Defaults to `app_package_name` if commented out. #app_display_name: Maze Ascension: The Labyrinth Of Echoes # The short display name of the app produced by this workflow. # Applies to macOS releases. # Must be 15 or fewer characters: https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundlename # Defaults to `app_display_name` if commented out. #app_short_name: Maze Ascension # Before enabling LFS, please take a look at GitHub's documentation for costs and quota limits: # https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-storage-and-bandwidth-usage git_lfs: false jobs: # Determine the version number for this workflow. get-version: runs-on: ubuntu-latest steps: - name: Get version number from tag id: tag run: echo "tag=${GITHUB_REF#refs/tags/}" >> "${GITHUB_OUTPUT}" outputs: # Use the input from workflow dispatch, or fall back to the git tag. version: ${{ inputs.version || steps.tag.outputs.tag }} # Build and package a release for each platform. build: needs: - get-version env: version: ${{ needs.get-version.outputs.version }} strategy: matrix: include: - platform: web targets: wasm32-unknown-unknown profile: release binary_ext: .wasm package_ext: .zip runner: ubuntu-latest - platform: linux targets: x86_64-unknown-linux-gnu profile: release-native features: bevy/wayland package_ext: .zip runner: ubuntu-latest - platform: windows targets: x86_64-pc-windows-msvc profile: release-native binary_ext: .exe package_ext: .zip runner: windows-latest - platform: macos targets: x86_64-apple-darwin aarch64-apple-darwin profile: release-native app_suffix: .app/Contents/MacOS package_ext: .dmg runner: macos-latest runs-on: ${{ matrix.runner }} permissions: # Required to create a GitHub release: https://docs.github.com/en/rest/releases/releases#create-a-release contents: write defaults: run: shell: bash steps: - name: Set up environment run: | # Default values: echo "app_binary_name=${app_binary_name:=${{ env.cargo_build_binary_name }}}" >> "${GITHUB_ENV}" echo "app_package_name=${app_package_name:=${app_binary_name}}" >> "${GITHUB_ENV}" echo "app_display_name=${app_display_name:=${app_package_name}}" >> "${GITHUB_ENV}" echo "app_short_name=${app_short_name:=${app_display_name}}" >> "${GITHUB_ENV}" # File paths: echo "app=tmp/app/${app_package_name}"'${{ matrix.app_suffix }}' >> "${GITHUB_ENV}" echo "package=${app_package_name}-"'${{ matrix.platform }}${{ matrix.package_ext }}' >> "${GITHUB_ENV}" # macOS environment: if [ '${{ matrix.platform }}' == 'macos' ]; then echo 'MACOSX_DEPLOYMENT_TARGET=11.0' >> "${GITHUB_ENV}" # macOS 11.0 Big Sur is the first version to support universal binaries. echo "SDKROOT=$(xcrun --sdk macosx --show-sdk-path)" >> "${GITHUB_ENV}" fi - name: Checkout repository uses: actions/checkout@v4 with: lfs: ${{ env.git_lfs }} - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.targets }} - name: Populate cargo cache uses: Leafwing-Studios/cargo-cache@v2 with: sweep-cache: true - name: Install dependencies (Linux) if: ${{ matrix.platform == 'linux' }} run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev libudev-dev libwayland-dev libxkbcommon-dev - name: Prepare output directories run: rm -rf tmp; mkdir -p tmp/binary '${{ env.app }}' - name: Install cargo-binstall (Web) if: ${{ matrix.platform == 'web' }} uses: cargo-bins/cargo-binstall@v1.9.0 - name: Install and run trunk (Web) if: ${{ matrix.platform == 'web' }} run: | cargo binstall --no-confirm trunk wasm-bindgen-cli wasm-opt trunk build --locked --release --dist '${{ env.app }}' - name: Build binaries (non-Web) if: ${{ matrix.platform != 'web' }} run: | for target in ${{ matrix.targets }}; do cargo build --locked --profile='${{ matrix.profile }}' --target="${target}" --no-default-features --features='${{ matrix.features }}' mv target/"${target}"/'${{ matrix.profile }}/${{ env.cargo_build_binary_name }}${{ matrix.binary_ext }}' tmp/binary/"${target}"'${{ matrix.binary_ext }}' done - name: Add binaries to app (non-Web) if: ${{ matrix.platform != 'web' }} run: | if [ '${{ matrix.platform }}' == 'macos' ]; then lipo tmp/binary/*'${{ matrix.binary_ext }}' -create -output '${{ env.app }}/${{ env.app_binary_name }}${{ matrix.binary_ext }}' else mv tmp/binary/*'${{ matrix.binary_ext }}' '${{ env.app }}/${{ env.app_binary_name }}${{ matrix.binary_ext }}' fi - name: Add assets to app (non-Web) if: ${{ matrix.platform != 'web' }} run: cp -r ./'${{ env.assets_path }}' '${{ env.app }}' || true # Ignore error if assets folder does not exist - name: Add metadata to app (macOS) if: ${{ matrix.platform == 'macos' }} run: | cat >'${{ env.app }}/../Info.plist' < CFBundleDevelopmentRegion en CFBundleDisplayName ${{ env.app_display_name }} CFBundleExecutable ${{ env.app_binary_name }} CFBundleIdentifier ${{ env.app_id }} CFBundleName ${{ env.app_short_name }} CFBundleShortVersionString ${{ env.version }} CFBundleVersion ${{ env.version }} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleSupportedPlatforms MacOSX EOF - name: Package app (non-Windows) if: ${{ matrix.platform != 'windows' }} working-directory: tmp/app run: | if [ '${{ matrix.platform }}' == 'macos' ]; then ln -s /Applications . hdiutil create -fs HFS+ -volname '${{ env.app_package_name }}' -srcfolder . '${{ env.package }}' else zip --recurse-paths '${{ env.package }}' '${{ env.app_package_name }}' fi - name: Package app (Windows) if: ${{ matrix.platform == 'windows' }} working-directory: tmp/app shell: pwsh run: Compress-Archive -Path '${{ env.app_package_name }}' -DestinationPath '${{ env.package }}' - name: Upload package to workflow artifacts uses: actions/upload-artifact@v4 with: path: tmp/app/${{ env.package }} name: package-${{ matrix.platform }} retention-days: 1 - name: Upload package to GitHub release if: ${{ env.upload_to_github == 'true' }} uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: tmp/app/${{ env.package }} asset_name: ${{ env.package }} release_name: ${{ env.version }} tag: ${{ env.version }} overwrite: true # Check if upload to itch.io is enabled. # This is needed because the `env` context can't be used in the `if:` condition of a job: # https://docs.github.com/en/actions/learn-github-actions/contexts#context-availability check-upload-to-itch: runs-on: ubuntu-latest steps: - name: Do nothing run: 'true' outputs: target: ${{ env.upload_to_itch }} # Upload all packages to itch.io. upload-to-itch: runs-on: ubuntu-latest needs: - get-version - check-upload-to-itch - build if: ${{ needs.check-upload-to-itch.outputs.target != '' }} steps: - name: Download all packages uses: actions/download-artifact@v4 with: pattern: package-* path: tmp - name: Install butler run: | curl -L -o butler.zip 'https://broth.itch.zone/butler/linux-amd64/LATEST/archive/default' unzip butler.zip chmod +x butler ./butler -V - name: Upload all packages to itch.io env: BUTLER_API_KEY: ${{ secrets.BUTLER_CREDENTIALS }} run: | for channel in $(ls tmp); do ./butler push \ --fix-permissions \ --userversion='${{ needs.get-version.outputs.version }}' \ tmp/"${channel}"/* \ '${{ env.upload_to_itch }}':"${channel#package-}" done