run some examples on CI using swiftshader (#1826)

From suggestion from Godot workflows: https://github.com/bevyengine/bevy/issues/1730#issuecomment-810321110

* Add a feature `bevy_debug` that will make Bevy read a debug config file to setup some debug systems
  * Currently, only one that will exit after x frames
  * Could add option to dump screen to image file once that's possible
* Add a job in CI workflow that will run a few examples using [`swiftshader`](https://github.com/google/swiftshader)
  * This job takes around 13 minutes, so doesn't add to global CI duration

|example|number of frames|duration|
|-|-|-|
|`alien_cake_addict`|300|1:50|
|`breakout`|1800|0:44|
|`contributors`|1800|0:43|
|`load_gltf`|300|2:37|
|`scene`|1800|0:44|
This commit is contained in:
François 2021-04-14 21:40:36 +00:00
parent d119c1ce14
commit d868d07d0b
12 changed files with 106 additions and 0 deletions

View file

@ -0,0 +1,3 @@
(
exit_after: Some(300)
)

3
.github/example-run/breakout.ron vendored Normal file
View file

@ -0,0 +1,3 @@
(
exit_after: Some(1800)
)

3
.github/example-run/contributors.ron vendored Normal file
View file

@ -0,0 +1,3 @@
(
exit_after: Some(1800)
)

3
.github/example-run/load_gltf.ron vendored Normal file
View file

@ -0,0 +1,3 @@
(
exit_after: Some(300)
)

3
.github/example-run/scene.ron vendored Normal file
View file

@ -0,0 +1,3 @@
(
exit_after: Some(1800)
)

View file

@ -92,3 +92,39 @@ jobs:
DEFAULT_BRANCH: master
# Not needed here as only one Linter is used.
#GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run-examples:
runs-on: ubuntu-latest
steps:
- name: Install dependencies
run: |
sudo apt-get update;
DEBIAN_FRONTEND=noninteractive sudo apt-get install --no-install-recommends -yq \
libasound2-dev libudev-dev wget unzip xvfb;
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
- name: Setup swiftshader
run: |
wget https://github.com/qarmin/gtk_library_store/releases/download/3.24.0/swiftshader.zip;
unzip swiftshader.zip;
curr="$(pwd)/libvk_swiftshader.so";
sed -i "s|PATH_TO_CHANGE|$curr|" vk_swiftshader_icd.json;
- name: Build bevy
run: |
cargo build --no-default-features --features "bevy_dynamic_plugin,bevy_gilrs,bevy_gltf,bevy_wgpu,bevy_winit,render,png,hdr,x11,bevy_ci_testing"
- name: Run examples
run: |
for example in .github/example-run/*.ron; do
example_name=`basename $example .ron`
echo "running $example_name - "`date`
time CI_TESTING_CONFIG=$example VK_ICD_FILENAMES=$(pwd)/vk_swiftshader_icd.json DRI_PRIME=0 xvfb-run cargo run --example $example_name --no-default-features --features "bevy_dynamic_plugin,bevy_gilrs,bevy_gltf,bevy_wgpu,bevy_winit,render,png,hdr,x11,bevy_ci_testing"
sleep 10
done

View file

@ -75,6 +75,9 @@ x11 = ["bevy_internal/x11"]
# enable rendering of font glyphs using subpixel accuracy
subpixel_glyph_atlas = ["bevy_internal/subpixel_glyph_atlas"]
# enable systems that allow for automated testing on CI
bevy_ci_testing = ["bevy_internal/bevy_ci_testing"]
[dependencies]
bevy_dylib = {path = "crates/bevy_dylib", version = "0.5.0", default-features = false, optional = true}
bevy_internal = {path = "crates/bevy_internal", version = "0.5.0", default-features = false}

View file

@ -14,6 +14,7 @@ keywords = ["bevy"]
[features]
trace = []
bevy_ci_testing = ["ron"]
default = ["bevy_reflect"]
[dependencies]
@ -25,6 +26,8 @@ bevy_utils = { path = "../bevy_utils", version = "0.5.0" }
# other
serde = { version = "1.0", features = ["derive"] }
ron = { version = "0.6.2", optional = true }
[target.'cfg(target_arch = "wasm32")'.dependencies]
wasm-bindgen = { version = "0.2" }

View file

@ -33,6 +33,11 @@ impl Default for AppBuilder {
.add_default_stages()
.add_event::<AppExit>()
.add_system_to_stage(CoreStage::Last, World::clear_trackers.exclusive_system());
#[cfg(feature = "bevy_ci_testing")]
{
crate::ci_testing::setup_app(&mut app_builder);
}
app_builder
}
}

View file

@ -0,0 +1,38 @@
use serde::Deserialize;
use crate::{app::AppExit, AppBuilder};
use bevy_ecs::system::IntoSystem;
/// Configuration for automated testing on CI
#[derive(Deserialize)]
pub struct CiTestingConfig {
/// Number of frames after wich Bevy should exit
pub exit_after: Option<u32>,
}
fn ci_testing_exit_after(
mut current_frame: bevy_ecs::prelude::Local<u32>,
ci_testing_config: bevy_ecs::prelude::Res<CiTestingConfig>,
mut app_exit_events: crate::EventWriter<AppExit>,
) {
if let Some(exit_after) = ci_testing_config.exit_after {
if *current_frame > exit_after {
app_exit_events.send(AppExit);
}
}
*current_frame += 1;
}
pub(crate) fn setup_app(app_builder: &mut AppBuilder) -> &mut AppBuilder {
let filename =
std::env::var("CI_TESTING_CONFIG").unwrap_or_else(|_| "ci_testing_config.ron".to_string());
let config: CiTestingConfig = ron::from_str(
&std::fs::read_to_string(filename).expect("error reading CI testing configuration file"),
)
.expect("error deserializing CI testing configuration file");
app_builder
.insert_resource(config)
.add_system(ci_testing_exit_after.system());
app_builder
}

View file

@ -4,6 +4,9 @@ mod plugin;
mod plugin_group;
mod schedule_runner;
#[cfg(feature = "bevy_ci_testing")]
mod ci_testing;
pub use app::*;
pub use app_builder::*;
pub use bevy_derive::DynamicPlugin;

View file

@ -41,6 +41,9 @@ x11 = ["bevy_winit/x11"]
# enable rendering of font glyphs using subpixel accuracy
subpixel_glyph_atlas = ["bevy_text/subpixel_glyph_atlas"]
# enable systems that allow for automated testing on CI
bevy_ci_testing = ["bevy_app/bevy_ci_testing"]
[dependencies]
# bevy
bevy_app = { path = "../bevy_app", version = "0.5.0" }