Node.js CI workflow (nextapps-de/flexsearch)
The Node.js CI workflow from nextapps-de/flexsearch, explained and optimized by Latchkey.
CI health: A - excellent
Point runs-on at Latchkey and get run de-duplication, self-healing for flaky steps, and up to 58% lower cost, applied automatically.
What it does
This is the Node.js CI workflow from the nextapps-de/flexsearch repository, a real project running GitHub Actions. It is shown here with attribution under its Apache-2.0 license.
Below, Latchkey shows a faster, safer version produced by its optimization engine.
The workflow
# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs
name: Node.js CI
permissions:
contents: read
pull-requests: write
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
# Label of the container job
build:
# Containers must run in Linux based operating systems
runs-on: ubuntu-latest
timeout-minutes: 10
# # Docker Hub image that `container-job` executes in
# container: node:20-bookworm-slim
#
# # Service containers to run with `container-job`
# services:
# # Label used to access the service container
# postgres:
# # Docker Hub image
# image: postgres
# # Provide the password for postgres
# env:
# POSTGRES_USER: postgres
# POSTGRES_PASSWORD: postgres
# POSTGRES_DATABASE: postgres
# POSTGRES_HOST: postgres
# POSTGRES_PORT: 5432
#
# # Set health checks to wait until postgres has started
# options: >-
# --health-cmd pg_isready
# --health-interval 10s
# --health-timeout 5s
# --health-retries 5
strategy:
matrix:
node-version: [20.x, 22.x, 24.x] # 18.x
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- uses: actions/setup-java@v1
with:
java-version: 21
- run: npm install
- run: npm run build:compact
- run: npm run build:module:compact
- run: npm run build:light
- run: npm run build:module:light
- run: npm install
working-directory: test
- run: npm run test:github
working-directory: test
The same workflow, on Latchkey
Removes redundant runs and caps runaway jobs. Added and changed lines are highlighted.
# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs name: Node.js CI permissions: contents: read pull-requests: write on: push: branches: [ "master" ] pull_request: branches: [ "master" ] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: # Label of the container job build: # Containers must run in Linux based operating systems runs-on: latchkey-small timeout-minutes: 10 # # Docker Hub image that `container-job` executes in # container: node:20-bookworm-slim # # # Service containers to run with `container-job` # services: # # Label used to access the service container # postgres: # # Docker Hub image # image: postgres # # Provide the password for postgres # env: # POSTGRES_USER: postgres # POSTGRES_PASSWORD: postgres # POSTGRES_DATABASE: postgres # POSTGRES_HOST: postgres # POSTGRES_PORT: 5432 # # # Set health checks to wait until postgres has started # options: >- # --health-cmd pg_isready # --health-interval 10s # --health-timeout 5s # --health-retries 5 strategy: matrix: node-version: [20.x, 22.x, 24.x] # 18.x # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' - uses: actions/setup-java@v1 with: java-version: 21 - run: npm install - run: npm run build:compact - run: npm run build:module:compact - run: npm run build:light - run: npm run build:module:light - run: npm install working-directory: test - run: npm run test:github working-directory: test
What changed
- Run on Latchkey managed runners with one line (
runs-on), which apply the fixes below automatically and self-heal transient failures. This example useslatchkey-small; pick the runner size that fits the job. - Cancel superseded runs when a branch or PR gets a newer push.
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:
- Dependency installs
This workflow runs 1 job (3 with the matrix expanded) per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.