Skip to content
120 changes: 72 additions & 48 deletions .buildkite/pipeline.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
steps:

- label: 'Audit current licenses'
- label: "Audit current licenses"
timeout_in_minutes: 30
agents:
queue: macos-14
command: ./scripts/license_finder.sh

- label: 'Build Android Performance test fixture'
- label: "Build Android Performance test fixture"
timeout_in_minutes: 30
key: android-test-fixture
agents:
Expand All @@ -20,7 +20,7 @@ steps:
env:
JAVA_VERSION: 17

- label: 'Build iOS test fixture'
- label: "Build iOS test fixture"
timeout_in_minutes: 30
key: ios-test-fixture
agents:
Expand All @@ -34,7 +34,7 @@ steps:
artifacts#v1.9.0:
upload: "bugsnag-cocoa/features/fixtures/ios/output/iOSTestApp_Release.ipa"

- label: ':docker: Build CI image'
- label: ":docker: Build CI image"
timeout_in_minutes: 30
key: "ci-image"
plugins:
Expand All @@ -47,18 +47,18 @@ steps:
push:
- ci:855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner:${BRANCH_NAME}-ci

- label: 'Unit tests'
- label: "Unit tests"
timeout_in_minutes: 30
depends_on: 'ci-image'
depends_on: "ci-image"
plugins:
docker-compose#v4.14.0:
run: unit-test
image-repository: 855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner
cache-from:
- ci:855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner:${BRANCH_NAME}-ci
command: 'bundle exec rake'
command: "bundle exec rake"

- label: ':docker: Push CLI image for branch'
- label: ":docker: Push CLI image for branch"
key: push-branch-cli
timeout_in_minutes: 30
depends_on: "ci-image"
Expand All @@ -71,91 +71,91 @@ steps:
push:
- cli:855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner:${BRANCH_NAME}-cli

- label: 'Framework tests'
- label: "Framework tests"
timeout_in_minutes: 30
depends_on: "ci-image"
plugins:
- docker-compose#v4.14.0:
run: framework-tests
command: 'bundle exec maze-runner'
command: "bundle exec maze-runner"

- label: 'Comparison tests'
- label: "Comparison tests"
timeout_in_minutes: 10
depends_on: "ci-image"
plugins:
- docker-compose#v4.14.0:
run: comparison-tests
command: 'bundle exec maze-runner'
command: "bundle exec maze-runner"

- label: 'Proxy tests'
- label: "Proxy tests"
timeout_in_minutes: 10
depends_on: "ci-image"
plugins:
- docker-compose#v4.14.0:
run: proxy-tests
command: 'bundle exec maze-runner'
command: "bundle exec maze-runner"

- label: 'CLI tests'
- label: "CLI tests"
timeout_in_minutes: 10
depends_on: "ci-image"
plugins:
- docker-compose#v4.14.0:
run: cli-tests
command: 'bundle exec maze-runner'
command: "bundle exec maze-runner"

- label: 'HTTP response tests'
- label: "HTTP response tests"
timeout_in_minutes: 10
depends_on: "ci-image"
plugins:
- docker-compose#v4.14.0:
run: http-response-tests
command: 'bundle exec maze-runner'
command: "bundle exec maze-runner"

- label: 'Payload helper tests'
- label: "Payload helper tests"
timeout_in_minutes: 10
depends_on: "ci-image"
plugins:
- docker-compose#v4.14.0:
run: payload-helper-tests
command: 'bundle exec maze-runner'
command: "bundle exec maze-runner"

- label: 'Docker tests'
- label: "Docker tests"
timeout_in_minutes: 10
depends_on: "ci-image"
plugins:
- docker-compose#v4.14.0:
run: docker-tests
command: 'bundle exec maze-runner'
command: "bundle exec maze-runner"

- label: 'Doc server tests'
- label: "Doc server tests"
timeout_in_minutes: 10
depends_on: "ci-image"
plugins:
- docker-compose#v4.14.0:
run: doc-server-tests
command: 'bundle exec maze-runner'
command: "bundle exec maze-runner"

- label: 'Exit codes tests'
- label: "Exit codes tests"
timeout_in_minutes: 10
depends_on: "ci-image"
plugins:
- docker-compose#v4.14.0:
run: exit-codes-tests
command: 'bundle exec maze-runner'
command: "bundle exec maze-runner"

