lightning-terminal/.github/workflows/main.yml
jamaljsr a04ecb750d
ci: run node 24
The frontend job was pinned to node 16, which is old enough that some of
the packages patched in this branch refuse to install there. tar and
esbuild want node 18 or newer, serialize-javascript wants 20.

Node was also only pinned in the frontend job. The backend,
proto-compile-check and itest jobs all reference matrix.node_version
without declaring it in their matrix, so the expression resolved to an
empty string and setup-node fell back to whatever the runner happened to
ship. Two of those run `yarn install --frozen-lockfile`, so they need a
known version too.

Both are fixed by a NODE_VERSION env var, matching how GO_VERSION is
already handled. It replaces the matrix entry rather than feeding it,
because the env context isn't available inside strategy.matrix.
2026-08-11 10:12:44 -05:00

380 lines
9.9 KiB
YAML

name: CI
on:
push:
branches:
- "master"
pull_request:
branches:
- "*"
concurrency:
# Cancel any previous workflows if they are from a PR or push.
group: ${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
permissions:
contents: read
defaults:
run:
shell: bash
env:
# If you change this value, please change it in the following files as well:
# /Dockerfile
# /dev.Dockerfile
GO_VERSION: 1.25.11
# Only applies to the CI jobs below. The note above covers GO_VERSION alone:
# /Dockerfile and /dev.Dockerfile pin their own Node version for release
# builds, and it does not have to match this one.
NODE_VERSION: 24.x
jobs:
########################
# frontend build checks
########################
frontend:
name: frontend tests on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ ubuntu-latest, windows-latest, macOS-latest ]
steps:
- name: git checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: setup nodejs ${{ env.NODE_VERSION }}
uses: ./.github/actions/setup-node
with:
node-version: '${{ env.NODE_VERSION }}'
- name: install dependencies
working-directory: ./app
run: yarn install --frozen-lockfile
- name: lint code
working-directory: ./app
run: yarn lint
- name: typescript compile
working-directory: ./app
run: yarn tsc
- name: unit tests
working-directory: ./app
run: yarn test:ci
########################
# backend build checks
########################
backend:
name: backend build on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
go_version: [ 1.18.x ]
os: [ ubuntu-latest, windows-latest, macOS-latest ]
steps:
- name: git checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: setup nodejs ${{ env.NODE_VERSION }}
uses: ./.github/actions/setup-node
with:
node-version: '${{ env.NODE_VERSION }}'
- name: setup go ${{ env.GO_VERSION }}
uses: ./.github/actions/setup-go
with:
go-version: '${{ env.GO_VERSION }}'
- name: build backend binary
run: make build
- name: build CLI binaries
run: make go-install-cli
########################
# cross compilation
########################
cross-compile:
name: cross compilation
runs-on: ubuntu-latest
strategy:
fail-fast: true
matrix:
# Please keep this list in sync with make/release_flags.mk!
include:
- name: i386
sys: linux-386
- name: amd64
sys: darwin-amd64 linux-amd64 windows-amd64
- name: arm
sys: darwin-arm64 linux-armv6 linux-armv7 linux-arm64
steps:
- name: cleanup space
run: rm -rf /opt/hostedtoolcache
- name: git checkout
uses: actions/checkout@v4
- name: setup go ${{ env.GO_VERSION }}
uses: ./.github/actions/setup-go
with:
go-version: '${{ env.GO_VERSION }}'
- name: build release for all architectures (skip app build)
run: make go-release sys="${{ matrix.sys }}"
########################
# proto compile check
########################
proto-compile-check:
name: RPC proto compilation check
runs-on: ubuntu-latest
steps:
- name: git checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: setup nodejs ${{ env.NODE_VERSION }}
uses: ./.github/actions/setup-node
with:
node-version: '${{ env.NODE_VERSION }}'
- name: setup go ${{ env.GO_VERSION }}
uses: ./.github/actions/setup-go
with:
go-version: '${{ env.GO_VERSION }}'
- name: install dependencies
working-directory: ./app
run: yarn install --frozen-lockfile
- name: run check
run: make rpc-js-compile && make protos-check
- name: compile rpc for golang
run: make rpc
- name: run check
run: make mod-check
########################
# check commits
########################
check-commits:
if: github.event_name == 'pull_request'
name: check commits
runs-on: ubuntu-latest
steps:
- name: git checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: setup go ${{ env.GO_VERSION }}
uses: ./.github/actions/setup-go
with:
go-version: '${{ env.GO_VERSION }}'
- name: fetch and rebase on ${{ github.base_ref }}
env:
BASE_REF: ${{ github.base_ref }}
REPOSITORY: ${{ github.repository }}
run: |
git remote add upstream "https://github.com/${REPOSITORY}"
git fetch upstream
export GIT_COMMITTER_EMAIL="litd-ci@example.com"
export GIT_COMMITTER_NAME="LiT CI"
git rebase "upstream/${BASE_REF}"
- name: check commits
env:
BASE_REF: ${{ github.base_ref }}
run: scripts/check-each-commit.sh "upstream/${BASE_REF}"
#######################
# sql model generation
#######################
sqlc-check:
name: Sqlc check
runs-on: ubuntu-latest
steps:
- name: git checkout
uses: actions/checkout@v4
- name: setup go ${{ env.GO_VERSION }}
uses: ./.github/actions/setup-go
with:
go-version: '${{ env.GO_VERSION }}'
- name: docker image cache
uses: jpribyl/action-docker-layer-caching@c632825d12ec837065f49726ea27ddd40bcc7894 # v0.1.1
continue-on-error: true
- name: Generate sql models
run: make sqlc-check
########################
# lint code
########################
lint:
name: lint
runs-on: ubuntu-latest
steps:
- name: git checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: setup go ${{ env.GO_VERSION }}
uses: ./.github/actions/setup-go
with:
go-version: '${{ env.GO_VERSION }}'
- name: prepare dummy static data
run: mkdir -p app/build; touch app/build/index.html
- name: run check
run: make mod-check && make lint
########################
# unit tests
########################
unit-test:
name: run unit tests
runs-on: ubuntu-latest
strategy:
# Allow other tests in the matrix to continue if one fails.
fail-fast: false
matrix:
unit_type:
- unit-race
- unit
- unit dbbackend=postgres
- unit dbbackend=sqlite
steps:
- name: git checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: setup go ${{ env.GO_VERSION }}
uses: ./.github/actions/setup-go
with:
go-version: '${{ env.GO_VERSION }}'
- name: run ${{ matrix.unit_type }}
run: make ${{ matrix.unit_type }}
########################
# build itest binaries (cache warming)
########################
build-itest:
name: build itest binaries
runs-on: ubuntu-latest
steps:
- name: git checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: setup go ${{ env.GO_VERSION }}
uses: ./.github/actions/setup-go
with:
go-version: '${{ env.GO_VERSION }}'
key-prefix: itest
- name: prepare dummy static data
run: mkdir -p app/build; touch app/build/index.html
- name: build itest binaries
run: make build-itest build-itest-binary
########################
# integration tests
########################
itest:
name: integration test
runs-on: ubuntu-latest
needs: build-itest
strategy:
# Allow other tests in the matrix to continue if one fails.
fail-fast: false
matrix:
include:
- name: bbolt
args: itest-parallel icase=terminal dbbackend=bbolt tranches=4
- name: sqlite
args: itest-parallel icase=terminal dbbackend=sqlite tranches=4
- name: postgres
args: itest-parallel icase=terminal dbbackend=postgres tranches=4
steps:
- name: git checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: setup nodejs ${{ env.NODE_VERSION }}
uses: ./.github/actions/setup-node
with:
node-version: '${{ env.NODE_VERSION }}'
- name: setup go ${{ env.GO_VERSION }}
uses: ./.github/actions/setup-go
with:
go-version: '${{ env.GO_VERSION }}'
key-prefix: itest
- name: install dependencies
working-directory: ./app
run: yarn install --frozen-lockfile
- name: run itest ${{ matrix.name }}
run: make ${{ matrix.args }}
- name: Zip log files on failure
if: ${{ failure() }}
timeout-minutes: 5
# Note that we move the itest logs into a "logs" folder not prefixed by
# a dot character (.) to ensure that they dir doesn't appear as a
# hidden folder when being downloaded.
run: |
mkdir -p itest/logs
cp -R itest/.logs/. itest/logs/
7z a logs-itest-${{ matrix.name }}.zip itest/logs itest/*.log
- name: Upload log files on failure
uses: actions/upload-artifact@v4
if: ${{ failure() }}
with:
name: logs-itest-${{ matrix.name }}
path: logs-itest-${{ matrix.name }}.zip
retention-days: 5
########################
# check PR updates release notes
########################
release-notes-check:
name: check release notes updated
runs-on: ubuntu-latest
if: '!contains(github.event.pull_request.labels.*.name, ''no-changelog'')'
steps:
- name: git checkout
uses: actions/checkout@v4
- name: release notes check
run: scripts/check-release-notes.sh