CI/CD and DevOps testing use cases for Kane CLI: gate a deploy in GitHub Actions, monitor production on a schedule, check the UI before a pull request, run suites in parallel, and move suites to the cloud grid.
A browser check is most useful when it runs without anyone asking for it: on every pull request, before every deploy, and on a schedule against production. These use cases put Kane CLI into that loop, so a broken flow stops a merge or a deploy and the evidence for the failure is attached to the job.Every Kane CLI command returns a standard exit code, 0 passed, 1 failed, 2 an auth, setup, or parse error, and 3 a timeout or cancellation, so any CI system can act on the result. See CI/CD Integration for GitHub Actions, GitLab CI, Jenkins, Bitbucket Pipelines, and Docker.
A deploy that passes unit tests can still ship a checkout that never loads. In this recording, a GitHub Actions workflow installs Kane CLI, runs four browser flows against the live deploy from a smoke script, and uploads the evidence pack as an artifact, with all four flows passing.
Store your username and access key as repository secrets named LT_USERNAME and LT_ACCESS_KEY, under Settings > Secrets and variables > Actions.
Add a workflow that installs Chrome and Kane CLI and runs your flows headless:
Tag the _test.md files that guard the release with tags: [smoke], so the workflow picks them up.
Push a commit. The job fails on any non-zero exit code, which blocks the deploy step that follows it.
Open the uploaded evidence pack when a flow fails, to see the failing step’s screenshot, console log, and network log.
For a shorter setup, use the official GitHub Action, LambdaTest/kane-cli/integrations/github-action/kane-cli-browser-run@main. It installs everything, runs an objective or a glob of _test.md files, uploads the evidence, and posts the verdict on the pull request. See GitHub Actions.
Uptime checks confirm a server answers, while synthetic monitoring confirms a customer can still sign in and pay. This full walkthrough builds a synthetic monitor for a production app in GitHub Actions: the first scheduled run passes, a price change in the app then breaks the checkout journey, the next run fails and sends an alert email, and the run after the fix passes again.
Write each critical journey as one Kane CLI run in a shell script. The script stops with exit code 1 on the first broken journey, which fails the job:
tests/synthetic.sh
#!/bin/bash# Synthetic monitoring: critical production journeys.VARS="./tests/variables.json"run_test() { local name="$1" local objective="$2" echo "=== Monitoring: $name ===" if kane-cli run "$objective" \ --variables-file "$VARS" \ --username "$LT_USERNAME" \ --access-key "$LT_ACCESS_KEY" \ --agent --headless \ --timeout 120 --max-steps 20; then echo "OK: $name" else echo "ALERT: $name is broken in production (exit $?)" exit 1 fi}run_test "Login page reachable" \ "go to {{app_url}}, assert the page contains 'Ship your idea faster', assert the navigation contains 'Pricing'"run_test "Money path: checkout total" \ "go to {{app_url}}, click the 'Buy Pro' button, assert the page contains 'Total due today', assert the total due today shows '\$19.00'"echo "All critical journeys healthy."
Keep the production URL and expected values in a variables file, so the same script can watch staging by swapping one file:
Trigger the first run by hand from the Actions tab with Run workflow, which workflow_dispatch enables, and confirm both journeys pass before you rely on the schedule.
When a journey breaks, the job log shows which assertion failed and the value Kane CLI found. In the recording, the checkout page shows a different total from the expected $19.00, so the money path fails and the alert email arrives a few minutes later.
Open the synthetic-monitor-logs artifact from the failed run to see the screenshot, console log, and network log for the failing step, then fix the app and rerun the workflow.
Use the same pattern with any alerting tool your team already uses, such as a Slack or PagerDuty step, by replacing the email step and keeping if: failure(). Point purchase journeys at a test account or a sandbox payment method, so the monitor never places a real order.
When the list grows past a few journeys, commit each one as a _test.md file tagged monitor and replace the script with kane-cli testrun run --tags monitor --headless --username "$LT_USERNAME" --access-key "$LT_ACCESS_KEY". Committed tests replay from their recordings, so a frequent schedule does not call the model unless a step has to be re-authored after the page changes.
The cheapest place to catch a broken flow is on the machine that broke it. In this recording, a verify.sh script wraps one Kane CLI run that signs in, creates a project, and checks that the project appears in the sidebar, and the developer runs it with npm run verify:create-project before opening a pull request.
Write the check as a script in your repo:
verify.sh
#!/bin/shkane-cli run --agent --headless --timeout 90 --name create-project \ "Go to http://localhost:3000/login, sign in as {{email}} with password {{password}}, click 'New project', fill the name 'Smoke', click Create, and verify the project appears in the sidebar"
Add it to package.json as "verify:create-project": "./verify.sh", so anyone on the team, or a coding agent, runs it the same way.
Run it against your local server before you push. The script exits with Kane CLI’s exit code, so a failure stops a pre-push hook.
Tell your coding agent the rule once, for example “Run npm run verify:create-project before you open a PR, and don’t open it if the check fails.” See AI Coding Agents.
Run the same script in CI, so the local result and the pipeline result come from one command.
Looping over test files in a shell script gives you many exit codes and many evidence folders. kane-cli testrun run runs a selection of _test.md files as one execution with one exit code and one sealed evidence pack.
Select tests by tag or by path, for example --tags smoke,checkout or --match '^tests/web/'.
Add --parallel 4 to run four tests at a time. Each worker launches its own Chrome, so size the number to your runner.
Add --on-failure fail-fast when one failure should stop the rest, or leave the default continue to collect every result.
Preview the plan without running anything using --dry-run.
Archive .testmuai/evidence/*.evidence as the job artifact, so anyone can open the run in the hosted viewer.
A CI runner without Chrome, Xcode, or Android Studio can still run your browser and app suites. kane-cli testrun run --remote turns the suite into one HyperExecute job on the cloud grid and returns the recordings and the evidence pack to your checkout.
Install the plugin once with kane-cli plugin install remote-execution.
Run a web suite on four grid runners with kane-cli testrun run --match '^tests/web/' --remote --parallel 4.
Run a mobile suite from a Linux runner by adding a grid device, for example --remote --device-name "Pixel 7" --os-version 14. List the devices the grid can provide with kane-cli devices list --target emulator --remote.
Keep web and mobile tests in separate runs, and allow a timeout of about ten minutes for the first job.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"TestMu AI","colors":{"primary":"#c24e00","light":"#c24e00","dark":"#c24e00"},"logo":{"light":"https://mintcdn.com/lambdatest-f4bdd228/vjKoxtouKdApUfYX/logo/light.svg?fit=max\u0026auto=format\u0026n=vjKoxtouKdApUfYX\u0026q=85\u0026s=99f56597c24dac27d2534aa7dc97b091","dark":"https://mintcdn.com/lambdatest-f4bdd228/vjKoxtouKdApUfYX/logo/dark.svg?fit=max\u0026auto=format\u0026n=vjKoxtouKdApUfYX\u0026q=85\u0026s=f48ddd9629a7dfb903fc1064c968e156","href":"https://www.testmuai.com/"},"favicon":"https://mintcdn.com/lambdatest-f4bdd228/fK8SOl8ij3xBGHLU/favicon.ico?fit=max\u0026auto=format\u0026n=fK8SOl8ij3xBGHLU\u0026q=85\u0026s=33d14ec4a5a8ea46ed0892fe26b0c5b0","api":{"playground":{"proxy":false}},"appearance":{"default":"light"},"navbar":{"links":[{"icon":"github","href":"https://github.com/LambdaTest/","label":"GitHub"},{"href":"https://www.testmuai.com/login/","label":"Login"}],"primary":{"type":"button","label":"Get Started Free","href":"https://www.testmuai.com/register/"}},"footer":{"socials":{"facebook":"https://www.facebook.com/testmuai","x":"https://x.com/kane_cli","github":"https://github.com/LambdaTest/kane-cli","linkedin":"https://www.linkedin.com/company/testmu-ai","youtube":"https://www.youtube.com/@TestMuAI"}},"seo":{"metatags":{"canonical":"https://www.testmuai.com"}},"fonts":{"heading":{"family":"SF Pro, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif"},"body":{"family":"SF Pro, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif"}},"integrations":{"gtm":{"tagId":"GTM-5M2PF5TP"},"telemetry":{"enabled":false}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Back to TestMu AI Docs","icon":"arrow-left","href":"https://www.testmuai.com/support/docs/"},{"anchor":"Status","icon":"signal","href":"https://status.lambdatest.io/"},{"anchor":"Blog","icon":"newspaper","href":"https://www.testmuai.com/blog/"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"lambdatest-f4bdd228","hasAudioNarration":false,"actualSubdomain":"lambdatest-f4bdd228","customDomains":["www.testmuai.com"],"gitSource":{"type":"github","owner":"lambdatest","repo":"documentation","deployBranch":"stage-mintlify","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae9b79ee52981415f8c15cf","collectionId":"4417c16c-a29d-426d-8de4-5a0396e6ccce","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae9b79ee52981415f8c15cf"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"DISABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"DISABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae9b79ee52981415f8c15cf","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"Docs","count":70},{"language":"default","tag":"Kane CLI","count":70},{"language":"default","tag":"Core Concepts","count":12},{"language":"default","tag":"Checkpoints","count":12},{"language":"default","tag":"Use Cases","count":11},{"language":"default","tag":"Assurance","count":8},{"language":"default","tag":"DevTools","count":7},{"language":"default","tag":"Evidence","count":7},{"language":"default","tag":"Reference","count":5},{"language":"default","tag":"CI/CD \u0026 Skills","count":4}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"support@lambdatest.com","showHelpButton":true}},"basePath":"/docs","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"global.css","content":"/* cyrillic-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggqxSuXd.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggOxSuXd.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggSxSuXd.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggixSuXd.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggmxSuXd.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggexSg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggqxSuXd.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggOxSuXd.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggSxSuXd.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggixSuXd.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggmxSuXd.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggexSg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggqxSuXd.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggOxSuXd.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggSxSuXd.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggixSuXd.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggmxSuXd.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/docs/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggexSg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n.no-link a,.project-management-tools,a{text-decoration:none!important}.no-link a{border:0!important}.project-management-tools{margin:20px auto;border:.8px solid #5e5c5c;border-radius:10px;padding:20px;align-items:flex-start;box-sizing:border-box}.plugins-and-extensions{margin:20px auto;border-bottom:.5px solid #eaeaea;padding-bottom:15px;text-decoration:none!important}.lt-bottom-cta{background:#e2eeff;border-radius:6px;padding:70px 30px;margin:20px 0 40px;position:relative;width:100%}.lt-bottom-cta .lt-cta-content{width:50%}.lt-bottom-cta .lt-cta-content h2{color:#041227;margin:0 0 10px;font-size:20px;font-weight:700;line-height:1.4}.lt-bottom-cta .lt-cta-btn{display:inline-block;background:#c24e00;color:#fff;padding:10px 18px;border-radius:3.75px;text-decoration:none;font-weight:600;font-size:16px;border:0;cursor:pointer;transition:background .2s ease}.lt-bottom-cta .lt-cta-btn:hover{background:#c95100}.lt-bottom-cta .lt-cta-image{width:50%;position:absolute;right:0;bottom:0}.lt-bottom-cta .lt-cta-image img{width:auto;height:auto;max-width:100%}@media (min-width:1025px) and (max-width:1250px){.lt-bottom-cta{padding:40px 30px}}@media (min-width:1251px) and (max-width:1366px){.lt-bottom-cta{padding:50px 30px}.lt-bottom-cta .lt-cta-content h2{font-size:16px}}@media (min-width:1450px) and (max-width:1550px){.lt-bottom-cta{padding:60px 30px}}@media (max-width:1024px){.lt-bottom-cta{padding:25px 30px}.lt-bottom-cta .lt-cta-content{width:100%}.lt-bottom-cta .lt-cta-image{display:none}}.lt-help-support{margin:40px 0;padding-top:30px;border-top:1px solid #e5e7eb}.lt-help-support h3{font-size:28px;font-weight:700;color:#1a1a2e;margin:0 0 25px}.lt-help-support-content{display:flex;gap:80px;flex-wrap:wrap}.lt-help-column{flex:0 0 auto}.lt-help-column-title{font-size:16px;font-weight:500;color:#1a1a2e;margin:0 0 15px}.lt-feedback-buttons{display:flex;gap:10px}.lt-feedback-btn,.lt-feedback-form label{display:flex;align-items:center;cursor:pointer}.lt-feedback-btn{width:44px;height:44px;border:1px solid #e5e7eb;border-radius:8px;background:#fff;justify-content:center;transition:all .2s ease}.lt-feedback-btn:hover{border-color:#c24e00;background:#fff5f0}.lt-feedback-btn svg{width:20px;height:20px;color:#6b7280}.lt-help-links{display:flex;flex-direction:column;gap:12px}.lt-feedback-form button[type=submit],.lt-help-link{border:0;font-size:15px;font-weight:500;cursor:pointer}.lt-help-link{display:inline-flex;align-items:center;gap:10px;color:#06c;text-decoration:none;background:0 0;padding:0}.lt-help-link:hover{color:#004999;text-decoration:underline}.lt-help-link svg{width:18px;height:18px;color:#06c}@media (max-width:600px){.lt-help-support-content{gap:30px}}.lt-feedback-form{background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:30px;margin-top:25px;box-shadow:0 1px 3px rgba(0,0,0,.1)}.lt-feedback-form label{gap:10px;font-size:15px;color:#374151}.lt-feedback-form input[type=radio]{width:18px;height:18px;cursor:pointer}.lt-feedback-form textarea{width:100%;min-height:100px;padding:12px;border:1px solid #e5e7eb;border-radius:8px;font-size:14px;font-family:inherit;resize:vertical}.lt-feedback-form button[type=submit]{background:#1a1a2e;color:#fff;padding:12px 24px;border-radius:6px;transition:background .2s ease}.lt-feedback-form button[type=submit]:hover{background:#2d2d4a}#feedback,header [class*=nav-tabs],nav [class*=nav-tabs-item]{display:none!important}.lt-sidebar-bottom{padding:0 0 12px;border-top:1px solid #e5e7eb;margin-top:8px}:is(.dark) .lt-sidebar-bottom{border-top-color:rgba(255,255,255,.07)}.lt-sidebar-bottom ul{list-style:none;padding:0;margin:0}.kane_cli_cta,.kane_cli_cta_box{position:relative;overflow:hidden}.kane_cli_cta{--kane-cli-font:'Manrope', 'SF Pro', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;--kane-cli-ink:#121212;width:100%;margin:20px 0 40px;padding:0;background:var(--kane-cli-ink) url(https://assets.testmu.ai/resources/images/Terminal-KaneCLIBg.png) center/cover no-repeat}.kane_cli_cta_box{display:flex;align-items:center;margin:24px;background:#fff}.kane_cli_cta .kane_cli_cta_content{position:relative;box-sizing:border-box;width:55%;padding:20px}.kane_cli_cta .kane_cli_cta_content button.demoBtn,.kane_cli_cta .kane_cli_cta_content h2,.kane_cli_cta .kane_cli_cta_content p{font-family:var(--kane-cli-font)}.kane_cli_cta .kane_cli_cta_content h2{margin:0 0 4px;font-size:20px;font-weight:500;line-height:28px;letter-spacing:-.5px;text-wrap:balance;color:var(--kane-cli-ink)}.kane_cli_cta .kane_cli_cta_content p{max-width:240px;margin:0 0 18px;font-size:14px;font-weight:400;line-height:21px;color:#4d4d4d}.kane_cli_cta .kane_cli_cta_content button.demoBtn{display:inline-flex;align-items:center;justify-content:center;gap:8px;box-sizing:border-box;width:auto;height:32px;padding:12px;border:1px solid rgba(31,35,40,.15);border-radius:6px;outline:0;background:var(--kane-cli-ink);filter:drop-shadow(0 1px 0 rgba(31,35,40,.04));font-size:12px;font-weight:600;line-height:16px;color:#fff;white-space:nowrap;cursor:pointer}.kane_cli_cta .kane_cli_cta_content button.demoBtn::after{content:'';flex-shrink:0;width:8px;height:8px;background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10.2857' height='10.2857' viewBox='0 0 10.2857 10.2857' fill='none'%3E%3Cpath d='M0.642857 5.14286H9.64286M5.14286 0.642857L9.64286 5.14286L5.14286 9.64286' stroke='white' stroke-width='1.28571' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\") center/10.2857px 10.2857px no-repeat}.kane_cli_cta .kane_cli_cta_terminal{position:absolute;z-index:1;right:0;bottom:0;width:320px;max-width:none;height:auto}.kane_cli_cta .kane_cli_cta_icon{position:absolute;z-index:0;top:12px;left:40%;width:22%;max-width:none;height:auto;pointer-events:none}@media (max-width:660px),(min-width:1280px) and (max-width:1440px){.kane_cli_cta_box{flex-direction:column;align-items:stretch;margin:16px}.kane_cli_cta .kane_cli_cta_content{width:100%;padding:20px 20px 16px}.kane_cli_cta .kane_cli_cta_terminal{position:static;align-self:flex-end;width:80%}.kane_cli_cta .kane_cli_cta_icon{display:none}}@media (min-width:1280px) and (max-width:1440px){.kane_cli_cta .kane_cli_cta_terminal{display:none}}.demo_popup_overlay{position:fixed!important;inset:0;z-index:99999;display:none;box-sizing:border-box;padding:20px;overflow-y:auto}.demo_popup_header_demo{background:#4d4d4da3;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px)}.demo_popup_close,.demo_popup_overlay .content,.demo_popup_overlay.shown{display:flex;align-items:center;justify-content:center}.demo_popup_overlay .content{width:100%;text-align:left}.demo_popup_header_demo .demo_popup_box{position:relative;width:90%;max-width:550px;max-height:calc(100vh - 40px);margin:20px auto;padding:40px;overflow-y:auto;background-color:#fff}.demo_popup_close{position:absolute;top:16px;right:16px;z-index:10;width:24px;height:24px;font-size:32px;line-height:1;color:#000;cursor:pointer}.demo_popup_close:hover{color:#333}.demo_popup_form_title{margin-bottom:24px;font-size:24px;font-weight:500;line-height:32px;letter-spacing:-1px;text-align:center;color:#000}.demo_popup_form label{display:block;font-size:14px;font-weight:500;line-height:22px;color:#333;cursor:pointer}.demo_popup_grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.demo_popup_field{margin-top:16px}.demo_popup_phone_row{display:flex;align-items:center;gap:8px}.demo_popup_form input,.demo_popup_form select,.demo_popup_form textarea,.demo_popup_select{height:38px;margin-top:4px;padding:0 12px;border:1px solid #d3d2cd;border-radius:4px;background-color:#fff;font-size:14px;font-weight:400;line-height:22px;color:#4d4d4d}.demo_popup_form textarea{height:65px;padding:12px;resize:none}.demo_popup_form input,.demo_popup_form select,.demo_popup_form textarea{box-sizing:border-box;width:100%;font-family:inherit}.demo_popup_form input::placeholder,.demo_popup_form textarea::placeholder{color:#4d4d4d}.demo_popup_form input:focus-visible,.demo_popup_form select:focus-visible,.demo_popup_form textarea:focus-visible{outline:0;border-color:#000}.demo_popup_error{margin-top:5px;font-size:12px;color:#ef4444}.demo_popup_action{text-align:center}.demo_popup_submit{width:100%;margin-top:12px;padding:8px 12px;border:0;border-radius:4px;background-color:#000;font-size:14px;font-weight:500;line-height:22px;color:#fff;cursor:pointer}.demo_popup_submit:disabled{background-color:#5f5e5e;cursor:not-allowed}.demo_popup_submit:hover{background-color:#3c3c3c}.demo_popup_select_wrapper{position:relative}.demo_popup_select{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;cursor:pointer;transition:border-color .2s ease}.demo_popup_product_select{width:100%}.demo_popup_select_open{border-color:#000}.demo_popup_select_text{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.demo_popup_select_arrow{display:flex;flex-shrink:0;align-items:center;margin-left:8px;color:#4d4d4d;transition:transform .2s ease}.demo_popup_select_open .demo_popup_select_arrow{transform:rotate(180deg)}.demo_popup_select_options{position:absolute;top:46px;right:0;left:0;z-index:1000;min-width:200px;max-height:200px;margin:0;padding:0;overflow-y:auto;border:1px solid #d3d2cd;background:#fff;list-style:none}.demo_popup_select_option{padding:4px 12px;font-size:12px;font-weight:400;line-height:22px;color:#4d4d4d;cursor:pointer;transition:background-color .2s ease}.demo_popup_select_option:hover{background-color:#f5f5f5}.demo_popup_select_option_selected{background-color:#f0f0f0;font-weight:500}@media (max-width:1400px){.demo_popup_header_demo .demo_popup_box{padding:30px}.demo_popup_form_title{margin-bottom:16px;font-size:20px}}@media (max-width:768px){.demo_popup_header_demo .demo_popup_box{padding:30px 20px}.demo_popup_close{top:10px;right:10px}.demo_popup_field{margin-top:8px}}"}],"page":{"pagePath":"docs/kane-cli-cicd-devops-testing","slug":"/docs/kane-cli-cicd-devops-testing","pageMetadata":{"title":"CI/CD and DevOps Testing Use Cases","sidebarTitle":"CI/CD \u0026 DevOps","description":"CI/CD and DevOps testing use cases for Kane CLI: gate a deploy in GitHub Actions, monitor production on a schedule, check the UI before a pull request, run suites in parallel, and move suites to the cloud grid.","keywords":["kane cli ci/cd","deploy gate testing","synthetic monitoring","github actions browser testing","pre-pr checks","kane cli","kaneai","testmu ai"],"og:description":"CI/CD and DevOps testing use cases for Kane CLI: gate a deploy in GitHub Actions, monitor production on a schedule, check the UI before a pull request, run suites in parallel, and move suites to the cloud grid.","href":"/docs/kane-cli-cicd-devops-testing"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"CI/CD and DevOps testing use cases for Kane CLI: gate a deploy in GitHub Actions, monitor production on a schedule, check the UI before a pull request, run suites in parallel, and move suites to the cloud grid.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const KaneCliCta=()=>{const productType=`Kane-CLI`;const productList=[{value:0,type:`Online-Browser-Testing`,label:`Online Browser Testing`},{value:1,type:`Selenium-Testing`,label:`Selenium Testing`},{value:2,type:`Cypress-Testing`,label:`Cypress Testing`},{value:3,type:`Hyperexecute`,label:`HyperExecute`},{value:4,type:`Kane-AI`,label:`KaneAI`},{value:5,type:`On-Premise-Selenium-Grid`,label:`On-premise Selenium Grid`},{value:6,type:`Mobile-App-Testing`,label:`Native App Testing`},{value:7,type:`Real-Device-Cloud`,label:`Real Device Cloud`},{value:8,type:`Smart-Visual-Testing`,label:`Visual Regression Cloud`},{value:9,type:`Appium`,label:`Appium`},{value:10,type:`Enterprise`,label:`Enterprise`},{value:11,type:`Test-Manager`,label:`Test Manager`},{value:12,type:`Professional-Services`,label:`Professional Services`},{value:13,type:`Accessibility-Testing`,label:`Accessibility Testing`},{value:14,type:`Agent Testing`,label:`Agent Testing`},{value:15,type:`Browser-Cloud`,label:`Browser Cloud`},{value:16,type:`Kane-CLI`,label:`Kane CLI`},{value:`Other`,type:`Other`,label:`Other`}];const countryList=[{country_code:`US`,value:`1`,name:`USA (+1)`},{country_code:`GB`,value:`44`,name:`UK (+44)`},{country_code:`DZ`,value:`213`,name:`Algeria (+213)`},{country_code:`AD`,value:`376`,name:`Andorra (+376)`},{country_code:`AO`,value:`244`,name:`Angola (+244)`},{country_code:`AI`,value:`1264`,name:`Anguilla (+1264)`},{country_code:`AG`,value:`1268`,name:`Antigua \u0026amp; Barbuda (+1268)`},{country_code:`AR`,value:`54`,name:`Argentina (+54)`},{country_code:`AM`,value:`374`,name:`Armenia (+374)`},{country_code:`AW`,value:`297`,name:`Aruba (+297)`},{country_code:`AU`,value:`61`,name:`Australia (+61)`},{country_code:`AT`,value:`43`,name:`Austria (+43)`},{country_code:`AZ`,value:`994`,name:`Azerbaijan (+994)`},{country_code:`BS`,value:`1242`,name:`Bahamas (+1242)`},{country_code:`BH`,value:`973`,name:`Bahrain (+973)`},{country_code:`BD`,value:`880`,name:`Bangladesh (+880)`},{country_code:`BB`,value:`1246`,name:`Barbados (+1246)`},{country_code:`BY`,value:`375`,name:`Belarus (+375)`},{country_code:`BE`,value:`32`,name:`Belgium (+32)`},{country_code:`BZ`,value:`501`,name:`Belize (+501)`},{country_code:`BJ`,value:`229`,name:`Benin (+229)`},{country_code:`BM`,value:`1441`,name:`Bermuda (+1441)`},{country_code:`BT`,value:`975`,name:`Bhutan (+975)`},{country_code:`BO`,value:`591`,name:`Bolivia (+591)`},{country_code:`BA`,value:`387`,name:`Bosnia Herzegovina (+387)`},{country_code:`BW`,value:`267`,name:`Botswana (+267)`},{country_code:`BR`,value:`55`,name:`Brazil (+55)`},{country_code:`BN`,value:`673`,name:`Brunei (+673)`},{country_code:`BG`,value:`359`,name:`Bulgaria (+359)`},{country_code:`BF`,value:`226`,name:`Burkina Faso (+226)`},{country_code:`BI`,value:`257`,name:`Burundi (+257)`},{country_code:`KH`,value:`855`,name:`Cambodia (+855)`},{country_code:`CM`,value:`237`,name:`Cameroon (+237)`},{country_code:`CA`,value:`1`,name:`Canada (+1)`},{country_code:`CV`,value:`238`,name:`Cape Verde Islands (+238)`},{country_code:`KY`,value:`1345`,name:`Cayman Islands (+1345)`},{country_code:`CF`,value:`236`,name:`Central African Republic (+236)`},{country_code:`CL`,value:`56`,name:`Chile (+56)`},{country_code:`CN`,value:`86`,name:`China (+86)`},{country_code:`CO`,value:`57`,name:`Colombia (+57)`},{country_code:`KM`,value:`269`,name:`Comoros (+269)`},{country_code:`CG`,value:`242`,name:`Congo (+242)`},{country_code:`CK`,value:`682`,name:`Cook Islands (+682)`},{country_code:`CR`,value:`506`,name:`Costa Rica (+506)`},{country_code:`HR`,value:`385`,name:`Croatia (+385)`},{country_code:`CU`,value:`53`,name:`Cuba (+53)`},{country_code:`CY`,value:`90392`,name:`Cyprus North (+90392)`},{country_code:`CY`,value:`357`,name:`Cyprus South (+357)`},{country_code:`CZ`,value:`42`,name:`Czech Republic (+42)`},{country_code:`DK`,value:`45`,name:`Denmark (+45)`},{country_code:`DJ`,value:`253`,name:`Djibouti (+253)`},{country_code:`DM`,value:`1809`,name:`Dominica (+1809)`},{country_code:`DO`,value:`1809`,name:`Dominican Republic (+1809)`},{country_code:`EC`,value:`593`,name:`Ecuador (+593)`},{country_code:`EG`,value:`20`,name:`Egypt (+20)`},{country_code:`SV`,value:`503`,name:`El Salvador (+503)`},{country_code:`GQ`,value:`240`,name:`Equatorial Guinea (+240)`},{country_code:`ER`,value:`291`,name:`Eritrea (+291)`},{country_code:`EE`,value:`372`,name:`Estonia (+372)`},{country_code:`ET`,value:`251`,name:`Ethiopia (+251)`},{country_code:`FK`,value:`500`,name:`Falkland Islands (+500)`},{country_code:`FO`,value:`298`,name:`Faroe Islands (+298)`},{country_code:`FJ`,value:`679`,name:`Fiji (+679)`},{country_code:`FI`,value:`358`,name:`Finland (+358)`},{country_code:`FR`,value:`33`,name:`France (+33)`},{country_code:`GF`,value:`594`,name:`French Guiana (+594)`},{country_code:`PF`,value:`689`,name:`French Polynesia (+689)`},{country_code:`GA`,value:`241`,name:`Gabon (+241)`},{country_code:`GM`,value:`220`,name:`Gambia (+220)`},{country_code:`GE`,value:`7880`,name:`Georgia (+7880)`},{country_code:`DE`,value:`49`,name:`Germany (+49)`},{country_code:`GH`,value:`233`,name:`Ghana (+233)`},{country_code:`GI`,value:`350`,name:`Gibraltar (+350)`},{country_code:`GR`,value:`30`,name:`Greece (+30)`},{country_code:`GL`,value:`299`,name:`Greenland (+299)`},{country_code:`GD`,value:`1473`,name:`Grenada (+1473)`},{country_code:`GP`,value:`590`,name:`Guadeloupe (+590)`},{country_code:`GU`,value:`671`,name:`Guam (+671)`},{country_code:`GT`,value:`502`,name:`Guatemala (+502)`},{country_code:`GN`,value:`224`,name:`Guinea (+224)`},{country_code:`GW`,value:`245`,name:`Guinea - Bissau (+245)`},{country_code:`GY`,value:`592`,name:`Guyana (+592)`},{country_code:`HT`,value:`509`,name:`Haiti (+509)`},{country_code:`HN`,value:`504`,name:`Honduras (+504)`},{country_code:`HK`,value:`852`,name:`Hong Kong (+852)`},{country_code:`HU`,value:`36`,name:`Hungary (+36)`},{country_code:`IS`,value:`354`,name:`Iceland (+354)`},{country_code:`IN`,value:`91`,name:`India (+91)`},{country_code:`ID`,value:`62`,name:`Indonesia (+62)`},{country_code:`IR`,value:`98`,name:`Iran (+98)`},{country_code:`IQ`,value:`964`,name:`Iraq (+964)`},{country_code:`IE`,value:`353`,name:`Ireland (+353)`},{country_code:`IL`,value:`972`,name:`Israel (+972)`},{country_code:`IT`,value:`39`,name:`Italy (+39)`},{country_code:`JM`,value:`1876`,name:`Jamaica (+1876)`},{country_code:`JP`,value:`81`,name:`Japan (+81)`},{country_code:`JO`,value:`962`,name:`Jordan (+962)`},{country_code:`KZ`,value:`7`,name:`Kazakhstan (+7)`},{country_code:`KE`,value:`254`,name:`Kenya (+254)`},{country_code:`KI`,value:`686`,name:`Kiribati (+686)`},{country_code:`KP`,value:`850`,name:`Korea North (+850)`},{country_code:`KR`,value:`82`,name:`Korea South (+82)`},{country_code:`KW`,value:`965`,name:`Kuwait (+965)`},{country_code:`KG`,value:`996`,name:`Kyrgyzstan (+996)`},{country_code:`LA`,value:`856`,name:`Laos (+856)`},{country_code:`LV`,value:`371`,name:`Latvia (+371)`},{country_code:`LB`,value:`961`,name:`Lebanon (+961)`},{country_code:`LS`,value:`266`,name:`Lesotho (+266)`},{country_code:`LR`,value:`231`,name:`Liberia (+231)`},{country_code:`LY`,value:`218`,name:`Libya (+218)`},{country_code:`LI`,value:`417`,name:`Liechtenstein (+417)`},{country_code:`LT`,value:`370`,name:`Lithuania (+370)`},{country_code:`LU`,value:`352`,name:`Luxembourg (+352)`},{country_code:`MO`,value:`853`,name:`Macao (+853)`},{country_code:`MK`,value:`389`,name:`Macedonia (+389)`},{country_code:`MG`,value:`261`,name:`Madagascar (+261)`},{country_code:`MW`,value:`265`,name:`Malawi (+265)`},{country_code:`MY`,value:`60`,name:`Malaysia (+60)`},{country_code:`MV`,value:`960`,name:`Maldives (+960)`},{country_code:`ML`,value:`223`,name:`Mali (+223)`},{country_code:`MT`,value:`356`,name:`Malta (+356)`},{country_code:`MH`,value:`692`,name:`Marshall Islands (+692)`},{country_code:`MQ`,value:`596`,name:`Martinique (+596)`},{country_code:`MR`,value:`222`,name:`Mauritania (+222)`},{country_code:`YT`,value:`269`,name:`Mayotte (+269)`},{country_code:`MX`,value:`52`,name:`Mexico (+52)`},{country_code:`FM`,value:`691`,name:`Micronesia (+691)`},{country_code:`MD`,value:`373`,name:`Moldova (+373)`},{country_code:`MC`,value:`377`,name:`Monaco (+377)`},{country_code:`MN`,value:`976`,name:`Mongolia (+976)`},{country_code:`MS`,value:`1664`,name:`Montserrat (+1664)`},{country_code:`MA`,value:`212`,name:`Morocco (+212)`},{country_code:`MZ`,value:`258`,name:`Mozambique (+258)`},{country_code:`MN`,value:`95`,name:`Myanmar (+95)`},{country_code:`NA`,value:`264`,name:`Namibia (+264)`},{country_code:`NR`,value:`674`,name:`Nauru (+674)`},{country_code:`NP`,value:`977`,name:`Nepal (+977)`},{country_code:`NL`,value:`31`,name:`Netherlands (+31)`},{country_code:`NC`,value:`687`,name:`New Caledonia (+687)`},{country_code:`NZ`,value:`64`,name:`New Zealand (+64)`},{country_code:`NI`,value:`505`,name:`Nicaragua (+505)`},{country_code:`NE`,value:`227`,name:`Niger (+227)`},{country_code:`NG`,value:`234`,name:`Nigeria (+234)`},{country_code:`NU`,value:`683`,name:`Niue (+683)`},{country_code:`NF`,value:`672`,name:`Norfolk Islands (+672)`},{country_code:`NP`,value:`670`,name:`Northern Marianas (+670)`},{country_code:`NO`,value:`47`,name:`Norway (+47)`},{country_code:`OM`,value:`968`,name:`Oman (+968)`},{country_code:`PW`,value:`680`,name:`Palau (+680)`},{country_code:`PK`,value:`+92`,name:`Pakistan (+92)`},{country_code:`PA`,value:`507`,name:`Panama (+507)`},{country_code:`PG`,value:`675`,name:`Papua New Guinea (+675)`},{country_code:`PY`,value:`595`,name:`Paraguay (+595)`},{country_code:`PE`,value:`51`,name:`Peru (+51)`},{country_code:`PH`,value:`63`,name:`Philippines (+63)`},{country_code:`PL`,value:`48`,name:`Poland (+48)`},{country_code:`PT`,value:`351`,name:`Portugal (+351)`},{country_code:`PR`,value:`1787`,name:`Puerto Rico (+1787)`},{country_code:`QA`,value:`974`,name:`Qatar (+974)`},{country_code:`RE`,value:`262`,name:`Reunion (+262)`},{country_code:`RO`,value:`40`,name:`Romania (+40)`},{country_code:`RU`,value:`7`,name:`Russia (+7)`},{country_code:`RW`,value:`250`,name:`Rwanda (+250)`},{country_code:`SM`,value:`378`,name:`San Marino (+378)`},{country_code:`ST`,value:`239`,name:`Sao Tome \u0026amp; Principe (+239)`},{country_code:`SA`,value:`966`,name:`Saudi Arabia (+966)`},{country_code:`SN`,value:`221`,name:`Senegal (+221)`},{country_code:`CS`,value:`381`,name:`Serbia (+381)`},{country_code:`SC`,value:`248`,name:`Seychelles (+248)`},{country_code:`SL`,value:`232`,name:`Sierra Leone (+232)`},{country_code:`SG`,value:`65`,name:`Singapore (+65)`},{country_code:`SK`,value:`421`,name:`Slovak Republic (+421)`},{country_code:`SI`,value:`386`,name:`Slovenia (+386)`},{country_code:`SB`,value:`677`,name:`Solomon Islands (+677)`},{country_code:`SO`,value:`252`,name:`Somalia (+252)`},{country_code:`ZA`,value:`27`,name:`South Africa (+27)`},{country_code:`ES`,value:`34`,name:`Spain (+34)`},{country_code:`LK`,value:`94`,name:`Sri Lanka (+94)`},{country_code:`SH`,value:`290`,name:`St. Helena (+290)`},{country_code:`KN`,value:`1869`,name:`St. Kitts (+1869)`},{country_code:`SC`,value:`1758`,name:`St. Lucia (+1758)`},{country_code:`SD`,value:`249`,name:`Sudan (+249)`},{country_code:`SR`,value:`597`,name:`Suri (+597)`},{country_code:`SZ`,value:`268`,name:`Swaziland (+268)`},{country_code:`SE`,value:`46`,name:`Sweden (+46)`},{country_code:`CH`,value:`41`,name:`Switzerland (+41)`},{country_code:`SI`,value:`963`,name:`Syria (+963)`},{country_code:`TW`,value:`886`,name:`Taiwan (+886)`},{country_code:`TJ`,value:`7`,name:`Tajikstan (+7)`},{country_code:`TH`,value:`66`,name:`Thailand (+66)`},{country_code:`TG`,value:`228`,name:`Togo (+228)`},{country_code:`TO`,value:`676`,name:`Tonga (+676)`},{country_code:`TT`,value:`1868`,name:`Trinidad \u0026amp; Tobago (+1868)`},{country_code:`TN`,value:`216`,name:`Tunisia (+216)`},{country_code:`TR`,value:`90`,name:`Turkey (+90)`},{country_code:`TM`,value:`7`,name:`Turkmenistan (+7)`},{country_code:`TM`,value:`993`,name:`Turkmenistan (+993)`},{country_code:`TC`,value:`1649`,name:`Turks \u0026amp; Caicos Islands (+1649)`},{country_code:`TV`,value:`688`,name:`Tuvalu (+688)`},{country_code:`UG`,value:`256`,name:`Uganda (+256)`},{country_code:`UA`,value:`380`,name:`Ukraine (+380)`},{country_code:`AE`,value:`971`,name:`United Arab Emirates (+971)`},{country_code:`UY`,value:`598`,name:`Uruguay (+598)`},{country_code:`UZ`,value:`7`,name:`Uzbekistan (+7)`},{country_code:`VU`,value:`678`,name:`Vanuatu (+678)`},{country_code:`VA`,value:`379`,name:`Vatican City (+379)`},{country_code:`VE`,value:`58`,name:`Venezuela (+58)`},{country_code:`VN`,value:`84`,name:`Vietnam (+84)`},{country_code:`VG`,value:`84`,name:`Virgin Islands - British (+1284)`},{country_code:`VI`,value:`84`,name:`Virgin Islands - US (+1340)`},{country_code:`WF`,value:`681`,name:`Wallis \u0026amp; Futuna (+681)`},{country_code:`YE`,value:`969`,name:`Yemen (North)(+969)`},{country_code:`YE`,value:`967`,name:`Yemen (South)(+967)`},{country_code:`ZM`,value:`260`,name:`Zambia (+260)`},{country_code:`ZW`,value:`263`,name:`Zimbabwe (+263)`}];const[showModal,setShowModal]=useState(false);const[isLoading,setLoading]=useState(false);const[error,setError]=useState(null);const[country,setCountry]=useState({});const[selectedCountry,setSelectedCountry]=useState(null);const[isCountrySelectOpen,setIsCountrySelectOpen]=useState(false);const[selectedProduct,setSelectedProduct]=useState(productList.find(el=>el.type===productType));const[isProductSelectOpen,setIsProductSelectOpen]=useState(false);const form=useRef(null);const countrySelectRef=useRef(null);const productSelectRef=useRef(null);const currentFormData=useRef({});const getCookie=name=>{const result=new RegExp(`(?:^|; )`+encodeURIComponent(name)+`=([^;]*)`).exec(document.cookie);return result?result[1]:null};const toggleModal=()=>{const next=!showModal;setShowModal(next);document.body.style.overflow=next?`hidden`:`unset`};const listenToRevenueHeroWidget=event=>{if(event?.data?.type===`MEETING_BOOKED`){window.dataLayer?.push({event:`user_demo_booked`});window.sendAnalytics?.(`RevenueHero: Meeting Booked`,{product_interested_in:currentFormData.current.product_interested_in})}if(event?.data?.type===`CLOSE_DIALOG`){window.sendAnalytics?.(`RevenueHero: Pop Up Closed`,{product_interested_in:currentFormData.current.product_interested_in});window.removeEventListener(`message`,listenToRevenueHeroWidget)}};useEffect(()=>{if(!document.querySelector(`script[src=\"https://app.revenuehero.io/scheduler.min.js\"]`)){const script=document.createElement(`script`);script.type=`text/javascript`;script.src=`https://app.revenuehero.io/scheduler.min.js`;script.async=true;document.body.appendChild(script)}fetch(`https://auth.lambdatest.com/api/country-details`).then(res=>res.json()).then(result=>{setCountry(result||{});const found=countryList.find(e=>e.country_code==result?.iso_code);if(found){setSelectedCountry({name:found.name,value:result.calling_code,country_code:result.iso_code})}},()=>setError(`Failed to load country data`));const handleClickOutside=event=>{if(countrySelectRef.current\u0026\u0026!countrySelectRef.current.contains(event.target)){setIsCountrySelectOpen(false)}if(productSelectRef.current\u0026\u0026!productSelectRef.current.contains(event.target)){setIsProductSelectOpen(false)}};document.addEventListener(`mousedown`,handleClickOutside);return()=>{document.removeEventListener(`mousedown`,handleClickOutside);document.body.style.overflow=`unset`}},[]);const handleSubmit=async e=>{e.preventDefault();setLoading(true);setError(null);const{email,mobile_no,first_name,last_name,message}=form.current.elements;const formdata={email:email.value||``,mobile_no:mobile_no.value||``,first_name:first_name.value||``,product_interested_in:selectedProduct?selectedProduct.type:productType,last_name:last_name.value||``,isd_code:selectedCountry?selectedCountry.value:country.calling_code||``,message:message?message.value||``:``,source_page_url:window.location.href,source_page_title:document.title,query_type:`Schedule a Demo`,campaign_id:`701F9000001H1EdIAK`,source:`Web Submissions`,utm:getCookie(`utm`),gclid:getCookie(`gclid`)};currentFormData.current=formdata;try{const response=await fetch(`https://forms.lambdatest.com/api/forms/contact`,{method:`POST`,headers:{\"Content-type\":`application/json`},body:JSON.stringify(formdata)});if(!response.ok){const res=await response.json().catch(()=>({}));setError(res.message||`Something went wrong. Please try again.`);return}form.current.reset();window.dataLayer?.push({event:`book_a_demo_form_submitted`});if(formdata.email\u0026\u0026formdata.email.toLowerCase().endsWith(`gmail.com`)){window.sendAmplitudeEvents?.(`Demo_Schedule_Gmail`);window.location.href=`https://www.testmuai.com/thank-you/`;return}window.sendAnalytics?.(`book_a_demo_form_submitted`,{event:`book_a_demo_form_submitted`,eventAction:`success`,eventLabel:window.location.href});window.sendAmplitudeEvents?.(`Demo_Schedule`);const hero=new window.RevenueHero({routerId:`630`,showLoader:true});window.addEventListener(`message`,listenToRevenueHeroWidget);hero.submit({...formdata,...country}).then(data=>{hero.dialog.open(data);setShowModal(false);document.body.style.overflow=`unset`}).catch(err=>{console.log(err);window.removeEventListener(`message`,listenToRevenueHeroWidget)})}catch(err){setError(`Something went wrong. Please try again.`)}finally{setLoading(false)}};return _jsxs(_Fragment,{children:[_jsx(`div`,{className:`kane_cli_cta not-prose`,children:_jsxs(`div`,{className:`kane_cli_cta_box`,children:[_jsxs(`div`,{className:`kane_cli_cta_content`,children:[_jsx(`h2`,{children:`Terminal First Testing With Kane CLI`}),_jsx(`p`,{children:`Natural language browser \u0026 mobile app tests right from terminal.`}),_jsx(`button`,{type:`button`,className:`demoBtn`,onClick:toggleModal,children:`Book a Demo`})]}),_jsx(`img`,{loading:`lazy`,src:`https://assets.testmu.ai/resources/images/Terminal-KaneCLIIcon.svg`,alt:``,\"aria-hidden\":`true`,className:`kane_cli_cta_icon no-zoom`}),_jsx(`img`,{loading:`lazy`,src:`https://assets.testmu.ai/resources/images/Terminal-KaneCLI.png`,alt:`Kane CLI terminal`,title:`Kane CLI`,className:`kane_cli_cta_terminal no-zoom`})]})}),_jsx(`div`,{className:`demo_popup_overlay demo_popup_header_demo not-prose `+(showModal?`shown`:``),children:_jsx(`div`,{className:`content mint-text-left`,children:_jsx(`div`,{className:`demo_popup_box`,children:_jsxs(`div`,{className:`demo_popup_form`,children:[_jsx(`span`,{onClick:toggleModal,className:`demo_popup_close`,children:`×`}),_jsx(`div`,{className:`demo_popup_form_title`,children:`Schedule Your Personal Demo`}),_jsxs(`form`,{ref:form,onSubmit:handleSubmit,children:[_jsxs(`div`,{className:`demo_popup_grid`,children:[_jsx(`div`,{children:_jsx(`input`,{type:`text`,name:`first_name`,placeholder:`First Name`,required:true})}),_jsx(`div`,{children:_jsx(`input`,{type:`text`,name:`last_name`,placeholder:`Last Name`,required:true})})]}),_jsx(`div`,{className:`demo_popup_field`,children:_jsx(`input`,{type:`email`,name:`email`,placeholder:`Work Email Address`,pattern:`^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$`,required:true})}),_jsx(`div`,{className:`demo_popup_field`,children:_jsxs(`div`,{className:`demo_popup_phone_row`,children:[_jsxs(`div`,{className:`demo_popup_select_wrapper`,ref:countrySelectRef,children:[_jsxs(`div`,{className:`demo_popup_select `+(isCountrySelectOpen?`demo_popup_select_open`:``),onClick:()=>setIsCountrySelectOpen(!isCountrySelectOpen),children:[_jsx(`span`,{className:`demo_popup_select_text`,children:selectedCountry?selectedCountry.name:`Select Country`}),_jsx(`span`,{className:`demo_popup_select_arrow`,children:_jsx(`svg`,{width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,children:_jsx(`path`,{d:`M4 6L8 10L12 6`,stroke:`#4D4D4D`,strokeWidth:`1.25`,strokeLinecap:`square`})})})]}),isCountrySelectOpen\u0026\u0026_jsx(`ul`,{className:`demo_popup_select_options`,children:countryList.map((item,index)=>_jsx(`li`,{className:`demo_popup_select_option `+(selectedCountry\u0026\u0026selectedCountry.country_code===item.country_code?`demo_popup_select_option_selected`:``),onClick:()=>{setSelectedCountry({name:item.name,value:item.value,country_code:item.country_code});setIsCountrySelectOpen(false)},children:item.name},index))})]}),_jsx(`input`,{type:`tel`,name:`mobile_no`,placeholder:`Phone Number`,pattern:`\\\\d*`,maxLength:15,required:true})]})}),_jsx(`div`,{className:`demo_popup_field`,children:_jsxs(`label`,{children:[`Select Product`,_jsxs(`div`,{className:`demo_popup_select_wrapper`,ref:productSelectRef,children:[_jsxs(`div`,{className:`demo_popup_select demo_popup_product_select `+(isProductSelectOpen?`demo_popup_select_open`:``),onClick:()=>setIsProductSelectOpen(!isProductSelectOpen),children:[_jsx(`span`,{className:`demo_popup_select_text`,children:selectedProduct?selectedProduct.label:`Select Product`}),_jsx(`span`,{className:`demo_popup_select_arrow`,children:_jsx(`svg`,{width:`16`,height:`16`,viewBox:`0 0 16 16`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,children:_jsx(`path`,{d:`M4 6L8 10L12 6`,stroke:`#4D4D4D`,strokeWidth:`1.25`,strokeLinecap:`square`})})})]}),isProductSelectOpen\u0026\u0026_jsx(`ul`,{className:`demo_popup_select_options`,children:productList.map((el,index)=>_jsx(`li`,{className:`demo_popup_select_option `+(selectedProduct\u0026\u0026selectedProduct.type===el.type?`demo_popup_select_option_selected`:``),onClick:()=>{setSelectedProduct({label:el.label,type:el.type});setIsProductSelectOpen(false)},children:el.label},index))})]})]})}),_jsx(`div`,{className:`demo_popup_field`,children:_jsx(`textarea`,{name:`message`,className:`demo_popup_message`,placeholder:`Your message`})}),error\u0026\u0026_jsx(`div`,{className:`demo_popup_error`,children:error}),_jsx(`div`,{className:`demo_popup_action`,children:_jsx(`button`,{type:`submit`,className:`demo_popup_submit`,disabled:isLoading,children:`Schedule Demo`})})]})]})})})})]})};function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,OptimizedImage,Tip,_MdxComponentBoundary}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!_MdxComponentBoundary)_missingMdxReference(`_MdxComponentBoundary`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`A browser check is most useful when it runs without anyone asking for it: on every pull request, before every deploy, and on a schedule against production. These use cases put Kane CLI into that loop, so a broken flow stops a merge or a deploy and the evidence for the failure is attached to the job.`}),`\n`,_jsxs(_components.p,{children:[`Every Kane CLI command returns a standard exit code, `,_jsx(_components.code,{children:`0`}),` passed, `,_jsx(_components.code,{children:`1`}),` failed, `,_jsx(_components.code,{children:`2`}),` an auth, setup, or parse error, and `,_jsx(_components.code,{children:`3`}),` a timeout or cancellation, so any CI system can act on the result. See `,_jsx(_components.a,{href:`/docs/kane-cli-cicd/`,children:`CI/CD Integration`}),` for GitHub Actions, GitLab CI, Jenkins, Bitbucket Pipelines, and Docker.`]}),`\n`,_jsx(Heading,{level:`2`,id:`gate-a-deploy-on-browser-flows`,children:`Gate a deploy on browser flows`}),`\n`,_jsx(OptimizedImage,{loading:`lazy`,src:`https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/cicd-deploy-gate.svg?fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=cdd9bd59809543097ad9f9e440884608`,alt:`Gate the deploy on a passing flow: a commit is built, a pipeline step runs kane-cli run with --headless and --agent, and the exit code (0 passed, 1 failed, 2 auth error, 3 timeout) decides whether the deploy continues`,width:`1000`,height:`563`,\"data-og-width\":`1600`,\"data-og-height\":`900`,\"data-path\":`assets/images/kane-cli/sketchnotes/cicd-deploy-gate.svg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/cicd-deploy-gate.svg?w=280\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=5acfad93a7aa891295889b1413878797 280w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/cicd-deploy-gate.svg?w=560\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=8b324c0b8e47e275d28431b8378f232f 560w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/cicd-deploy-gate.svg?w=840\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=a9c38af7961793f6676c7eb35224a0f7 840w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/cicd-deploy-gate.svg?w=1100\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=b2e330684f894d8a27c0b826e1946ad0 1100w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/cicd-deploy-gate.svg?w=1650\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=ac1c18b997972f3b78f2da3dad3090f1 1650w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/cicd-deploy-gate.svg?w=2500\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=c668d014febad754bb900fb4872dd8b1 2500w`}),`\n`,_jsx(`video`,{class:`right-side`,width:`100%`,controls:true,id:`vid`,children:_jsx(`source`,{src:`https://assets.testmuai.com/resources/videos/kane-cli/kane-cli-ci-cd-ready.mp4`,type:`video/mp4`})}),`\n`,_jsx(_components.p,{children:`A deploy that passes unit tests can still ship a checkout that never loads. In this recording, a GitHub Actions workflow installs Kane CLI, runs four browser flows against the live deploy from a smoke script, and uploads the evidence pack as an artifact, with all four flows passing.`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Store your username and access key as repository secrets named `,_jsx(_components.code,{children:`LT_USERNAME`}),` and `,_jsx(_components.code,{children:`LT_ACCESS_KEY`}),`, under `,_jsx(_components.strong,{children:`Settings > Secrets and variables > Actions`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Add a workflow that installs Chrome and Kane CLI and runs your flows headless:`}),`\n`,_jsx(CodeBlock,{filename:`.github/workflows/kane-tests.yml`,numberOfLines:`27`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`27`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Browser flows`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`on`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`push`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`jobs`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` kane-tests`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` runs-on`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`ubuntu-latest`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` steps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`uses`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`actions/checkout@v4`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`uses`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`actions/setup-node@v4`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` node-version`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'20'`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`uses`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`browser-actions/setup-chrome@v1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`run`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`npm install -g @testmuai/kane-cli`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Run browser flows against the deploy`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` env`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` LT_USERNAME`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"${{ secrets.LT_USERNAME }}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` LT_ACCESS_KEY`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"${{ secrets.LT_ACCESS_KEY }}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` run`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`|`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` kane-cli testrun run --tags smoke --parallel 4 --headless \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` --on-failure fail-fast \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` --username \"$LT_USERNAME\" --access-key \"$LT_ACCESS_KEY\"`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Upload Kane evidence`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`always()`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` uses`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`actions/upload-artifact@v4`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`kane-evidence`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` path`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`.testmuai/evidence/`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Tag the `,_jsx(_components.code,{children:`_test.md`}),` files that guard the release with `,_jsx(_components.code,{children:`tags: [smoke]`}),`, so the workflow picks them up.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Push a commit. The job fails on any non-zero exit code, which blocks the deploy step that follows it.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Open the uploaded evidence pack when a flow fails, to see the failing step’s screenshot, console log, and network log.`}),`\n`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`For a shorter setup, use the official GitHub Action, `,_jsx(_components.code,{children:`LambdaTest/kane-cli/integrations/github-action/kane-cli-browser-run@main`}),`. It installs everything, runs an objective or a glob of `,_jsx(_components.code,{children:`_test.md`}),` files, uploads the evidence, and posts the verdict on the pull request. See `,_jsx(_components.a,{href:`/docs/kane-cli-cicd/#platform-guides`,children:`GitHub Actions`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`monitor-production-flows-on-a-schedule`,children:`Monitor production flows on a schedule`}),`\n`,_jsx(OptimizedImage,{loading:`lazy`,src:`https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/scheduled-runs-and-grid.svg?fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=220eed5e633dcbcdf624a60e5a5afc28`,alt:`Watch production on a schedule: a clock triggers a run every hour against the production signup and checkout flows, and the same natural language flow also runs across Chrome and Edge on Windows, macOS, and Linux on the cloud grid`,width:`1000`,height:`563`,\"data-og-width\":`1600`,\"data-og-height\":`900`,\"data-path\":`assets/images/kane-cli/sketchnotes/scheduled-runs-and-grid.svg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/scheduled-runs-and-grid.svg?w=280\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=61a1aa126e36714526c8f6814532a575 280w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/scheduled-runs-and-grid.svg?w=560\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=68b4ea6fce1f3c0107f7337b9551e122 560w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/scheduled-runs-and-grid.svg?w=840\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=81b94e9d0e54bfdfcc9ff62368be5f2f 840w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/scheduled-runs-and-grid.svg?w=1100\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=2204904e7b10201161eae6c6e63659f4 1100w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/scheduled-runs-and-grid.svg?w=1650\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=ab48f739bd4eeb64251e5952006ada38 1650w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/scheduled-runs-and-grid.svg?w=2500\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=8714750c76ce44ba218d2908e0a6b83d 2500w`}),`\n`,_jsx(`video`,{class:`right-side`,width:`100%`,controls:true,id:`vid`,children:_jsx(`source`,{src:`https://assets.testmuai.com/resources/videos/kane-cli/use-cases/synthetic-monitoring.mp4`,type:`video/mp4`})}),`\n`,_jsx(_components.p,{children:`Uptime checks confirm a server answers, while synthetic monitoring confirms a customer can still sign in and pay. This full walkthrough builds a synthetic monitor for a production app in GitHub Actions: the first scheduled run passes, a price change in the app then breaks the checkout journey, the next run fails and sends an alert email, and the run after the fix passes again.`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Write each critical journey as one Kane CLI run in a shell script. The script stops with exit code `,_jsx(_components.code,{children:`1`}),` on the first broken journey, which fails the job:`]}),`\n`,_jsx(CodeBlock,{filename:`tests/synthetic.sh`,numberOfLines:`28`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`28`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`#!/bin/bash`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Synthetic monitoring: critical production journeys.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`VARS`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"./tests/variables.json\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`run_test`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` local`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` name`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`$1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` local`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` objective`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`$2`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` echo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"=== Monitoring: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$name`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ===\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` kane-cli`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` run`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$objective`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --variables-file`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$VARS`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --username`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$LT_USERNAME`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --access-key`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$LT_ACCESS_KEY`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --agent`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --headless`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --timeout`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 120`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --max-steps`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 20`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`; `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`then`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` echo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"OK: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$name`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` else`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` echo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"ALERT: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$name`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` is broken in production (exit `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`$?`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`)\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` exit`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` fi`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`run_test`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Login page reachable\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"go to {{app_url}}, assert the page contains 'Ship your idea faster', assert the navigation contains 'Pricing'\"`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`run_test`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Money path: checkout total\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"go to {{app_url}}, click the 'Buy Pro' button, assert the page contains 'Total due today', assert the total due today shows '`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\$`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`19.00'\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`echo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"All critical journeys healthy.\"`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Keep the production URL and expected values in a variables file, so the same script can watch staging by swapping one file:`}),`\n`,_jsx(CodeBlock,{filename:`tests/variables.json`,numberOfLines:`4`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"app_url\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"value\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://your-app.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"expected_pro_price\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"value\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"$19\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Add a workflow that runs the script on a schedule, emails the team when it fails, and always uploads the run’s evidence:`}),`\n`,_jsx(CodeBlock,{filename:`.github/workflows/kane-synthetic.yml`,numberOfLines:`48`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`48`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Synthetic Monitoring`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`on`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` schedule`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`cron`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'0 9 * * 1,5'`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # 09:00 UTC every Monday and Friday`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` workflow_dispatch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`jobs`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` synthetic`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` runs-on`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`ubuntu-latest`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` steps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`uses`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`actions/checkout@v4`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`uses`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`actions/setup-node@v4`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` node-version`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'20'`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`uses`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`browser-actions/setup-chrome@v1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`run`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`npm install -g @testmuai/kane-cli`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Monitor critical journeys`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` env`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` CI`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'true'`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` LT_USERNAME`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"${{ secrets.LT_USERNAME }}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` LT_ACCESS_KEY`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"${{ secrets.LT_ACCESS_KEY }}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` run`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`|`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` chmod +x ./tests/synthetic.sh`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ./tests/synthetic.sh`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Email alert on failure`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`failure()`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` uses`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`dawidd6/action-send-mail@v3`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` server_address`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`smtp.gmail.com`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` server_port`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`465`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` secure`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` username`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"${{ secrets.ALERT_EMAIL }}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` password`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"${{ secrets.ALERT_EMAIL_PASSWORD }}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` subject`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Synthetic monitor FAILED: production journey broken\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` to`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`team@your-company.com`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"Synthetic Monitor \u003c${{ secrets.ALERT_EMAIL }}>\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` body`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`|`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` A critical production journey failed.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\" Run details: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\"})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Upload Kane evidence`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`always()`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` uses`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`actions/upload-artifact@v4`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`synthetic-monitor-logs`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` path`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/home/runner/.testmuai/kaneai/sessions/`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Trigger the first run by hand from the `,_jsx(_components.strong,{children:`Actions`}),` tab with `,_jsx(_components.strong,{children:`Run workflow`}),`, which `,_jsx(_components.code,{children:`workflow_dispatch`}),` enables, and confirm both journeys pass before you rely on the schedule.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`When a journey breaks, the job log shows which assertion failed and the value Kane CLI found. In the recording, the checkout page shows a different total from the expected `,_jsx(_components.code,{children:`$19.00`}),`, so the money path fails and the alert email arrives a few minutes later.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Open the `,_jsx(_components.code,{children:`synthetic-monitor-logs`}),` artifact from the failed run to see the screenshot, console log, and network log for the failing step, then fix the app and rerun the workflow.`]}),`\n`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Use the same pattern with any alerting tool your team already uses, such as a Slack or PagerDuty step, by replacing the email step and keeping `,_jsx(_components.code,{children:`if: failure()`}),`. Point purchase journeys at a test account or a sandbox payment method, so the monitor never places a real order.`]})}),`\n`,_jsxs(_components.p,{children:[`When the list grows past a few journeys, commit each one as a `,_jsx(_components.code,{children:`_test.md`}),` file tagged `,_jsx(_components.code,{children:`monitor`}),` and replace the script with `,_jsx(_components.code,{children:`kane-cli testrun run --tags monitor --headless --username \"$LT_USERNAME\" --access-key \"$LT_ACCESS_KEY\"`}),`. Committed tests replay from their recordings, so a frequent schedule does not call the model unless a step has to be re-authored after the page changes.`]}),`\n`,_jsx(Heading,{level:`2`,id:`check-the-ui-before-you-open-a-pull-request`,children:`Check the UI before you open a pull request`}),`\n`,_jsx(OptimizedImage,{loading:`lazy`,src:`https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/coding-agent-loop.svg?fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=f610215fc7519ac50d5cca838998fbf5`,alt:`The coding agent loop: the agent writes the code, runs Kane CLI, reads the run_end status, and on a failure reads the result, fixes the code, and runs again until it passes`,width:`1000`,height:`563`,\"data-og-width\":`1600`,\"data-og-height\":`900`,\"data-path\":`assets/images/kane-cli/sketchnotes/coding-agent-loop.svg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/coding-agent-loop.svg?w=280\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=892fb5f8e60cd112ae1b55253a80352c 280w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/coding-agent-loop.svg?w=560\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=8692224bc0c28d3b140b4ef03b129095 560w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/coding-agent-loop.svg?w=840\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=33626e6af7a02633a967318a1b407fb3 840w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/coding-agent-loop.svg?w=1100\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=0e2760509d643518e20caf4045de1a62 1100w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/coding-agent-loop.svg?w=1650\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=f340cc337fe7456cb12aa4672f353879 1650w, https://mintcdn.com/lambdatest-f4bdd228/Dv3iQLBpcGCLM1LE/assets/images/kane-cli/sketchnotes/coding-agent-loop.svg?w=2500\u0026fit=max\u0026auto=format\u0026n=Dv3iQLBpcGCLM1LE\u0026q=85\u0026s=34ce67c56e39c54bcdbb9e87658e3179 2500w`}),`\n`,_jsx(`video`,{class:`right-side`,width:`100%`,controls:true,id:`vid`,children:_jsx(`source`,{src:`https://assets.testmuai.com/resources/videos/kane-cli/kane-cli-before-pr-ui-check.mp4`,type:`video/mp4`})}),`\n`,_jsxs(_components.p,{children:[`The cheapest place to catch a broken flow is on the machine that broke it. In this recording, a `,_jsx(_components.code,{children:`verify.sh`}),` script wraps one Kane CLI run that signs in, creates a project, and checks that the project appears in the sidebar, and the developer runs it with `,_jsx(_components.code,{children:`npm run verify:create-project`}),` before opening a pull request.`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Write the check as a script in your repo:`}),`\n`,_jsx(CodeBlock,{filename:`verify.sh`,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`#!/bin/sh`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`kane-cli`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` run`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --agent`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --headless`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --timeout`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 90`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --name`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` create-project`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Go to http://localhost:3000/login, sign in as {{email}} with password {{password}}, click 'New project', fill the name 'Smoke', click Create, and verify the project appears in the sidebar\"`})}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Add it to `,_jsx(_components.code,{children:`package.json`}),` as `,_jsx(_components.code,{children:`\"verify:create-project\": \"./verify.sh\"`}),`, so anyone on the team, or a coding agent, runs it the same way.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Run it against your local server before you push. The script exits with Kane CLI’s exit code, so a failure stops a pre-push hook.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Tell your coding agent the rule once, for example `,_jsx(_components.em,{children:`“Run npm run verify:create-project before you open a PR, and don’t open it if the check fails.”`}),` See `,_jsx(_components.a,{href:`/docs/kane-cli-with-ai-coding-agents/#pre-commit-and-pre-pr-smoke-checks`,children:`AI Coding Agents`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Run the same script in CI, so the local result and the pipeline result come from one command.`}),`\n`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`run-a-suite-in-parallel-with-one-exit-code`,children:`Run a suite in parallel with one exit code`}),`\n`,_jsxs(_components.p,{children:[`Looping over test files in a shell script gives you many exit codes and many evidence folders. `,_jsx(_components.code,{children:`kane-cli testrun run`}),` runs a selection of `,_jsx(_components.code,{children:`_test.md`}),` files as one execution with one exit code and one sealed evidence pack.`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Select tests by tag or by path, for example `,_jsx(_components.code,{children:`--tags smoke,checkout`}),` or `,_jsx(_components.code,{children:`--match '^tests/web/'`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Add `,_jsx(_components.code,{children:`--parallel 4`}),` to run four tests at a time. Each worker launches its own Chrome, so size the number to your runner.`]}),`\n`,_jsxs(_components.li,{children:[`Add `,_jsx(_components.code,{children:`--on-failure fail-fast`}),` when one failure should stop the rest, or leave the default `,_jsx(_components.code,{children:`continue`}),` to collect every result.`]}),`\n`,_jsxs(_components.li,{children:[`Preview the plan without running anything using `,_jsx(_components.code,{children:`--dry-run`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Archive `,_jsx(_components.code,{children:`.testmuai/evidence/*.evidence`}),` as the job artifact, so anyone can open the run in the hosted viewer.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/docs/kane-cli-testrun/`,children:`Batch Runs`}),` for every flag.`]}),`\n`,_jsx(Heading,{level:`2`,id:`move-the-suite-to-the-cloud-grid`,children:`Move the suite to the cloud grid`}),`\n`,_jsxs(_components.p,{children:[`A CI runner without Chrome, Xcode, or Android Studio can still run your browser and app suites. `,_jsx(_components.code,{children:`kane-cli testrun run --remote`}),` turns the suite into one HyperExecute job on the cloud grid and returns the recordings and the evidence pack to your checkout.`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Install the plugin once with `,_jsx(_components.code,{children:`kane-cli plugin install remote-execution`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Run a web suite on four grid runners with `,_jsx(_components.code,{children:`kane-cli testrun run --match '^tests/web/' --remote --parallel 4`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Run a mobile suite from a Linux runner by adding a grid device, for example `,_jsx(_components.code,{children:`--remote --device-name \"Pixel 7\" --os-version 14`}),`. List the devices the grid can provide with `,_jsx(_components.code,{children:`kane-cli devices list --target emulator --remote`}),`.`]}),`\n`,_jsx(_components.li,{children:`Keep web and mobile tests in separate runs, and allow a timeout of about ten minutes for the first job.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/docs/kane-cli-remote-execution/`,children:`Remote Runs on the Cloud Grid`}),` for plan requirements and limits.`]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/kane-cli-cicd/`,children:`CI/CD Integration`}),`: platform guides for GitHub Actions, GitLab CI, Jenkins, Bitbucket, and Docker`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/kane-cli-regression-e2e-testing/`,children:`Regression \u0026 E2E Testing`}),`: build the suite these pipelines run`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/kane-cli-evidence/`,children:`Evidence`}),`: open and share the evidence pack from a failed job`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/kane-cli-modes/#exit-codes`,children:`Exit Codes`}),`: the full mapping`]}),`\n`]}),`\n`,_jsx(_MdxComponentBoundary,{name:`KaneCliCta`,children:_jsx(KaneCliCta,{})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{KaneCliCta,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"CI/CD and DevOps Testing Use Cases","sidebarTitle":"CI/CD \u0026 DevOps","description":"CI/CD and DevOps testing use cases for Kane CLI: gate a deploy in GitHub Actions, monitor production on a schedule, check the UI before a pull request, run suites in parallel, and move suites to the cloud grid.","keywords":["kane cli ci/cd","deploy gate testing","synthetic monitoring","github actions browser testing","pre-pr checks","kane cli","kaneai","testmu ai"],"og:description":"CI/CD and DevOps testing use cases for Kane CLI: gate a deploy in GitHub Actions, monitor production on a schedule, check the UI before a pull request, run suites in parallel, and move suites to the cloud grid.","href":"/docs/kane-cli-cicd-devops-testing"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[149,21955,"null;function _creat"]]},"mdxExtracts":{"tableOfContents":[{"title":"Gate a deploy on browser flows","slug":"gate-a-deploy-on-browser-flows","depth":2,"children":[]},{"title":"Monitor production flows on a schedule","slug":"monitor-production-flows-on-a-schedule","depth":2,"children":[]},{"title":"Check the UI before you open a pull request","slug":"check-the-ui-before-you-open-a-pull-request","depth":2,"children":[]},{"title":"Run a suite in parallel with one exit code","slug":"run-a-suite-in-parallel-with-one-exit-code","depth":2,"children":[]},{"title":"Move the suite to the cloud grid","slug":"move-the-suite-to-the-cloud-grid","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/lambdatest-f4bdd228/3a744b38f2f2092a/custom.js","/docs/_mintlify/custom/lambdatest-f4bdd228/55cb39448772d821/scripts/generate-llms-txt.js","/docs/_mintlify/custom/lambdatest-f4bdd228/3b6605a83778e1c5/scripts/generate-sitemap.js"],"dynamicCss":".mint-text-left {\n text-align: left\n}","subdomain":"lambdatest-f4bdd228","siteName":"TestMu AI","title":"CI/CD and DevOps Testing Use Cases - TestMu AI","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-02T09:43:57.801Z","originalFileLocation":"docs/kane-cli-cicd-devops-testing.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"CI/CD and DevOps testing use cases for Kane CLI: gate a deploy in GitHub Actions, monitor production on a schedule, check the UI before a pull request, run suites in parallel, and move suites to the cloud grid.\">\u003cmeta data-mint-head name=\"application-name\" content=\"TestMu AI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/lambdatest-f4bdd228/8K07mt4WjvnIhLtu/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/lambdatest-f4bdd228/8K07mt4WjvnIhLtu/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/lambdatest-f4bdd228/8K07mt4WjvnIhLtu/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/lambdatest-f4bdd228/8K07mt4WjvnIhLtu/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/lambdatest-f4bdd228/8K07mt4WjvnIhLtu/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/lambdatest-f4bdd228/8K07mt4WjvnIhLtu/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/lambdatest-f4bdd228/8K07mt4WjvnIhLtu/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/lambdatest-f4bdd228/8K07mt4WjvnIhLtu/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/lambdatest-f4bdd228/8K07mt4WjvnIhLtu/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"CI/CD and DevOps Testing Use Cases - TestMu AI\">\u003cmeta data-mint-head property=\"og:description\" content=\"CI/CD and DevOps testing use cases for Kane CLI: gate a deploy in GitHub Actions, monitor production on a schedule, check the UI before a pull request, run suites in parallel, and move suites to the cloud grid.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"TestMu AI\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://www.testmuai.com/docs/kane-cli-cicd-devops-testing\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://lambdatest-f4bdd228.mintlify.app/_mintlify/api/og/v2?division=Use+Cases\u0026amp;title=CI%2FCD+and+DevOps+Testing+Use+Cases\u0026amp;description=CI%2FCD+and+DevOps+testing+use+cases+for+Kane+CLI%3A+gate+a+deploy+in+GitHub+Actions%2C+monitor+production+on+a+schedule%2C+check+the+UI+before+a+pull+request%2C+run+suit\u0026amp;theme=fa6382734d649d397d431558\u0026amp;signature=c7cb71434af9361b29fce5148cd19ce85016a370a1273da8e18ec830f4fba675\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"CI/CD and DevOps Testing Use Cases - TestMu AI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"CI/CD and DevOps testing use cases for Kane CLI: gate a deploy in GitHub Actions, monitor production on a schedule, check the UI before a pull request, run suites in parallel, and move suites to the cloud grid.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://lambdatest-f4bdd228.mintlify.app/_mintlify/api/og/v2?division=Use+Cases\u0026amp;title=CI%2FCD+and+DevOps+Testing+Use+Cases\u0026amp;description=CI%2FCD+and+DevOps+testing+use+cases+for+Kane+CLI%3A+gate+a+deploy+in+GitHub+Actions%2C+monitor+production+on+a+schedule%2C+check+the+UI+before+a+pull+request%2C+run+suit\u0026amp;theme=fa6382734d649d397d431558\u0026amp;signature=c7cb71434af9361b29fce5148cd19ce85016a370a1273da8e18ec830f4fba675\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/lambdatest-f4bdd228/8K07mt4WjvnIhLtu/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"TestMu AI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#c24e00\">\u003clink data-mint-head rel=\"canonical\" href=\"https://www.testmuai.com/docs/kane-cli-cicd-devops-testing\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/docs/kane-cli-cicd-devops-testing.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://www.testmuai.com/#organization\",\"name\":\"TestMu AI\",\"url\":\"https://www.testmuai.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/lambdatest-f4bdd228/vjKoxtouKdApUfYX/logo/light.svg?fit=max\u0026auto=format\u0026n=vjKoxtouKdApUfYX\u0026q=85\u0026s=99f56597c24dac27d2534aa7dc97b091\"}},{\"@type\":\"WebSite\",\"@id\":\"https://www.testmuai.com#website\",\"name\":\"TestMu AI\",\"url\":\"https://www.testmuai.com\",\"publisher\":{\"@id\":\"https://www.testmuai.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://www.testmuai.com/docs/kane-cli-cicd-devops-testing#webpage\",\"url\":\"https://www.testmuai.com/docs/kane-cli-cicd-devops-testing\",\"name\":\"CI/CD and DevOps Testing Use Cases\",\"description\":\"CI/CD and DevOps testing use cases for Kane CLI: gate a deploy in GitHub Actions, monitor production on a schedule, check the UI before a pull request, run suites in parallel, and move suites to the cloud grid.\",\"dateModified\":\"2026-11-02T09:43:57.801Z\",\"isPartOf\":{\"@id\":\"https://www.testmuai.com#website\"},\"breadcrumb\":{\"@id\":\"https://www.testmuai.com/docs/kane-cli-cicd-devops-testing#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://www.testmuai.com/docs/kane-cli-cicd-devops-testing#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Kane CLI\",\"item\":\"https://www.testmuai.com/docs/kane-cli-introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Use Cases\",\"item\":\"https://www.testmuai.com/docs/kane-cli-use-cases\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"CI/CD and DevOps Testing Use Cases\",\"item\":\"https://www.testmuai.com/docs/kane-cli-cicd-devops-testing\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://www.testmuai.com/docs/kane-cli-cicd-devops-testing#article\",\"headline\":\"CI/CD and DevOps Testing Use Cases\",\"name\":\"CI/CD and DevOps Testing Use Cases\",\"description\":\"CI/CD and DevOps testing use cases for Kane CLI: gate a deploy in GitHub Actions, monitor production on a schedule, check the UI before a pull request, run suites in parallel, and move suites to the cloud grid.\",\"url\":\"https://www.testmuai.com/docs/kane-cli-cicd-devops-testing\",\"mainEntityOfPage\":{\"@id\":\"https://www.testmuai.com/docs/kane-cli-cicd-devops-testing#webpage\"},\"dateModified\":\"2026-11-02T09:43:57.801Z\",\"keywords\":\"kane cli ci/cd, deploy gate testing, synthetic monitoring, github actions browser testing, pre-pr checks, kane cli, kaneai, testmu ai\",\"publisher\":{\"@id\":\"https://www.testmuai.com/#organization\"},\"isPartOf\":{\"@id\":\"https://www.testmuai.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"TestMu AI\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"TestMu AI","nav":{"global":{"anchors":[{"anchor":"Back to TestMu AI Docs","icon":"arrow-left","href":"https://www.testmuai.com/support/docs/"},{"anchor":"Status","icon":"signal","href":"https://status.lambdatest.io/"},{"anchor":"Blog","icon":"newspaper","href":"https://www.testmuai.com/blog/"}]},"tabs":[{"tab":"Docs","icon":"book-open-lines","pages":[{"group":"Kane CLI","pages":[{"group":"Getting Started","pages":[{"title":"Kane CLI: AI Test Automation Overview","sidebarTitle":"Introduction","href":"/docs/kane-cli-introduction"},{"title":"How to Install Kane CLI","sidebarTitle":"Installation","href":"/docs/kane-cli-installation"},{"title":"How to Run Your First Kane CLI Test","sidebarTitle":"Quick Start","href":"/docs/kane-cli-quickstart"},{"title":"How to Authenticate Kane CLI","sidebarTitle":"Authentication","href":"/docs/kane-cli-authentication"}]},{"group":"Core Concepts","pages":[{"title":"Kane CLI Modes: TUI, Headless \u0026 Agent","sidebarTitle":"Modes","href":"/docs/kane-cli-modes"},{"title":"How to Write Kane CLI Objectives","sidebarTitle":"Writing Objectives","href":"/docs/kane-cli-writing-objectives"},{"title":"How to Make API Calls with Kane CLI","sidebarTitle":"API Calls","href":"/docs/kane-cli-api-calls"},{"title":"How to Set Browser State in Kane CLI","sidebarTitle":"Browser State","href":"/docs/kane-cli-browser-state"},{"title":"How to Use Variables in Kane CLI","sidebarTitle":"Variables \u0026 Context","href":"/docs/kane-cli-variables-and-context"},{"title":"How to Configure Kane CLI","sidebarTitle":"Configuration","href":"/docs/kane-cli-configuration"},{"title":"How to Upload Kane CLI Tests to Test Manager","sidebarTitle":"Test Manager Integration","href":"/docs/kane-cli-tms-integration"},{"group":"Test.md","pages":[{"title":"How to Write Kane CLI Tests in Markdown","sidebarTitle":"Test.md","href":"/docs/kane-cli-testmd"},{"title":"Composing Tests (@import)","sidebarTitle":"Composing Tests (@import)","href":"/docs/kane-cli-testmd-composition"},{"title":"Running test.md Files","sidebarTitle":"Running test.md Files","href":"/docs/kane-cli-testmd-running"}]},{"group":"Batch Runs (testrun)","pages":[{"title":"Batch Runs (testrun)","sidebarTitle":"Batch Runs (testrun)","href":"/docs/kane-cli-testrun"},{"title":"Remote Runs on the Cloud Grid","sidebarTitle":"Remote Runs","href":"/docs/kane-cli-remote-execution"}]}]},{"group":"Mobile Testing","pages":[{"title":"How to Test Mobile Apps with Kane CLI","sidebarTitle":"Overview","href":"/docs/kane-cli-mobile"},{"title":"How to Test on Real Android and iOS Devices with Kane CLI","sidebarTitle":"Real Devices","href":"/docs/kane-cli-mobile-real-device"}]},{"group":"Use Cases","pages":[{"title":"Kane CLI Use Cases by Category","sidebarTitle":"Use Cases","href":"/docs/kane-cli-use-cases"},{"title":"API Testing Use Cases","sidebarTitle":"API Testing","href":"/docs/api-testing-with-kane-cli"},{"title":"How to Use Kane CLI with AI Coding Agents","sidebarTitle":"AI Coding Agents","href":"/docs/kane-cli-with-ai-coding-agents"},{"title":"E-commerce Testing Use Cases","sidebarTitle":"E-commerce Testing","href":"/docs/kane-cli-ecommerce-testing"},{"title":"Payments Testing Use Cases","sidebarTitle":"Payments Testing","href":"/docs/kane-cli-payments-testing"},{"title":"DevTools and Performance Testing Use Cases","sidebarTitle":"DevTools \u0026 Performance","href":"/docs/kane-cli-devtools-performance-testing"},{"title":"Security and Access Control Testing Use Cases","sidebarTitle":"Security \u0026 Access","description":"Security and access control testing use cases for Kane CLI: role-based access, sign-in gates, rejected credentials, session cookie flags, token storage, sign-out, and keeping secrets out of tests.","href":"/docs/kane-cli-security-access-testing"},{"title":"CI/CD and DevOps Testing Use Cases","sidebarTitle":"CI/CD \u0026 DevOps","href":"/docs/kane-cli-cicd-devops-testing"},{"title":"Regression and End-to-End Testing Use Cases","sidebarTitle":"Regression \u0026 E2E","description":"Regression and end-to-end testing use cases for Kane CLI: UI and API in one run, save once and replay on every build, recover when the UI changes, promote a passing run to a committed test, and separate product bugs from test issues.","href":"/docs/kane-cli-regression-e2e-testing"},{"title":"Test Generation and Exploration Use Cases","sidebarTitle":"Test Generation \u0026 Exploration","href":"/docs/kane-cli-test-generation-exploration"},{"title":"Mobile App Testing Use Cases","sidebarTitle":"Mobile App Testing","href":"/docs/kane-cli-mobile-app-testing"}]},{"group":"Generate Test Cases","pages":[{"title":"How to Generate Test Cases with Kane CLI","sidebarTitle":"Overview","href":"/docs/kane-cli-generate"},{"title":"How to Use the Kane CLI Generate Flow","sidebarTitle":"Workflow","href":"/docs/kane-cli-generate-workflow"}]},{"group":"Assurance","pages":[{"title":"The Kane CLI Assurance Lifecycle","sidebarTitle":"Overview","href":"/docs/kane-cli-assurance"},{"title":"How to Build the Kane CLI Context Graph","sidebarTitle":"Context Graph","href":"/docs/kane-cli-assurance-context"},{"title":"Requirement Sources","sidebarTitle":"Requirement Sources","href":"/docs/kane-cli-assurance-sources"},{"title":"How to Design Kane CLI Tests from Use-Cases","sidebarTitle":"Designing Tests","href":"/docs/kane-cli-assurance-design"},{"title":"How to Measure Kane CLI Test Coverage","sidebarTitle":"Coverage","href":"/docs/kane-cli-assurance-coverage"},{"title":"How to Maintain a Kane CLI Test Suite","sidebarTitle":"Maintaining the Suite","href":"/docs/kane-cli-assurance-maintain"},{"title":"Sharing the Context Graph with Your Team","sidebarTitle":"Sharing with Your Team","href":"/docs/kane-cli-assurance-sharing"},{"title":"How to Run Kane CLI Assurance in CI","sidebarTitle":"Agents \u0026 CI","href":"/docs/kane-cli-assurance-automation"}]},{"group":"Exploration","pages":[{"title":"Exploration: Map Your App and Design Tests from It","sidebarTitle":"Exploration","href":"/docs/kane-cli-exploration"}]},{"group":"Evidence","pages":[{"title":"Kane CLI Evidence Packs Explained","sidebarTitle":"Overview","href":"/docs/kane-cli-evidence"},{"title":"Kane CLI Evidence Pack Structure","sidebarTitle":"Pack Structure","href":"/docs/kane-cli-evidence-pack-structure"},{"title":"How to View Kane CLI Evidence Packs","sidebarTitle":"Viewing Evidence","href":"/docs/kane-cli-evidence-viewing"},{"title":"How to Validate Kane CLI Evidence Packs","sidebarTitle":"Validating Packs","href":"/docs/kane-cli-evidence-validate"},{"title":"How to Merge Kane CLI Evidence Packs","sidebarTitle":"Merging Packs","href":"/docs/kane-cli-evidence-merge"},{"title":"How to Debug a Failed Kane CLI Run","sidebarTitle":"Debugging from a Pack","href":"/docs/kane-cli-evidence-debugging"},{"title":"The Kane CLI .evidence Format","sidebarTitle":"The .evidence Format","href":"/docs/kane-cli-evidence-format"}]},{"group":"Checkpoints","pages":[{"title":"How to Use Checkpoints in Kane CLI","sidebarTitle":"Overview","href":"/docs/kane-cli-checkpoints"},{"title":"How to Assert Visuals in Kane CLI","sidebarTitle":"Visual","href":"/docs/kane-cli-checkpoint-visual"},{"title":"How to Assert DOM Values in Kane CLI","sidebarTitle":"Textual (DOM)","href":"/docs/kane-cli-checkpoint-textual"},{"title":"How to Assert the URL in Kane CLI","sidebarTitle":"URL","href":"/docs/kane-cli-checkpoint-url"},{"title":"How to Assert the Page Title in Kane CLI","sidebarTitle":"Title","href":"/docs/kane-cli-checkpoint-title"},{"group":"DevTools","pages":[{"title":"How to Assert DevTools Data in Kane CLI","sidebarTitle":"Overview","href":"/docs/kane-cli-checkpoint-devtools"},{"title":"How to Assert Network Traffic in Kane CLI","sidebarTitle":"Network","href":"/docs/kane-cli-checkpoint-devtools-network"},{"title":"How to Assert Console Logs in Kane CLI","sidebarTitle":"Console","href":"/docs/kane-cli-checkpoint-devtools-console"},{"title":"How to Assert Performance in Kane CLI","sidebarTitle":"Performance","href":"/docs/kane-cli-checkpoint-devtools-performance"},{"title":"How to Assert Cookies in Kane CLI","sidebarTitle":"Cookies","href":"/docs/kane-cli-checkpoint-devtools-cookies"},{"title":"How to Assert localStorage in Kane CLI","sidebarTitle":"localStorage","href":"/docs/kane-cli-checkpoint-devtools-localstorage"},{"title":"How to Assert Clipboard in Kane CLI","sidebarTitle":"Clipboard","href":"/docs/kane-cli-checkpoint-devtools-clipboard"}]}]},{"group":"Agent Mode","pages":[{"title":"How to Use Kane CLI Agent Mode","sidebarTitle":"Agent Mode","href":"/docs/kane-cli-agent-mode"},{"title":"How to Run Kane CLI Tests in Parallel","sidebarTitle":"Parallel Execution","href":"/docs/kane-cli-parallel-execution"}]},{"group":"CI/CD \u0026 Skills","pages":[{"title":"How to Run Kane CLI in CI/CD","sidebarTitle":"CI/CD","href":"/docs/kane-cli-cicd"},{"title":"How to Use Kane CLI in AI Coding Agents","sidebarTitle":"Skills","href":"/docs/kane-cli-skills"},{"title":"Kane CLI AGENTS.md: Agent MD File for Coding Agents","sidebarTitle":"AGENTS.md","href":"/docs/kane-cli-agents-md"},{"title":"Kane CLI Plugin for Claude Code","sidebarTitle":"Claude Code Plugin","href":"/docs/kane-cli-claude-code-plugin"}]},{"group":"Reference","pages":[{"title":"Kane CLI Command \u0026 Flag Reference","sidebarTitle":"CLI Reference","href":"/docs/kane-cli-cli-reference"},{"title":"Kane CLI Error \u0026 Result Codes Reference","sidebarTitle":"Error Codes","href":"/docs/kane-cli-error-codes"},{"group":"Troubleshooting","pages":[{"title":"How to Troubleshoot Kane CLI Issues","sidebarTitle":"Troubleshooting","href":"/docs/kane-cli-troubleshooting"},{"title":"sharp Install Failure","sidebarTitle":"sharp Install Failure","href":"/docs/kane-cli-troubleshooting-sharp"}]},{"title":"Kane CLI Changelog \u0026 Release Notes","sidebarTitle":"Changelog","href":"/docs/kane-cli-changelog"}]}]}]}]},"basePath":"","title":"CI/CD and DevOps Testing Use Cases - TestMu AI","buildId":"dpl_Acry4NrQAgjcikyFgVE2eJ7XQCAv","deploymentId":"dpl_Acry4NrQAgjcikyFgVE2eJ7XQCAv","dynamics":["a74be98ba7"],"chunks":["zoom-image-lightbox-DBRtNxbY.js","lightbox-handle-r17bVUz3.js"]}