Provide feature parity for Projection
with Godot
#3043
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Copyright (c) godot-rust; Bromeon and contributors. | |
# This Source Code Form is subject to the terms of the Mozilla Public | |
# License, v. 2.0. If a copy of the MPL was not distributed with this | |
# file, You can obtain one at https://mozilla.org/MPL/2.0/. | |
name: Minimal CI | |
# | |
# Runs when someone opens a PR and pushes commits to the PR. | |
# Includes basic checks to catch most common errors, but is followed by merge queue (full-ci). | |
on: | |
pull_request: | |
branches: | |
- master | |
types: | |
- opened | |
- synchronize | |
- reopened | |
#- ready_for_review # could be enabled if we don't run certain checks in draft mode | |
env: | |
# Applies to all 'register-docs' features across crates. | |
CLIPPY_FEATURES: '--features register-docs,godot/experimental-godot-api,godot/serde' | |
TEST_FEATURES: '' | |
# GDEXT_CRATE_ARGS: '-p godot-codegen -p godot-ffi -p godot-core -p godot-macros -p godot' | |
RETRY: ${{ github.workspace }}/.github/other/retry.sh | |
defaults: | |
run: | |
shell: bash | |
# If a new commit is pushed before the old one's CI has completed (on the same branch), abort previous run | |
concurrency: | |
group: ${{ github.head_ref }} | |
cancel-in-progress: true | |
jobs: | |
rustfmt: | |
runs-on: ubuntu-22.04 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: "Install Rust" | |
uses: ./.github/composite/rust | |
with: | |
components: rustfmt | |
- name: "Check rustfmt" | |
run: cargo fmt --all -- --check | |
- name: "Run custom repo checks" | |
run: | | |
cargo run -p repo-tweak | |
git diff --quiet --exit-code || { | |
echo "::error::Godot versions out of sync; update with `cargo run -p repo-tweak`." | |
echo "Differences:" | |
echo "----------------------------------------------------" | |
git diff | |
echo "----------------------------------------------------" | |
exit 1 | |
} | |
# Needs to be its own job (apart from sync-doc), because lints don't work with --no-deps, and because it contributes to ci-status. | |
doc-lints: | |
runs-on: ubuntu-22.04 | |
steps: | |
- uses: actions/checkout@v4 | |
# rustdoc is included as component. | |
- name: "Install Rust" | |
uses: ./.github/composite/rust | |
- name: "Check rustdoc" | |
env: | |
RUSTDOCFLAGS: > | |
-D rustdoc::broken-intra-doc-links -D rustdoc::private-intra-doc-links -D rustdoc::invalid-codeblock-attributes | |
-D rustdoc::invalid-rust-codeblocks -D rustdoc::invalid-html-tags -D rustdoc::bare-urls -D rustdoc::unescaped-backticks | |
run: cargo doc -p godot --ignore-rust-version | |
clippy: | |
runs-on: ubuntu-22.04 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: "Patch Cargo.toml to use nightly extension API" | |
run: .github/other/patch-prebuilt.sh nightly | |
- name: "Install Rust" | |
uses: ./.github/composite/rust | |
with: | |
components: clippy | |
- name: "Check clippy" | |
run: | | |
cargo clippy --all-targets $CLIPPY_FEATURES -- \ | |
-D clippy::suspicious \ | |
-D clippy::style \ | |
-D clippy::complexity \ | |
-D clippy::perf \ | |
-D clippy::dbg_macro \ | |
-D clippy::todo \ | |
-D clippy::unimplemented \ | |
-D warnings | |
unit-test: | |
name: unit-test | |
runs-on: ubuntu-22.04 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: "Patch Cargo.toml to use nightly extension API" | |
run: .github/other/patch-prebuilt.sh nightly | |
- name: "Install Rust" | |
uses: ./.github/composite/rust | |
- name: "Compile tests" | |
run: cargo test $TEST_FEATURES --no-run | |
- name: "Test" | |
run: cargo test $TEST_FEATURES | |
# For complex matrix workflow, see https://stackoverflow.com/a/65434401 | |
godot-itest: | |
name: godot-itest (${{ matrix.name }}) | |
runs-on: ${{ matrix.os }} | |
continue-on-error: false | |
timeout-minutes: 15 | |
strategy: | |
fail-fast: false # cancel all jobs as soon as one fails? | |
matrix: | |
include: | |
# macOS (use arm64 for minimal CI) | |
- name: macos | |
os: macos-latest | |
artifact-name: macos-arm-nightly | |
godot-binary: godot.macos.editor.dev.arm64 | |
# Windows | |
- name: windows | |
os: windows-latest | |
artifact-name: windows-nightly | |
godot-binary: godot.windows.editor.dev.x86_64.exe | |
# rust-extra-args: --features godot/api-custom | |
# Linux | |
- name: linux-full | |
os: ubuntu-22.04 | |
artifact-name: linux-nightly | |
godot-binary: godot.linuxbsd.editor.dev.x86_64 | |
rust-extra-args: --features itest/codegen-full | |
with-hot-reload: true | |
- name: linux-features-experimental | |
os: ubuntu-22.04 | |
artifact-name: linux-nightly | |
godot-binary: godot.linuxbsd.editor.dev.x86_64 | |
rust-extra-args: --features itest/experimental-threads,itest/codegen-full-experimental,godot/api-custom,godot/serde,itest/register-docs | |
# Linux compat | |
- name: linux-4.1 | |
os: ubuntu-22.04 | |
artifact-name: linux-4.1 | |
godot-binary: godot.linuxbsd.editor.dev.x86_64 | |
godot-prebuilt-patch: '4.1.4' | |
- name: linux-4.2 | |
os: ubuntu-22.04 | |
artifact-name: linux-4.2 | |
godot-binary: godot.linuxbsd.editor.dev.x86_64 | |
godot-prebuilt-patch: '4.2.2' | |
# Memory checkers | |
- name: linux-memcheck | |
os: ubuntu-22.04 | |
artifact-name: linux-memcheck-nightly | |
godot-binary: godot.linuxbsd.editor.dev.x86_64.llvm.san | |
rust-toolchain: nightly | |
rust-env-rustflags: -Zrandomize-layout -Zsanitizer=address | |
rust-extra-args: --features godot/api-custom | |
# Sanitizers can't build proc-macros and build scripts; with --target, cargo ignores RUSTFLAGS for those two. | |
rust-target: x86_64-unknown-linux-gnu | |
steps: | |
- uses: actions/checkout@v4 | |
- name: "Run Godot integration test" | |
uses: ./.github/composite/godot-itest | |
with: | |
artifact-name: godot-${{ matrix.artifact-name }} | |
godot-binary: ${{ matrix.godot-binary }} | |
godot-args: ${{ matrix.godot-args }} # currently unused | |
godot-prebuilt-patch: ${{ matrix.godot-prebuilt-patch }} | |
rust-extra-args: ${{ matrix.rust-extra-args }} | |
rust-toolchain: ${{ matrix.rust-toolchain || 'stable' }} | |
rust-env-rustflags: ${{ matrix.rust-env-rustflags }} | |
rust-target: ${{ matrix.rust-target }} | |
with-llvm: ${{ contains(matrix.name, 'macos') && contains(matrix.rust-extra-args, 'api-custom') }} | |
godot-check-header: ${{ matrix.godot-check-header }} | |
- name: "Build and test hot-reload" | |
if: ${{ matrix.with-hot-reload }} | |
working-directory: examples/hot-reload/godot/test | |
run: ./run-test.sh | |
shell: bash | |
run-examples: | |
runs-on: ubuntu-22.04 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: "Install Rust" | |
uses: ./.github/composite/rust | |
# First compile, to fail early in case of compilation errors. | |
- name: "Compile Rust examples (release mode)" | |
run: cargo build --release -p dodge-the-creeps | |
- name: "Install Godot" | |
uses: ./.github/composite/godot-install | |
with: | |
artifact-name: godot-linux-4.3 | |
godot-binary: godot.linuxbsd.editor.dev.x86_64 | |
- name: "Run examples for short time" | |
run: ./.github/other/check-example.sh dodge-the-creeps | |
license-guard: | |
runs-on: ubuntu-22.04 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: "Check and fix license headers" | |
uses: 'apache/skywalking-eyes/[email protected]' | |
with: | |
# log: debug # optional: set the log level. The default value is `info`. | |
config: .github/other/licenserc.yml | |
# token: # optional: the token that license eye uses when it needs to comment on the pull request. | |
# Set to empty ("") to disable commenting on pull request. The default value is ${{ github.token }} | |
# mode: # optional: Which mode License-Eye should be run in. Choices are `check` or `fix`. The default value is `check`. | |
mode: check | |
# --------------------------------------------------------------------------------------------------------------------------------------------- | |
# CI status report | |
# Job to notify merge queue about success/failure | |
ci-status: | |
if: always() | |
needs: | |
- rustfmt | |
- doc-lints | |
- clippy | |
- unit-test | |
- godot-itest | |
- run-examples | |
- license-guard | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: "Determine success or failure" | |
run: | | |
DEPENDENCIES='${{ toJson(needs) }}' | |
echo "Dependency jobs:" | |
all_success=true | |
for job in $(echo "$DEPENDENCIES" | jq -r 'keys[]'); do | |
status=$(echo "$DEPENDENCIES" | jq -r ".[\"$job\"].result") | |
echo "* $job -> $status" | |
if [[ "$status" != "success" ]]; then | |
all_success=false | |
fi | |
done | |
if [[ "$all_success" == "false" ]]; then | |
echo "One or more dependency jobs failed or were cancelled." | |
exit 1 | |
fi |