mirror of
https://github.com/PostHog/posthog.git
synced 2024-11-25 11:17:50 +01:00
164 lines
6.1 KiB
YAML
164 lines
6.1 KiB
YAML
name: Frontend CI
|
|
|
|
on:
|
|
pull_request:
|
|
push:
|
|
branches:
|
|
- master
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
# Job to decide if we should run frontend ci
|
|
# See https://github.com/dorny/paths-filter#conditional-execution for more details
|
|
# we skip each step individually, so they are still reported as success
|
|
# because many of them are required for CI checks to be green
|
|
changes:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 5
|
|
name: Determine need to run frontend checks
|
|
outputs:
|
|
frontend: ${{ steps.filter.outputs.frontend }}
|
|
steps:
|
|
# For pull requests it's not necessary to check out the code, but we
|
|
# also want this to run on master, so we need to check out
|
|
- uses: actions/checkout@v3
|
|
|
|
- uses: dorny/paths-filter@v2
|
|
id: filter
|
|
with:
|
|
filters: |
|
|
frontend:
|
|
# Avoid running frontend tests for irrelevant changes
|
|
# NOTE: we are at risk of missing a dependency here.
|
|
- 'bin/**'
|
|
- 'frontend/**'
|
|
- 'ee/frontend/**'
|
|
# Make sure we run if someone is explicitly change the workflow
|
|
- .github/workflows/ci-frontend.yml
|
|
# various JS config files
|
|
- .eslintrc.js
|
|
- .prettier*
|
|
- babel.config.js
|
|
- package.json
|
|
- pnpm-lock.yaml
|
|
- jest.*.ts
|
|
- tsconfig.json
|
|
- tsconfig.*.json
|
|
- webpack.config.js
|
|
- stylelint*
|
|
|
|
frontend-code-quality:
|
|
name: Code quality checks
|
|
needs: changes
|
|
# kea typegen and typescript:check need some more oomph
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
# we need at least one thing to run to make sure we include everything for required jobs
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Install pnpm
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
uses: pnpm/action-setup@v4
|
|
|
|
- name: Set up Node.js
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 18.12.1
|
|
|
|
- name: Get pnpm cache directory path
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
id: pnpm-cache-dir
|
|
run: echo "PNPM_STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
|
|
|
- uses: actions/cache@v4
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
id: pnpm-cache
|
|
with:
|
|
path: ${{ steps.pnpm-cache-dir.outputs.PNPM_STORE_PATH }}
|
|
key: ${{ runner.os }}-pnpm-cypress-${{ hashFiles('pnpm-lock.yaml') }}
|
|
restore-keys: ${{ runner.os }}-pnpm-cypress-
|
|
|
|
- name: Install package.json dependencies with pnpm
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
run: pnpm install --frozen-lockfile
|
|
|
|
- name: Check formatting with prettier
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
run: pnpm prettier:check
|
|
|
|
- name: Lint with Stylelint
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
run: pnpm lint:css
|
|
|
|
- name: Generate logic types and run typescript with strict
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
run: pnpm typegen:write && pnpm typescript:check
|
|
|
|
- name: Lint with ESLint
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
run: pnpm lint:js
|
|
|
|
- name: Check if "schema.json" is up to date
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
run: pnpm schema:build:json && git diff --exit-code
|
|
|
|
- name: Check if mobile replay "schema.json" is up to date
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
run: pnpm mobile-replay:schema:build:json && git diff --exit-code
|
|
|
|
- name: Check toolbar bundle size
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
uses: preactjs/compressed-size-action@v2
|
|
with:
|
|
build-script: 'build'
|
|
compression: 'none'
|
|
pattern: 'frontend/dist/toolbar.js'
|
|
# we only care if the toolbar will increase a lot
|
|
minimum-change-threshold: 1000
|
|
|
|
jest:
|
|
runs-on: ubuntu-latest
|
|
needs: changes
|
|
name: Jest test (${{ matrix.segment }} - ${{ matrix.chunk }})
|
|
|
|
strategy:
|
|
# If one test fails, still run the others
|
|
fail-fast: false
|
|
matrix:
|
|
segment: ['FOSS', 'EE']
|
|
chunk: [1, 2, 3]
|
|
|
|
steps:
|
|
# we need at least one thing to run to make sure we include everything for required jobs
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Remove ee
|
|
if: needs.changes.outputs.frontend == 'true' && matrix.segment == 'FOSS'
|
|
run: rm -rf ee
|
|
|
|
- name: Install pnpm
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
uses: pnpm/action-setup@v4
|
|
|
|
- name: Set up Node.js
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 18.12.1
|
|
cache: pnpm
|
|
|
|
- name: Install package.json dependencies with pnpm
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
run: pnpm install --frozen-lockfile
|
|
|
|
- name: Test with Jest
|
|
# set maxWorkers or Jest only uses 1 CPU in GitHub Actions
|
|
run: pnpm test:unit --maxWorkers=2 --shard=${{ matrix.chunk }}/3
|
|
if: needs.changes.outputs.frontend == 'true'
|
|
env:
|
|
NODE_OPTIONS: --max-old-space-size=6144
|