import os import sys import dotenv from features.environment import get_app from helpers.integrations import datadog from helpers.reporting.log_analyzer import evaluate_feature_retries from helpers.integrations.browserstack import BrowserstackHelper dotenv.load_dotenv() feature_files = sys.argv[1:] # Validate required environment variables required_env_vars = { "OS": os.getenv("OS"), "BROWSERSTACK_USERNAME": os.getenv("BROWSERSTACK_USERNAME"), "BROWSERSTACK_ACCESS_KEY": os.getenv("BROWSERSTACK_ACCESS_KEY"), } missing_vars = [var for var, val in required_env_vars.items() if not val] if missing_vars: print(f"ERROR: Missing required environment variable(s): " f"{', '.join(missing_vars)}") sys.exit(1) mobile_os = required_env_vars["OS"] bs_helper = BrowserstackHelper( required_env_vars["BROWSERSTACK_USERNAME"], required_env_vars["BROWSERSTACK_ACCESS_KEY"], mobile_os, get_app(mobile_os) ) bs_helper.upload_app() with open(".env", "a") as f: f.write(f"\nBROWSERSTACK_APP_ID={bs_helper.app_url}\n") dotenv.load_dotenv(override=True) os.environ["BROWSERSTACK_APP_ID"] = bs_helper.app_url print("Uploaded app_url:", bs_helper.app_url) quoted_features = " ".join(f"features/{f}" for f in feature_files) tag_expression = os.getenv("TAGS", "") cmd = ( "USE_BROWSERSTACK=true " f"OS={mobile_os} " "browserstack-sdk behave " "--no-logcapture " "--junit --junit-directory=junit " "-f helpers.reporting.cucumber_json:PrettyCucumberJSONFormatter " f"{quoted_features} " "--tags=~@wip " ) if tag_expression: cmd += f"--tags={tag_expression} " print("Running BS SDK:") print(cmd) os.system(cmd) if os.environ.get('JOB_NAME'): datadog.upload_junit_to_datadog() # Merge all execution logs os.system("cat behave_exec_*.log > behave_debug.log") build_ok, summary = evaluate_feature_retries( log_file="behave_debug.log", max_retries=3 ) print("SUMMARY:", summary) if not build_ok: print("❌ Build failed due to repeated failed retries") sys.exit(1) print("✅ Build passed")