Skip to content
Latchkey

Build and Test workflow (json-editor/json-editor)

The Build and Test workflow from json-editor/json-editor, explained and optimized by Latchkey.

C

CI health: C - fair

Point runs-on at Latchkey and get 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: json-editor/json-editor.github/workflows/build.ymlLicense MITView source

What it does

This is the Build and Test workflow from the json-editor/json-editor repository, a real project running GitHub Actions. It is shown here with attribution under its MIT license.

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

The workflow

workflow (.yml)
name: Build and Test

on: [push, pull_request]

jobs:

  unit-test:

    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Node version
        run: node -v
      - name: Install
        run: npm install
      - name: Test
        run: npm run test-headless

  end-to-end-test:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        include:
          - selenium-browser: "chrome"
            build-env: "build.prod"
          - selenium-browser: "chrome"
            build-env: "build.nonmin.travis"
          - selenium-browser: "firefox"
            build-env: "build.prod"
          - selenium-browser: "firefox"
            build-env: "build.nonmin.travis"
      fail-fast: false
    defaults:
      run:
        shell: bash
        working-directory: tests

    env:
      SELENIUM_BROWSER: ${{ matrix.selenium-browser }}
      BUILD_ENV: ${{ matrix.build-env }}

    steps:
      - uses: actions/checkout@v1
      #- name: Install
      #  run: |
      #    npm install
      - name: Install
        run: docker compose run -T --rm node npm install
      - name: Start
        run: docker compose up -d ${SELENIUM_BROWSER}
      - name: Build
        run: docker compose run -T --rm node npm run ${BUILD_ENV}
      - name: Test
        run: |
          docker compose exec -T node codeceptjs run-multiple -c /repo/tests/codeceptjs/codecept.json basic:${SELENIUM_BROWSER} --invert --grep  '@optional'
          pwd
          ls -la codeceptjs/output
      - name: Test Artifacts
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: codeceptjs-output-${{ matrix.selenium-browser }}-${{ matrix.build-env }}
          path: tests/codeceptjs/output
          retention-days: 30
          merge-multiple: true
      - name: Test (optional)
        continue-on-error: true
        run: docker compose exec -T node codeceptjs run-multiple -c /repo/tests/codeceptjs/codecept.json basic:${SELENIUM_BROWSER} --grep '@optional'

The same workflow, on Latchkey

Removes redundant runs and caps runaway jobs. Added and changed lines are highlighted.

name: Build and Test
 
on: [push, pull_request]
 
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
 
jobs:
 
  unit-test:
    timeout-minutes: 30
 
    runs-on: latchkey-small
    steps:
      - uses: actions/checkout@v1
      - name: Node version
        run: node -v
      - name: Install
        run: npm install
      - name: Test
        run: npm run test-headless
 
  end-to-end-test:
    timeout-minutes: 30
 
    runs-on: latchkey-small
    strategy:
      matrix:
        include:
          - selenium-browser: "chrome"
            build-env: "build.prod"
          - selenium-browser: "chrome"
            build-env: "build.nonmin.travis"
          - selenium-browser: "firefox"
            build-env: "build.prod"
          - selenium-browser: "firefox"
            build-env: "build.nonmin.travis"
      fail-fast: false
    defaults:
      run:
        shell: bash
        working-directory: tests
 
    env:
      SELENIUM_BROWSER: ${{ matrix.selenium-browser }}
      BUILD_ENV: ${{ matrix.build-env }}
 
    steps:
      - uses: actions/checkout@v1
      #- name: Install
      #  run: |
      #    npm install
      - name: Install
        run: docker compose run -T --rm node npm install
      - name: Start
        run: docker compose up -d ${SELENIUM_BROWSER}
      - name: Build
        run: docker compose run -T --rm node npm run ${BUILD_ENV}
      - name: Test
        run: |
          docker compose exec -T node codeceptjs run-multiple -c /repo/tests/codeceptjs/codecept.json basic:${SELENIUM_BROWSER} --invert --grep  '@optional'
          pwd
          ls -la codeceptjs/output
      - name: Test Artifacts
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: codeceptjs-output-${{ matrix.selenium-browser }}-${{ matrix.build-env }}
          path: tests/codeceptjs/output
          retention-days: 30
          merge-multiple: true
      - name: Test (optional)
        continue-on-error: true
        run: docker compose exec -T node codeceptjs run-multiple -c /repo/tests/codeceptjs/codecept.json basic:${SELENIUM_BROWSER} --grep '@optional'
 
 

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 2 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