Skip to content
Latchkey

CI workflow (cobrateam/splinter)

The CI workflow from cobrateam/splinter, explained and optimized by Latchkey.

D

CI health: D - needs work

Point runs-on at Latchkey and get caching, run de-duplication, job timeouts, self-healing for flaky steps, and up to 58% lower cost, applied automatically.

Grade your own workflow free or run it on Latchkey →
Source: cobrateam/splinter.github/workflows/main.ymlLicense BSD-3-ClauseView source

What it does

This is the CI workflow from the cobrateam/splinter repository, a real project running GitHub Actions. It is shown here with attribution under its BSD-3-Clause license.

Below, Latchkey shows a faster, safer version produced by its optimization engine.

The workflow

workflow (.yml)
# This is a basic workflow to help you get started with Actions

name: CI

# Controls when the action will run.
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [master]
  pull_request:
    branches: [master]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:


# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  tests:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        include:
          - PY_VER: py38
            python-version: 3.8
          - PY_VER: py39
            python-version: 3.9
          - PY_VER: py310
            python-version: "3.10"
          - PY_VER: py311
            python-version: 3.11
          - PY_VER: py312
            python-version: 3.12
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: ${{matrix.python-version}}

      - name: Install test dependencies
        run: pip install tox

      - name: Run splinter tests
        run: |
          tox -e tests_splinter -- -n 4

      - name: Run lxml-based driver tests
        run: |
          tox -e tests_django -- -n 2;
          tox -e tests_flask -- -n 2;
          tox -e tests_zopetestbrowser -- -n 2;

  tests_selenium_remote:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        include:
          - PY_VER: py38
            python-version: 3.8
          - PY_VER: py39
            python-version: 3.9
          - PY_VER: py310
            python-version: "3.10"
          - PY_VER: py311
            python-version: "3.11"
          - PY_VER: py312
            python-version: "3.12"

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: ${{matrix.python-version}}

      - name: Install test dependencies
        run: pip install tox

      - name: Set env
        run: echo "DISPLAY=:99.0" >> $GITHUB_ENV

      - name: Install selenium server
        run: |
          wget https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.3.0/selenium-server-4.3.0.jar -O selenium-server.jar

      - name: Run Selenium Remote tests
        run: |
          echo "Start Selenium Server"
          xvfb-run java -jar selenium-server.jar standalone > selenium-server.log 2>&1 &
          timeout 60 bash -c 'while ! wget -O /dev/null -T 1 http://localhost:4444/readyz; do echo waiting for selenium server; sleep 1; done' || (cat selenium-server.log && exit 2)
          echo "Selenium server is ready, running tests"
          tox -e tests_selenium_remote_firefox
          tox -e tests_selenium_remote_chrome

  tests_selenium:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        include:
          - PY_VER: py38
            python-version: 3.8
          - PY_VER: py39
            python-version: 3.9
          - PY_VER: py310
            python-version: "3.10"
          - PY_VER: py311
            python-version: "3.11"
          - PY_VER: py312
            python-version: "3.12"

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: ${{matrix.python-version}}

      - name: Install test dependencies
        run: pip install tox

      - name: Run Selenium tests
        run: |
          tox -e tests_selenium_firefox -- -n 4;
          tox -e tests_selenium_chrome -- -n 4;

The same workflow, on Latchkey

Estimated ~20% faster on cache hits, plus fewer wasted runs and a safer supply chain. Added and changed lines are highlighted.

# This is a basic workflow to help you get started with Actions
 
name: CI
 
# Controls when the action will run.
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [master]
  pull_request:
    branches: [master]
 
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:
 
 
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
 
jobs:
  tests:
    timeout-minutes: 30
    runs-on: latchkey-small
 
    strategy:
      matrix:
        include:
          - PY_VER: py38
            python-version: 3.8
          - PY_VER: py39
            python-version: 3.9
          - PY_VER: py310
            python-version: "3.10"
          - PY_VER: py311
            python-version: 3.11
          - PY_VER: py312
            python-version: 3.12
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v4
 
      - uses: actions/setup-python@v5
        with:
          cache: 'pip'
          python-version: ${{matrix.python-version}}
 
      - name: Install test dependencies
        run: pip install tox
 
      - name: Run splinter tests
        run: |
          tox -e tests_splinter -- -n 4
 
      - name: Run lxml-based driver tests
        run: |
          tox -e tests_django -- -n 2;
          tox -e tests_flask -- -n 2;
          tox -e tests_zopetestbrowser -- -n 2;
 
  tests_selenium_remote:
    timeout-minutes: 30
    runs-on: latchkey-small
 
    strategy:
      matrix:
        include:
          - PY_VER: py38
            python-version: 3.8
          - PY_VER: py39
            python-version: 3.9
          - PY_VER: py310
            python-version: "3.10"
          - PY_VER: py311
            python-version: "3.11"
          - PY_VER: py312
            python-version: "3.12"
 
    steps:
      - uses: actions/checkout@v4
 
      - uses: actions/setup-python@v5
        with:
          cache: 'pip'
          python-version: ${{matrix.python-version}}
 
      - name: Install test dependencies
        run: pip install tox
 
      - name: Set env
        run: echo "DISPLAY=:99.0" >> $GITHUB_ENV
 
      - name: Install selenium server
        run: |
          wget https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.3.0/selenium-server-4.3.0.jar -O selenium-server.jar
 
      - name: Run Selenium Remote tests
        run: |
          echo "Start Selenium Server"
          xvfb-run java -jar selenium-server.jar standalone > selenium-server.log 2>&1 &
          timeout 60 bash -c 'while ! wget -O /dev/null -T 1 http://localhost:4444/readyz; do echo waiting for selenium server; sleep 1; done' || (cat selenium-server.log && exit 2)
          echo "Selenium server is ready, running tests"
          tox -e tests_selenium_remote_firefox
          tox -e tests_selenium_remote_chrome
 
  tests_selenium:
    timeout-minutes: 30
    runs-on: latchkey-small
 
    strategy:
      matrix:
        include:
          - PY_VER: py38
            python-version: 3.8
          - PY_VER: py39
            python-version: 3.9
          - PY_VER: py310
            python-version: "3.10"
          - PY_VER: py311
            python-version: "3.11"
          - PY_VER: py312
            python-version: "3.12"
 
    steps:
      - uses: actions/checkout@v4
 
      - uses: actions/setup-python@v5
        with:
          cache: 'pip'
          python-version: ${{matrix.python-version}}
 
      - name: Install test dependencies
        run: pip install tox
 
      - name: Run Selenium tests
        run: |
          tox -e tests_selenium_firefox -- -n 4;
          tox -e tests_selenium_chrome -- -n 4;
 

What changed

What Latchkey heals here

This workflow has steps that commonly fail on transient issues (network, registries, flaky browsers). On Latchkey managed runners they are detected, retried, and self-healed instead of failing your build:

This workflow runs 3 jobs per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.

Actions used in this workflow