- label: 'Command workflow tests'
- label: "Command workflow tests"
timeout_in_minutes: 10
depends_on: "ci-image"
plugins:
- docker-compose#v4.14.0:
run: command-workflow-tests
command: 'bundle exec maze-runner'
command: "bundle exec maze-runner"

#
# BrowserStack tests
#

- label: ':browserstack: iOS 17'
- label: ":browserstack: iOS 17"
timeout_in_minutes: 20
depends_on:
- "ios-test-fixture"
Expand All @@ -181,14 +181,14 @@ steps:
cache-from:
- cli:855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner:${BRANCH_NAME}-cli
concurrency: 5
concurrency_group: 'browserstack-app'
concurrency_group: "browserstack-app"
concurrency_method: eager
retry:
automatic:
- exit_status: 103 # Appium client failure
limit: 2

- label: ':browserstack: Firefox'
- label: ":browserstack: Firefox"
depends_on: "push-branch-cli"
timeout_in_minutes: 10
plugins:
Expand All @@ -202,14 +202,14 @@ steps:
- "--browser=firefox_latest"
- "--fail-fast"
concurrency: 2
concurrency_group: 'browserstack'
concurrency_group: "browserstack"
concurrency_method: eager

#
# BitBar tests
#

- label: ':bitbar: Safari 18'
- label: ":bitbar: Desktop browsers - Safari 18"
depends_on: "push-branch-cli"
timeout_in_minutes: 10
plugins:
Expand All @@ -229,10 +229,34 @@ steps:
- "--fail-fast"
- "--no-tunnel"
concurrency: 25
concurrency_group: 'bitbar'
concurrency_group: "bitbar"
concurrency_method: eager

- label: ":bitbar: iOS Safari"
skip: "Skipped pending PLAT-14618"
depends_on: "push-branch-cli"
timeout_in_minutes: 10
plugins:
artifacts#v1.9.0:
upload: "maze_output/failed/**/*"
docker-compose#v4.14.0:
pull: browser-tests-bitbar
run: browser-tests-bitbar
service-ports: true
use-aliases: true
verbose: true
command:
- "--farm=bb"
- "--browser=safari"
- "--device=IOS_14"
- "--aws-public-ip"
- "--fail-fast"
- "--no-tunnel"
concurrency: 25
concurrency_group: "bitbar"
concurrency_method: eager

- label: ':bitbar: Android'
- label: ":bitbar: Android"
timeout_in_minutes: 20
depends_on:
- "android-test-fixture"
Expand Down Expand Up @@ -260,14 +284,14 @@ steps:
- "features/manual_spans.feature"
image-repository: 855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner
concurrency: 25
concurrency_group: 'bitbar'
concurrency_group: "bitbar"
concurrency_method: eager
retry:
automatic:
- exit_status: 103 # Appium client failure
limit: 2

- label: ':bitbar: Appium API'
- label: ":bitbar: Appium API"
timeout_in_minutes: 20
depends_on:
- "android-test-fixture"
Expand Down Expand Up @@ -296,14 +320,14 @@ steps:
- "--aws-public-ip"
image-repository: 855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner
concurrency: 25
concurrency_group: 'bitbar'
concurrency_group: "bitbar"
concurrency_method: eager
retry:
automatic:
- exit_status: 103 # Appium client failure
limit: 2

- label: ':bitbar: iOS'
- label: ":bitbar: iOS"
timeout_in_minutes: 20
depends_on:
- "ios-test-fixture"
Expand Down Expand Up @@ -332,7 +356,7 @@ steps:
cache-from:
- cli:855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner:${BRANCH_NAME}-cli
concurrency: 25
concurrency_group: 'bitbar'
concurrency_group: "bitbar"
concurrency_method: eager
retry:
automatic:
Expand All @@ -341,16 +365,16 @@ steps:

- wait

- label: 'Update docs'
- label: "Update docs"
if: build.tag =~ /^v[0-9]{1,2}\.[0-9]+\.[0-9]+\$/
agents:
queue: macos-15
commands:
- 'bundle install'
- 'bundle exec rake docs:prepare'
- "bundle install"
- "bundle exec rake docs:prepare"

