diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..2895013 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,78 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +env: + CARGO_TERM_COLOR: always + +jobs: + # Run cargo test + test: + name: Test Suite + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout sources + uses: actions/checkout@v4 + - name: Cache + uses: actions/cache@v3 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-test-${{ hashFiles('**/Cargo.toml') }} + - name: Install stable toolchain + uses: dtolnay/rust-toolchain@stable + - name: Install Dependencies + run: sudo apt-get update; sudo apt-get install --no-install-recommends libwayland-dev libasound2-dev libudev-dev + - name: Run cargo test + run: cargo test + + # Run cargo clippy -- -D warnings + clippy_check: + name: Clippy + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout sources + uses: actions/checkout@v4 + - name: Cache + uses: actions/cache@v3 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-clippy-${{ hashFiles('**/Cargo.toml') }} + - name: Install stable toolchain + uses: dtolnay/rust-toolchain@stable + with: + components: clippy + - name: Install Dependencies + run: sudo apt-get update; sudo apt-get install --no-install-recommends libwayland-dev libasound2-dev libudev-dev + - name: Run clippy + run: cargo clippy -- -D warnings + + # Run cargo fmt --all -- --check + format: + name: Format + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout sources + uses: actions/checkout@v4 + - name: Install stable toolchain + uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt + - name: Run cargo fmt + run: cargo fmt --all -- --check diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..6c5813e --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,303 @@ +name: Release + +on: + push: + tags: + - '*' + +env: + # update with the name of the main binary + binary: bevy_github_ci_template + add_binaries_to_github_release: true + #itch_target: / + + # 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: + + # Build for wasm + release-wasm: + runs-on: ubuntu-latest + + steps: + - uses: olegtarasov/get-tag@v2.1.2 + id: get_version + - uses: actions/checkout@v4 + with: + lfs: ${{ env.use_git_lfs }} + - uses: dtolnay/rust-toolchain@stable + with: + targets: wasm32-unknown-unknown + - name: install wasm-bindgen-cli + run: | + cargo install wasm-bindgen-cli + + - name: Build + run: | + cargo build --release --target wasm32-unknown-unknown + + - name: Prepare package + run: | + wasm-bindgen --no-typescript --out-name bevy_game --out-dir wasm --target web target/wasm32-unknown-unknown/release/${{ env.binary }}.wasm + cp -r assets wasm/ + + - name: Package as a zip + working-directory: ./wasm + run: | + zip --recurse-paths ../${{ env.binary }}.zip . + + - name: Upload binaries to artifacts + uses: actions/upload-artifact@v3 + with: + path: ${{ env.binary }}.zip + name: wasm + retention-days: 1 + + - name: Upload binaries to release + if: ${{ env.add_binaries_to_github_release == 'true' }} + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ env.binary }}.zip + asset_name: ${{ env.binary }}-wasm-${{ steps.get_version.outputs.tag }}.zip + tag: ${{ github.ref }} + overwrite: true + + # Build for Linux + release-linux: + runs-on: ubuntu-latest + + steps: + - uses: olegtarasov/get-tag@v2.1.2 + id: get_version + - uses: actions/checkout@v4 + with: + lfs: ${{ env.use_git_lfs }} + - uses: dtolnay/rust-toolchain@stable + with: + targets: x86_64-unknown-linux-gnu + - name: install dependencies + run: | + sudo apt-get update; sudo apt-get install pkg-config libx11-dev libasound2-dev libudev-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev + + - name: Build + run: | + cargo build --release --target x86_64-unknown-linux-gnu + + - name: Prepare package + run: | + mkdir linux + cp target/x86_64-unknown-linux-gnu/release/${{ env.binary }} linux/ + cp -r assets linux/ + + - name: Package as a zip + working-directory: ./linux + run: | + zip --recurse-paths ../${{ env.binary }}.zip . + + - name: Upload binaries to artifacts + uses: actions/upload-artifact@v3 + with: + path: ${{ env.binary }}.zip + name: linux + retention-days: 1 + + - name: Upload binaries to release + if: ${{ env.add_binaries_to_github_release == 'true' }} + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ env.binary }}.zip + asset_name: ${{ env.binary }}-linux-${{ steps.get_version.outputs.tag }}.zip + tag: ${{ github.ref }} + overwrite: true + + # Build for Windows + release-windows: + runs-on: windows-latest + + steps: + - uses: olegtarasov/get-tag@v2.1.2 + id: get_version + - uses: actions/checkout@v4 + with: + lfs: ${{ env.use_git_lfs }} + - uses: dtolnay/rust-toolchain@stable + with: + targets: x86_64-pc-windows-msvc + + - name: Build + run: | + cargo build --release --target x86_64-pc-windows-msvc + + - name: Prepare package + run: | + mkdir windows + cp target/x86_64-pc-windows-msvc/release/${{ env.binary }}.exe windows/ + cp -r assets windows/ + + - name: Package as a zip + run: | + Compress-Archive -Path windows/* -DestinationPath ${{ env.binary }}.zip + + - name: Upload binaries to artifacts + uses: actions/upload-artifact@v3 + with: + path: ${{ env.binary }}.zip + name: windows + retention-days: 1 + + - name: Upload binaries to release + if: ${{ env.add_binaries_to_github_release == 'true' }} + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ env.binary }}.zip + asset_name: ${{ env.binary }}-windows-${{ steps.get_version.outputs.tag }}.zip + tag: ${{ github.ref }} + overwrite: true + + # Build for MacOS x86_64 + release-macOS-intel: + runs-on: macOS-latest + + steps: + - uses: olegtarasov/get-tag@v2.1.2 + id: get_version + - uses: actions/checkout@v4 + with: + lfs: ${{ env.use_git_lfs }} + - uses: dtolnay/rust-toolchain@stable + with: + targets: x86_64-apple-darwin + - name: Environment Setup + run: | + export CFLAGS="-fno-stack-check" + export MACOSX_DEPLOYMENT_TARGET="10.9" + + - name: Build + run: | + cargo build --release --target x86_64-apple-darwin + + - name: Prepare Package + run: | + mkdir -p ${{ env.binary }}.app/Contents/MacOS + cp target/x86_64-apple-darwin/release/${{ env.binary }} ${{ env.binary }}.app/Contents/MacOS/ + cp -r assets ${{ env.binary }}.app/Contents/MacOS/ + hdiutil create -fs HFS+ -volname "${{ env.binary }}" -srcfolder ${{ env.binary }}.app ${{ env.binary }}-macOS-intel.dmg + + - name: Upload binaries to artifacts + uses: actions/upload-artifact@v3 + with: + path: ${{ env.binary }}-macOS-intel.dmg + name: macOS-intel + retention-days: 1 + + - name: Upload binaries to release + if: ${{ env.add_binaries_to_github_release == 'true' }} + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ env.binary }}-macOS-intel.dmg + asset_name: ${{ env.binary }}-macOS-intel-${{ steps.get_version.outputs.tag }}.dmg + tag: ${{ github.ref }} + overwrite: true + + # Build for MacOS Apple Silicon + release-macOS-apple-silicon: + runs-on: macOS-latest + + steps: + - uses: olegtarasov/get-tag@v2.1.2 + id: get_version + - uses: actions/checkout@v4 + with: + lfs: ${{ env.use_git_lfs }} + - uses: dtolnay/rust-toolchain@stable + with: + targets: aarch64-apple-darwin + - name: Environment + # macOS 11 was the first version to support ARM + run: | + export MACOSX_DEPLOYMENT_TARGET="11" + + - name: Build + run: | + cargo build --release --target aarch64-apple-darwin + + - name: Prepare Package + run: | + mkdir -p ${{ env.binary }}.app/Contents/MacOS + cp target/aarch64-apple-darwin/release/${{ env.binary }} ${{ env.binary }}.app/Contents/MacOS/ + cp -r assets ${{ env.binary }}.app/Contents/MacOS/ + hdiutil create -fs HFS+ -volname "${{ env.binary }}-macOS-apple-silicon" -srcfolder ${{ env.binary }}.app ${{ env.binary }}-macOS-apple-silicon.dmg + + - name: Upload binaries to artifacts + uses: actions/upload-artifact@v3 + with: + path: ${{ env.binary }}-macOS-apple-silicon.dmg + name: macOS-apple-silicon + retention-days: 1 + + - name: Upload binaries to release + if: ${{ env.add_binaries_to_github_release == 'true' }} + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ env.binary }}-macOS-apple-silicon.dmg + asset_name: ${{ env.binary }}-macOS-apple-silicon-${{ steps.get_version.outputs.tag }}.dmg + tag: ${{ github.ref }} + overwrite: true + + check-if-upload-to-itch-is-configured: + runs-on: ubuntu-latest + outputs: + should-upload: ${{ steps.check-env.outputs.has-itch-target }} + steps: + - 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 + + upload-to-itch: + runs-on: ubuntu-latest + needs: + - check-if-upload-to-itch-is-configured + - release-wasm + - release-linux + - release-windows + - release-macOS-intel + - release-macOS-apple-silicon + 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 + - uses: olegtarasov/get-tag@v2.1.2 + id: get_version + - name: Upload to itch.io + env: + BUTLER_API_KEY: ${{ secrets.BUTLER_CREDENTIALS }} + run: | + for channel in $(ls builds); do + ./butler push \ + --fix-permissions \ + --userversion="${{ steps.get_version.outputs.tag }}" \ + builds/$channel/* \ + ${{ env.itch_target }}:$channel + done