Skip to content

chore: wip #11368

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 5 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
315 changes: 29 additions & 286 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@ on:
branches:
- main
pull_request:
branches:
- '**'
merge_group:

concurrency:
group: '${{ github.workflow }} - ${{ github.head_ref || github.ref }}'
Expand All @@ -23,304 +20,50 @@ env:
defaults:
run:
shell: bash

#
# Workflow for how the CI spawns jobs:
# 1) Run the install and cache the install artefacts
# 2) Run the build and cache the output
# - In parallel we also any steps that don't need the build (like prettier)
# 3) Run the steps that depend on the build
#

permissions:
contents: read # to fetch code (actions/checkout)
actions: read
contents: read

jobs:
install:
name: Checkout and Install
environment: ${{ (github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main') && 'main' || '' }} # Have to specify per job
runs-on: ubuntu-latest
env:
NX_CI_EXECUTION_ENV: 'ubuntu-latest'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install
uses: ./.github/actions/prepare-install
with:
node-version: ${{ env.PRIMARY_NODE_VERSION }}

build:
name: Build All Packages
environment: ${{ (github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main') && 'main' || '' }} # Have to specify per job
needs: [install]
runs-on: ubuntu-latest
env:
NX_CI_EXECUTION_ENV: 'ubuntu-latest'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install
uses: ./.github/actions/prepare-install
with:
node-version: ${{ env.PRIMARY_NODE_VERSION }}
- name: Build
uses: ./.github/actions/prepare-build

generate_configs:
name: Generate Configs
environment: ${{ (github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main') && 'main' || '' }} # Have to specify per job
needs: [build]
runs-on: ubuntu-latest
env:
NX_CI_EXECUTION_ENV: 'ubuntu-latest'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install
uses: ./.github/actions/prepare-install
with:
node-version: ${{ env.PRIMARY_NODE_VERSION }}
- run: yarn nx run generate-configs
- run: git status --porcelain
- if: failure()
run: echo "Outdated result detected from yarn generate-configs. Please check in any file changes."

lint_without_build:
name: Lint without build
environment: ${{ (github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main') && 'main' || '' }} # Have to specify per job
needs: [install]
runs-on: ubuntu-latest
strategy:
matrix:
lint-task: ['check-spelling', 'check-format', 'lint-markdown']
env:
NX_CI_EXECUTION_ENV: 'ubuntu-latest'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install
uses: ./.github/actions/prepare-install
with:
node-version: ${{ env.PRIMARY_NODE_VERSION }}

- name: Run Check
run: yarn ${{ matrix.lint-task }}

lint_with_build:
name: Lint with build
environment: ${{ (github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main') && 'main' || '' }} # Have to specify per job
# because we lint with our own tooling, we need to build
needs: [build]
runs-on: ubuntu-latest
strategy:
matrix:
lint-task: ['lint', 'typecheck', 'knip']
env:
NX_CI_EXECUTION_ENV: 'ubuntu-latest'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install
uses: ./.github/actions/prepare-install
with:
node-version: ${{ env.PRIMARY_NODE_VERSION }}
- name: Build
uses: ./.github/actions/prepare-build

- name: Run Check
run: yarn ${{ matrix.lint-task }}
env:
ESLINT_USE_FLAT_CONFIG: true

stylelint:
name: Stylelint
main:
environment: ${{ (github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main') && 'main' || '' }} # Have to specify per job
needs: [install]
runs-on: ubuntu-latest
env:
NX_CI_EXECUTION_ENV: 'ubuntu-latest'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install
uses: ./.github/actions/prepare-install
with:
node-version: ${{ env.PRIMARY_NODE_VERSION }}
- name: Run stylelint check
run: yarn stylelint
working-directory: packages/website

integration_tests:
name: Run integration tests on primary Node.js version
environment: ${{ (github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main') && 'main' || '' }} # Have to specify per job
needs: [build]
runs-on: ubuntu-latest
env:
NX_CI_EXECUTION_ENV: 'ubuntu-latest'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install
uses: ./.github/actions/prepare-install
with:
node-version: ${{ env.PRIMARY_NODE_VERSION }}
- name: Build
uses: ./.github/actions/prepare-build

- name: Run integration tests
run: yarn test-integration
env:
CI: true

unit_tests:
name: Run Unit Tests
environment: ${{ (github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main') && 'main' || '' }} # Have to specify per job
needs: [build]
runs-on: ${{ matrix.os }}
strategy:
matrix:
exclude:
- os: windows-latest
node-version: 18
os: [ubuntu-latest, windows-latest]
# just run on the oldest and latest supported versions and assume the intermediate versions are good
node-version: [18, 20]
package:
[
'ast-spec',
'eslint-plugin',
'eslint-plugin-internal',
'parser',
'project-service',
'rule-tester',
'scope-manager',
'tsconfig-utils',
'type-utils',
'typescript-eslint',
'typescript-estree',
'utils',
'visitor-keys',
]
env:
NX_CI_EXECUTION_ENV: '${{ matrix.os }} - Node ${{ matrix.node-version }}'
COLLECT_COVERAGE: false
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Install
uses: ./.github/actions/prepare-install
- uses: actions/checkout@v4
with:
node-version: ${{ matrix.node-version }}
- name: Build
uses: ./.github/actions/prepare-build

# collect coverage on the primary node version
# we don't collect coverage on other node versions so they run faster
- name: Run unit tests with coverage for ${{ matrix.package }}
if: env.PRIMARY_NODE_VERSION == matrix.node-version && matrix.os == 'ubuntu-latest'
run: yarn nx run ${{ matrix.package }}:test -- --coverage
env:
CI: true
- name: Run unit tests for ${{ matrix.package }}
if: env.PRIMARY_NODE_VERSION != matrix.node-version || matrix.os != 'ubuntu-latest'
run: yarn nx test ${{ matrix.package }}
env:
CI: true
filter: tree:0
fetch-depth: 0

- name: Store coverage for uploading
if: env.PRIMARY_NODE_VERSION == matrix.node-version && matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.package }}-coverage
path: packages/${{ matrix.package }}/coverage/lcov.info
# Sadly 1 day is the minimum
retention-days: 1
- run: corepack enable

unit_tests_project_service:
name: Run Unit Tests with Project Service
environment: ${{ (github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main') && 'main' || '' }} # Have to specify per job
needs: [build]
runs-on: ubuntu-latest
strategy:
matrix:
package:
['eslint-plugin', 'eslint-plugin-internal', 'typescript-estree']
env:
NX_CI_EXECUTION_ENV: 'ubuntu-latest'
COLLECT_COVERAGE: false,
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Install
uses: ./.github/actions/prepare-install
with:
node-version: 18
- name: Build
uses: ./.github/actions/prepare-build
- name: Run unit tests for ${{ matrix.package }}
run: yarn nx test ${{ matrix.package }} --coverage=false
# Enable task distribution via Nx Cloud
- run: yarn dlx nx-cloud start-ci-run --distribute-on="10 linux-medium-js" --stop-agents-after="build" --with-env-vars="SKIP_POSTINSTALL,GIT_FETCH_TAGS,HUSKY"
env:
CI: true
TYPESCRIPT_ESLINT_PROJECT_SERVICE: true

upload_coverage:
name: Upload Codecov Coverage
environment: ${{ (github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main') && 'main' || '' }} # Have to specify per job
needs: [unit_tests]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
SKIP_POSTINSTALL: 'true' # Skip postinstall scripts on Nx Agents
GIT_FETCH_TAGS: 'true' # Fetch all tags on checkout on Nx Agents
HUSKY: '0' # Do not run husky install on Nx Agents

- name: Download coverage reports
uses: actions/download-artifact@v4
with:
path: coverage
- uses: nrwl/nx-set-shas@v4

- name: Publish code coverage report
uses: codecov/[email protected]
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: coverage/**/lcov.info
flags: unittest
name: codecov

publish_canary_version:
name: Publish the latest code as a canary version
environment: ${{ (github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main') && 'main' || '' }} # Have to specify per job
runs-on: ubuntu-latest
permissions:
id-token: write
needs: [integration_tests, lint_with_build, lint_without_build, unit_tests]
if: github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main'
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0 # we need the tags to be available

- name: Install
uses: ./.github/actions/prepare-install
- uses: actions/setup-node@v4
with:
node-version: ${{ env.PRIMARY_NODE_VERSION }}
registry-url: 'https://registry.npmjs.org'

- name: Build
uses: ./.github/actions/prepare-build

- name: Figure out and apply the next canary version
run: npx tsx tools/release/apply-canary-version.mts
cache: 'yarn'

- name: Publish all packages to npm with the canary tag
# NOTE: this needs to be npx, rather than yarn, to make sure the authenticated npm registry is used
run: npx nx release publish --tag canary --verbose
- name: Install dependencies
run: |
yarn install --immutable --inline-builds
yarn check-clean-workspace-after-install
env:
NX_CLOUD_DISTRIBUTED_EXECUTION: false
# This secret is only accessible on the GitHub environment "main"
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
NPM_CONFIG_PROVENANCE: true
# CI optimizations. Overrides yarnrc.yml options (or their defaults) in the CI action.
YARN_ENABLE_GLOBAL_CACHE: 'false' # Use local cache folder to keep downloaded archives
YARN_NM_MODE: 'hardlinks-local' # Hardlinks-(local|global) reduces io / node_modules size
YARN_INSTALL_STATE_PATH: .yarn/ci-cache/install-state.gz # Very small speedup when lock does not change
# Other environment variables
HUSKY: '0' # By default do not run HUSKY install
SKIP_POSTINSTALL: 'true'

# Website will be built by the Netlify GitHub App
- run: yarn nx run-many --target=build --exclude=website --exclude=website-eslint
Loading