Skip to content

Release

Release #11

Workflow file for this run

name: Release
# Only trigger this workflow when a tag is pushed in the format `vA.B.C`.
on:
push:
# Syntax: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet
tags:
- "v[0-9]+.[0-9]+.[0-9]+*"
workflow_dispatch:
inputs:
version:
description: 'Version - in the form of v1.2.3'
required: true
type: string
# Configure constants for this workflow.
env:
# TODO: This may become unnecessary: https://github.com/rust-lang/cargo/issues/6790
# The base filename of the binary produced by `cargo build`.
BINARY: bevy_template
# The name to use for the packaged application produced by this workflow.
PACKAGE_NAME: bevy-template
# The itch.io page to upload to, in the format: `user-name/project-name`.
# Comment this out to disable.
ITCH_TARGET: the-bevy-flock/bevy-template
# Whether packages produced by this workflow should be uploaded to the Github release.
UPLOAD_PACKAGES_TO_GITHUB_RELEASE: true
# 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
USE_GIT_LFS: false
jobs:
# Extract the version number from the pushed tag.
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:
version: ${{ inputs.version || steps.tag.outputs.tag }}
# Build for web.
build-for-web:
runs-on: ubuntu-latest
needs: get-version
env:
TARGET: wasm32-unknown-unknown
PROFILE: wasm-release
PLATFORM: web
VERSION: ${{ needs.get-version.outputs.version }}
steps:
- name: Set PACKAGE environment variable
run: |
echo "PACKAGE=${{ env.PACKAGE_NAME }}-${{ env.VERSION }}-${{ env.PLATFORM }}" >> "${GITHUB_ENV}"
- name: Set OUT_DIR environment variable
run: |
echo "OUT_DIR=build/${{ env.PACKAGE }}/${{ env.PACKAGE_NAME }}" >> "${GITHUB_ENV}"
- name: Checkout repository
uses: actions/checkout@v4
with:
lfs: ${{ env.USE_GIT_LFS }}
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ env.TARGET }}
- name: Install dependencies
run: |
cargo install wasm-bindgen-cli
- name: Build binary
run: |
cargo build --profile="${{ env.PROFILE }}" --target="${{ env.TARGET }}" --no-default-features
- name: Prepare package
run: |
mkdir -p "${{ env.OUT_DIR }}"
wasm-bindgen "target/${{ env.TARGET }}/${{ env.PROFILE }}/${{ env.BINARY }}.wasm" \
--out-dir "${{ env.OUT_DIR }}" \
--out-name "${{ env.BINARY }}" \
--no-typescript \
--target web
cp -r web/* "${{ env.OUT_DIR }}"
cp -r assets "${{ env.OUT_DIR }}" || true # Ignore error if `assets` folder does not exist
- name: Optimize Wasm
uses: NiklasEi/wasm-opt-action@v2
with:
file: ${{ env.OUT_DIR }}/*.wasm
- name: Compress package
working-directory: ./build/${{ env.PACKAGE }}
run: |
zip --recurse-paths "../${{ env.PACKAGE }}.zip" "${{ env.PACKAGE_NAME }}"
- name: Upload package to artifacts
uses: actions/upload-artifact@v3
with:
path: build/${{ env.PACKAGE }}.zip
name: ${{ env.PLATFORM }}
retention-days: 1
- name: Upload package to Github release
if: ${{ env.UPLOAD_PACKAGES_TO_GITHUB_RELEASE == 'true' }}
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: build/${{ env.PACKAGE }}.zip
asset_name: ${{ env.PACKAGE }}.zip
release_name: ${{ env.VERSION }}
tag: ${{ github.ref }}
overwrite: true
# Build for Linux.
build-for-linux:
runs-on: ubuntu-latest
needs: get-version
env:
TARGET: x86_64-unknown-linux-gnu
PROFILE: release
PLATFORM: linux
VERSION: ${{ needs.get-version.outputs.version }}
steps:
- name: Set PACKAGE environment variable
run: |
echo "PACKAGE=${{ env.PACKAGE_NAME }}-${{ env.VERSION }}-${{ env.PLATFORM }}" >> "${GITHUB_ENV}"
- name: Set OUT_DIR environment variable
run: |
echo "OUT_DIR=build/${{ env.PACKAGE }}/${{ env.PACKAGE_NAME }}" >> "${GITHUB_ENV}"
- name: Checkout repository
uses: actions/checkout@v4
with:
lfs: ${{ env.USE_GIT_LFS }}
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ env.TARGET }}
- name: Install dependencies
run: |
sudo apt-get update; sudo apt-get install libasound2-dev libudev-dev libwayland-dev libxkbcommon-dev
- name: Build binary
run: |
cargo build --profile="${{ env.PROFILE }}" --target="${{ env.TARGET }}" --no-default-features --features=bevy/wayland
- name: Prepare package
run: |
mkdir -p "${{ env.OUT_DIR }}"
cp "target/${{ env.TARGET }}/${{ env.PROFILE }}/${{ env.BINARY }}" "${{ env.OUT_DIR }}"
cp -r assets "${{ env.OUT_DIR }}" || true # Ignore error if `assets` folder does not exist
- name: Compress package
working-directory: ./build/${{ env.PACKAGE }}
run: |
zip --recurse-paths ../"${{ env.PACKAGE }}.zip" "${{ env.PACKAGE_NAME }}"
- name: Upload package to artifacts
uses: actions/upload-artifact@v3
with:
path: build/${{ env.PACKAGE }}.zip
name: ${{ env.PLATFORM }}
retention-days: 1
- name: Upload package to Github release
if: ${{ env.UPLOAD_PACKAGES_TO_GITHUB_RELEASE == 'true' }}
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: build/${{ env.PACKAGE }}.zip
asset_name: ${{ env.PACKAGE }}.zip
release_name: ${{ env.VERSION }}
tag: ${{ github.ref }}
overwrite: true
# Build for Windows.
build-for-windows:
runs-on: windows-latest
needs: get-version
env:
TARGET: x86_64-pc-windows-msvc
PROFILE: release
PLATFORM: windows
VERSION: ${{ needs.get-version.outputs.version }}
steps:
- name: Set PACKAGE environment variable
run: |
"PACKAGE=${{ env.PACKAGE_NAME }}-${{ env.VERSION }}-${{ env.PLATFORM }}" | Out-File -FilePath "${Env:GITHUB_ENV}" -Append
- name: Set OUT_DIR environment variable
run: |
"OUT_DIR=build/${{ env.PACKAGE }}/${{ env.PACKAGE_NAME }}" | Out-File -FilePath "${Env:GITHUB_ENV}" -Append
- name: Checkout repository
uses: actions/checkout@v4
with:
lfs: ${{ env.USE_GIT_LFS }}
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ env.TARGET }}
- name: Build binary
run: |
cargo build --profile="${{ env.PROFILE }}" --target="${{ env.TARGET }}" --no-default-features
- name: Prepare package
run: |
mkdir -p "${{ env.OUT_DIR }}"
cp "target/${{ env.TARGET }}/${{ env.PROFILE }}/${{ env.BINARY }}.exe" "${{ env.OUT_DIR }}"
cp -r assets "${{ env.OUT_DIR }}" || true # Ignore error if `assets` folder does not exist
- name: Compress package
working-directory: ./build/${{ env.PACKAGE }}
run: |
Compress-Archive -Path "${{ env.PACKAGE_NAME }}" -DestinationPath "../${{ env.PACKAGE }}.zip"
- name: Upload package to artifacts
uses: actions/upload-artifact@v3
with:
path: build/${{ env.PACKAGE }}.zip
name: ${{ env.PLATFORM }}
retention-days: 1
- name: Upload package to Github release
if: ${{ env.UPLOAD_PACKAGES_TO_GITHUB_RELEASE == 'true' }}
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: build/${{ env.PACKAGE }}.zip
asset_name: ${{ env.PACKAGE }}.zip
release_name: ${{ env.VERSION }}
tag: ${{ github.ref }}
overwrite: true
# Build for MacOS x86_64.
build-for-macOS-intel:
runs-on: macOS-latest
needs: get-version
env:
TARGET: x86_64-apple-darwin
PROFILE: release
PLATFORM: macOS-intel
VERSION: ${{ needs.get-version.outputs.version }}
CFLAGS: -fno-stack-check
MACOSX_DEPLOYMENT_TARGET: 10.9
steps:
- name: Set PACKAGE environment variable
run: |
echo "PACKAGE=${{ env.PACKAGE_NAME }}-${{ env.VERSION }}-${{ env.PLATFORM }}" >> "${GITHUB_ENV}"
- name: Set OUT_DIR environment variable
run: |
echo "OUT_DIR=build/${{ env.PACKAGE }}/${{ env.PACKAGE_NAME }}.app/Contents/MacOS" >> "${GITHUB_ENV}"
- name: Checkout repository
uses: actions/checkout@v4
with:
lfs: ${{ env.USE_GIT_LFS }}
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ env.TARGET }}
- name: Build binary
run: |
cargo build --profile="${{ env.PROFILE }}" --target="${{ env.TARGET }}" --no-default-features
- name: Prepare package
run: |
mkdir -p "${{ env.OUT_DIR }}"
cp "target/${{ env.TARGET }}/${{ env.PROFILE }}/${{ env.BINARY }}" "${{ env.OUT_DIR }}"
cp -r assets "${{ env.OUT_DIR }}" || true # Ignore error if `assets` folder does not exist
- name: Compress package
working-directory: ./build/${{ env.PACKAGE }}
run: |
hdiutil create -fs HFS+ -volname "${{ env.PACKAGE_NAME }}" -srcfolder "${{ env.PACKAGE_NAME }}.app" "../${{ env.PACKAGE }}.dmg"
- name: Upload package to artifacts
uses: actions/upload-artifact@v3
with:
path: build/${{ env.PACKAGE }}.dmg
name: ${{ env.PLATFORM }}
retention-days: 1
- name: Upload package to Github release
if: ${{ env.UPLOAD_PACKAGES_TO_GITHUB_RELEASE == 'true' }}
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: build/${{ env.PACKAGE }}.dmg
asset_name: ${{ env.PACKAGE }}.dmg
release_name: ${{ env.VERSION }}
tag: ${{ github.ref }}
overwrite: true
# Build for MacOS Apple Silicon.
build-for-macOS-apple-silicon:
runs-on: macOS-latest
needs: get-version
env:
TARGET: aarch64-apple-darwin
PROFILE: release
PLATFORM: macOS-apple-silicon
VERSION: ${{ needs.get-version.outputs.version }}
# MacOS 11.0 Big Sur is the first version to support universal binaries.
MACOSX_DEPLOYMENT_TARGET: 11.0
steps:
- name: Set PACKAGE environment variable
run: |
echo "PACKAGE=${{ env.PACKAGE_NAME }}-${{ env.VERSION }}-${{ env.PLATFORM }}" >> "${GITHUB_ENV}"
- name: Set OUT_DIR environment variable
run: |
echo "OUT_DIR=build/${{ env.PACKAGE }}/${{ env.PACKAGE_NAME }}.app/Contents/MacOS" >> "${GITHUB_ENV}"
- name: Checkout repository
uses: actions/checkout@v4
with:
lfs: ${{ env.USE_GIT_LFS }}
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ env.TARGET }}
- name: Build binary
run: |
cargo build --profile="${{ env.PROFILE }}" --target="${{ env.TARGET }}" --no-default-features
- name: Prepare package
run: |
mkdir -p "${{ env.OUT_DIR }}"
cp "target/${{ env.TARGET }}/${{ env.PROFILE }}/${{ env.BINARY }}" "${{ env.OUT_DIR }}"
cp -r assets "${{ env.OUT_DIR }}" || true # Ignore error if `assets` folder does not exist
- name: Compress package
working-directory: ./build/${{ env.PACKAGE }}
run: |
hdiutil create -fs HFS+ -volname "${{ env.PACKAGE_NAME }}" -srcfolder "${{ env.PACKAGE_NAME }}.app" "../${{ env.PACKAGE }}.dmg"
- name: Upload package to artifacts
uses: actions/upload-artifact@v3
with:
path: build/${{ env.PACKAGE }}.dmg
name: ${{ env.PLATFORM }}
retention-days: 1
- name: Upload package to Github release
if: ${{ env.UPLOAD_PACKAGES_TO_GITHUB_RELEASE == 'true' }}
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: build/${{ env.PACKAGE }}.dmg
asset_name: ${{ env.PACKAGE }}.dmg
release_name: ${{ env.VERSION }}
tag: ${{ github.ref }}
overwrite: true
# Check if upload to itch.io is configured.
check-if-upload-to-itch-is-configured:
runs-on: ubuntu-latest
steps:
- name: Check ITCH_TARGET environment variable
id: check-env
run: |
if [[ -z "${ITCH_TARGET}" ]]; then
echo "has-itch-target=no" >> "${GITHUB_OUTPUT}"
else
echo "has-itch-target=yes" >> "${GITHUB_OUTPUT}"
fi
outputs:
should-upload: ${{ steps.check-env.outputs.has-itch-target }}
# Upload artifacts to itch.io.
upload-to-itch:
runs-on: ubuntu-latest
needs:
- get-version
- check-if-upload-to-itch-is-configured
- build-for-web
- build-for-linux
- build-for-windows
- build-for-macOS-intel
- build-for-macOS-apple-silicon
env:
VERSION: ${{ needs.get-version.outputs.version }}
if: ${{ needs.check-if-upload-to-itch-is-configured.outputs.should-upload == 'yes' }}
steps:
- name: Download artifacts
uses: actions/download-artifact@v3
with:
path: ./builds
- name: Install butler
run: |
curl -L -o butler.zip https://broth.itch.ovh/butler/linux-amd64/LATEST/archive/default
unzip butler.zip
chmod +x butler
./butler -V
- name: Upload artifacts to itch.io
env:
BUTLER_API_KEY: ${{ secrets.BUTLER_CREDENTIALS }}
run: |
for channel in $(ls builds); do
./butler push \
--fix-permissions \
--userversion="${{ env.VERSION }}" \
builds/"${channel}"/* \
${{ env.ITCH_TARGET }}:"${channel}"
done