CI/CD Integration
Integrate TV Labs testing into your CI/CD pipelines to enable automated testing on real devices as part of your development workflow.
Overview
TV Labs provides two separate routes for CI/CD integration:
Route 1: Visual No-Code Workflows
Execute visual automation projects using tvlabs run
.
Key advantage: Same workflow runs across all TV platforms (Roku, Samsung, LG, Apple TV) without platform-specific code changes.
Best for teams who:
- Create visual workflows in the TV Labs web interface
- Need to integrate existing TV Labs projects into CI/CD
- Want to save time on test automation setup
Route 2: Custom Appium Scripts
Run custom Appium test scripts via the TV Labs Appium proxy. Provides full programmatic control with platform-specific automation capabilities.
Best for teams who:
- Write custom test automation code
- Need full programmatic control over test execution
- Want to integrate existing Appium test suites
Choose the route that best fits your team's testing approach.
Route 1: Visual No-Code Workflows with tvlabs run
The tvlabs run
command executes automation projects that include visual workflows, target configurations, and build deployments.
GitHub Actions Example
name: TV Labs Automation Tests
on: [push, pull_request]
jobs:
tv-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install TV Labs CLI
run: /bin/bash -c "$(curl -fsSL https://tvlabs.ai/install.sh)"
- name: Upload app build
env:
TVLABS_API_KEY: ${{ secrets.TVLABS_API_KEY }}
run: |
BUILD_ID=$(tvlabs upload -i ./dist/app.zip)
echo "BUILD_ID=$BUILD_ID" >> $GITHUB_ENV
- name: Run TV automation tests
env:
TVLABS_API_KEY: ${{ secrets.TVLABS_API_KEY }}
run: |
tvlabs run --project ${{ vars.PROJECT_ID }} \
--app ${{ vars.APP_ID }} \
--device ${{ vars.DEVICE_ID }} \
--build ${{ env.BUILD_ID }} \
--entrypoint ${{ vars.WORKFLOW_ID }}
Route 2: Custom Appium Scripts
Use the TV Labs Appium proxy to run Appium tests on real devices. Supports both CLI and REST API integration methods.
Build Upload Options
Before running Appium tests, you need to upload your application build. TV Labs provides two methods:
- Using TV Labs CLI -
tvlabs upload
command - Using REST API - Direct API calls without CLI dependency
Both methods return a build ID that you use in your Appium test capabilities.
GitHub Actions with Appium
name: TV Labs Appium Tests
on: [push, pull_request]
jobs:
appium-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Install TV Labs CLI
run: /bin/bash -c "$(curl -fsSL https://tvlabs.ai/install.sh)"
- name: Upload app build (CLI method)
env:
TVLABS_API_KEY: ${{ secrets.TVLABS_API_KEY }}
run: |
BUILD_ID=$(tvlabs upload -i ./dist/app.zip)
echo "BUILD_ID=$BUILD_ID" >> $GITHUB_ENV
- name: Run Appium tests
env:
TVLABS_API_KEY: ${{ secrets.TVLABS_API_KEY }}
TVLABS_BUILD_ID: ${{ env.BUILD_ID }}
run: npm test
- name: Upload test results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results
path: |
test-results/
screenshots/
Alternative Upload Method: Instead of using the CLI, you can upload builds using the REST API directly. See the Build Upload documentation for details on the API method.
Sample Appium Test Script
// test/tv-test.js
import { remote } from 'webdriverio';
describe('TV App Tests', () => {
let driver;
beforeEach(async () => {
const capabilities = {
'tvlabs:build': process.env.TVLABS_BUILD_ID,
'tvlabs:constraints': { platform_key: 'roku' },
};
driver = await remote({
hostname: 'appium.tvlabs.ai',
port: 4723,
protocol: 'https',
capabilities,
headers: { Authorization: `Bearer ${process.env.TVLABS_API_KEY}` },
connectionRetryTimeout: 300_000,
});
});
afterEach(async () => {
await driver?.deleteSession();
});
it('should navigate through the app', async () => {
await driver.executeScript('roku: pressKey', [{ key: 'Right' }]);
await driver.executeScript('roku: pressKey', [{ key: 'Select' }]);
await driver.takeScreenshot();
});
});
Advanced Configuration
Parallel Testing Across Multiple Devices
Route 1 (Visual No-Code Workflows) enables running identical tests across multiple TV platforms simultaneously. Visual workflows are platform-agnostic, requiring no code changes between Roku, Samsung, LG, and Apple TV.
name: Parallel Device Testing
on: [push, pull_request]
jobs:
parallel-tv-tests:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
device_config:
- name: 'Roku TV'
device_id: ${{ vars.ROKU_DEVICE_ID }}
- name: 'Samsung TV'
device_id: ${{ vars.SAMSUNG_DEVICE_ID }}
- name: 'LG TV'
device_id: ${{ vars.LG_DEVICE_ID }}
- name: 'Apple TV'
device_id: ${{ vars.APPLE_TV_DEVICE_ID }}
steps:
- uses: actions/checkout@v4
- name: Install TV Labs CLI
run: /bin/bash -c "$(curl -fsSL https://tvlabs.ai/install.sh)"
- name: Upload app build
env:
TVLABS_API_KEY: ${{ secrets.TVLABS_API_KEY }}
run: |
BUILD_ID=$(tvlabs upload -i ./dist/app.zip)
echo "BUILD_ID=$BUILD_ID" >> $GITHUB_ENV
- name: Run visual tests on ${{ matrix.device_config.name }}
env:
TVLABS_API_KEY: ${{ secrets.TVLABS_API_KEY }}
run: |
tvlabs run --project ${{ vars.PROJECT_ID }} \
--app ${{ vars.APP_ID }} \
--device ${{ matrix.device_config.device_id }} \
--build ${{ env.BUILD_ID }}
Technical advantages:
- Platform Agnostic: Same workflow runs on all TV platforms without modification
- Simplified Maintenance: One test maintains compatibility across all platforms
- True Parallel Execution: Identical tests run simultaneously across different TV OS types
Route 2 (Appium) requires separate test scripts for each platform with platform-specific commands.
Regional Testing
Run tests in different geographic regions using the --region
flag:
- name: Test in different regions
strategy:
matrix:
region:
- new_york_usa
- buenos_aires_argentina
- sydney_australia
- sao_paulo
- canada_montreal
- santiago_chile
- malaysia
- mexico
- lima_peru
- manila_phillipines
- singapore
- stockholm_sweden
- virginia_usa
- london_uk
env:
TVLABS_API_KEY: ${{ secrets.TVLABS_API_KEY }}
run: |
tvlabs run --project ${{ vars.PROJECT_ID }} \
--app ${{ vars.APP_ID }} \
--device ${{ vars.DEVICE_ID }} \
--region ${{ matrix.region }}
All available regions can be retrieved from the REST API route /api/v1/teleport/regions
.
Development Status
Current features:
- Basic CI/CD integration including GitHub Actions
- Build artifact management (CLI and REST API)
- Regional testing capabilities
- Flexible integration options (with or without CLI)
Coming Soon:
- CI/CD integration with GitLab, Azure DevOps, and other platforms
- TV Labs Github Action (
tvlabs/setup-tvlabs-cli@v1
)
Getting Help
If you have questions about CI/CD integration or need assistance setting up your pipelines:
- Support: support@tvlabs.ai
- Documentation: CLI Commands | Build Upload | Appium Integration
- Examples: Appium Examples