# Release images are pushed to their own repository so that they don't get aged off.
- label: 'Push Docker image for tag'
# Release images are pushed to their own repository so that they don"t get aged off.
- label: "Push Docker image for tag"
if: build.tag =~ /^v[0-9]{1,2}\.[0-9]+\.[0-9]+\$/
plugins:
- docker-compose#v4.14.0:
Expand All @@ -359,10 +383,10 @@ steps:
- cli:855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner-releases:latest-v10-cli
- cli:855461928731.dkr.ecr.us-west-1.amazonaws.com/maze-runner-releases:latest-cli

- label: 'Push to RubyGems.org'
- label: "Push to RubyGems.org"
if: build.tag =~ /^v[0-9]{1,2}\.[0-9]+\.[0-9]+\$/
agents:
queue: macos-15
commands:
- 'gem build bugsnag-maze-runner.gemspec'
- 'gem push bugsnag-maze-runner-*.gem'
- "gem build bugsnag-maze-runner.gemspec"
- "gem push bugsnag-maze-runner-*.gem"
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# v10.1.0 - TBD

## Enhancements

- Partial support for BitBar mobile browsers [786](https://github.com/bugsnag/maze-runner/pull/786)

# v10.0.0 - 2025/08/26

## Enhancements
Expand Down
2 changes: 1 addition & 1 deletion docs/Getting_Started.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ end

Anywhere a `{field}`, `{path}`, `{key_path}`, etc is denoted, it can be replaced with dot-delimited key path to indicate the path from the root of an object to the intended target.

For example, to match the name of the second objects in the the key `fruits` below, use `fruits.1.name` as the keypath.
For example, to match the name of the second objects in the key `fruits` below, use `fruits.1.name` as the keypath.

```json
{
Expand Down
14 changes: 7 additions & 7 deletions lib/features/support/internal_hooks.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,16 @@

# Infer mode of operation from config, one of:
# - Appium (using either remote or local devices)
# - Browser (Selenium with local or remote browsers)
# - Selenium (Selenium with local or remote browsers)
# - Command (the software under test is invoked with a system call)
# TODO Consider making this a specific command line option defaulting to Appium
is_appium = [:bs, :bb, :local].include?(Maze.config.farm) && !Maze.config.app.nil?
is_browser = !Maze.config.browser.nil?
is_appium = ([:bs, :bb, :local].include?(Maze.config.farm) && !Maze.config.app.nil?) ||
(Maze.config.farm == :bb && !Maze.config.device.nil? && !Maze.config.browser.nil?)
is_browser = Maze.config.device.nil? && !Maze.config.browser.nil?
if is_appium
Maze.mode = :appium
Maze.internal_hooks = Maze::Hooks::AppiumHooks.new
elsif is_browser
Maze.mode = :browser
Maze.mode = :selenium
Maze.internal_hooks = Maze::Hooks::BrowserHooks.new
else
Maze.mode = :command
Expand Down Expand Up @@ -93,7 +93,7 @@

# Skip scenario if the driver it needs has failed
$logger.debug "Before hook - Maze.driver&.failed?: #{Maze.driver&.failed?}"
if (Maze.mode == :appium || Maze.mode == :browser) && Maze.driver.failed?
if (Maze.mode == :appium || Maze.mode == :selenium) && Maze.driver.failed?
$logger.debug "Failing scenario because the #{Maze.mode.to_s} driver failed: #{Maze.driver.failure_reason}"
scenario.fail('Cannot run scenario - driver failed')
end
Expand Down Expand Up @@ -241,7 +241,7 @@ def log_headers(container)

# Fail the scenario if the driver failed, if the scenario hasn't already failed
$logger.debug "After hook 2 - Maze.driver&.failed?: #{Maze.driver&.failed?}"
if (Maze.mode == :appium || Maze.mode == :browser) && Maze.driver.failed? && !scenario.failed?
if (Maze.mode == :appium || Maze.mode == :selenium) && Maze.driver.failed? && !scenario.failed?
$logger.debug "Marking scenario as failed because driver failed: #{Maze.driver.failure_reason}"
Maze.scenario.mark_as_failed Maze.driver.failure_reason
end
Expand Down
2 changes: 1 addition & 1 deletion lib/maze.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
# providing an alternative to the proliferation of global variables or singletons.
module Maze

VERSION = '10.0.0'
VERSION = '10.1.0'

class << self
attr_accessor :check, :driver, :internal_hooks, :mode, :start_time, :dynamic_retry, :public_address,
Expand Down
Loading