name: Appium Build on: push: branches: - master # this list of paths could potentially impact the build paths: - '**/tsconfig*.json' - 'packages/base-driver/static/**/*' - 'packages/*/test/**' - 'packages/*/bin' - 'packages/**/*.ts' - 'packages/**/*.json' - 'packages/**/*.js' - 'package*.json' - 'lerna.json' - '.npmrc' - '.mocharc.js' - '.github/workflows/build.yml' # this file - '.eslintrc' - '.eslintignore' - '!**/sample-code/**' - '!packages/*/docs/**' pull_request: branches: - master paths: - '**/tsconfig*.json' - 'packages/base-driver/static/**/*' - 'packages/*/test/**' - 'packages/*/bin' - 'packages/**/*.ts' - 'packages/**/*.json' - 'packages/**/*.js' - 'package*.json' - 'lerna.json' - '.npmrc' - '.mocharc.js' - '.github/workflows/build.yml' # this file - '.eslintrc' - '.eslintignore' - '!**/sample-code/**' - '!packages/*/docs/**' env: CI: true permissions: contents: read concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: prepare_matrix: uses: appium/appium-workflows/.github/workflows/node-lts-matrix.yml@main prepare_e2e_packages: runs-on: ubuntu-latest outputs: packages: ${{ steps.discover-packages.outputs.packages }} steps: - uses: actions/checkout@v6 - name: Discover packages with e2e tests id: discover-packages run: | packages=() for package_dir in packages/*/; do package_json="${package_dir}package.json" if [[ -f "$package_json" ]]; then # Check if package.json has test:e2e script and it's not a no-op has_e2e=$(node -e " try { const pkg = require('./$package_json'); const script = pkg.scripts && pkg.scripts['test:e2e']; if (script && !script.includes('echo') && !script.includes('No e2e tests')) { console.log('true'); } } catch(e) { // Ignore errors } ") if [[ "$has_e2e" == "true" ]]; then # Use the directory path without packages/ prefix (remove trailing slash) package_name="${package_dir%/}" package_name="${package_name#packages/}" packages+=("$package_name") fi fi done # Convert array to JSON array for GitHub Actions matrix if [[ ${#packages[@]} -eq 0 ]]; then echo "No packages with e2e tests found" packages_json="[]" else # Use jq to create a compact single-line JSON array packages_json=$(printf '%s\n' "${packages[@]}" | jq -R '.' | jq -s '.' | jq -c '.') fi echo "packages=$packages_json" >> $GITHUB_OUTPUT echo "Found packages with e2e tests:" echo "$packages_json" | jq -r '.[]' | sed 's/^/ - /' test-smoke: needs: - prepare_matrix name: Smoke Tests strategy: matrix: node-version: ${{ fromJSON(needs.prepare_matrix.outputs.versions) }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Setup, install and build uses: ./.github/actions/setup-build with: node-version: ${{ matrix.node-version }} install-command: npm ci --foreground-scripts run-build: 'true' - name: Run smoke tests run: npm run test:smoke test-unit: needs: - prepare_matrix name: Unit Tests strategy: matrix: node-version: ${{ fromJSON(needs.prepare_matrix.outputs.versions) }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Setup, install and build uses: ./.github/actions/setup-build with: node-version: ${{ matrix.node-version }} install-command: npm ci --foreground-scripts run-build: 'true' - name: Run unit tests run: npm run test:unit test-types: needs: - prepare_matrix name: Type Tests strategy: matrix: node-version: ${{ fromJSON(needs.prepare_matrix.outputs.versions) }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Setup, install and build uses: ./.github/actions/setup-build with: node-version: ${{ matrix.node-version }} install-command: npm ci --foreground-scripts run-build: 'true' - name: Run type tests run: npm run test:types test-e2e: needs: - prepare_matrix - prepare_e2e_packages name: E2E Tests - ${{ matrix.package_dir }} (Node ${{ matrix.node-version }}) if: ${{ github.event_name == 'pull_request' }} strategy: fail-fast: false matrix: node-version: ${{ fromJSON(needs.prepare_matrix.outputs.versions) }} package_dir: ${{ fromJSON(needs.prepare_e2e_packages.outputs.packages) }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Setup, install and build uses: ./.github/actions/setup-build with: node-version: ${{ matrix.node-version }} install-command: npm ci --foreground-scripts run-build: 'true' - name: Run E2E tests for ${{ matrix.package_dir }} run: | set -o pipefail cd "packages/${{ matrix.package_dir }}" npm run test:e2e lint: name: Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Setup and install (no build) uses: ./.github/actions/setup-build with: node-version: lts/* install-command: npm ci run-build: 'false' - name: ESLint run: npm run lint:ci