diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d0f2090b..12aa85be 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,70 +1,165 @@ -name: "CI" +name: CI on: [push, pull_request] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true +env: + DEFAULT_NODE_VERSION: 22.x + jobs: - test: + misc: + name: Tooling checks + strategy: + fail-fast: false + matrix: + os: + - macos-latest + - ubuntu-latest + - windows-latest runs-on: ${{ matrix.os }} + steps: + - name: Ensure line endings are consistent + run: git config --global core.autocrlf input + - name: Check out repository + uses: actions/checkout@v4 + - name: Use Node.js ${{ env.DEFAULT_NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.DEFAULT_NODE_VERSION }} + - name: Load dependency cache + uses: actions/cache@v4 + with: + path: | + **/node_modules + key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} + - name: Install dependencies + run: yarn install --frozen-lockfile + - name: Build TypeScript with esModuleInterop flag + run: yarn run build:ts --esModuleInterop true + - name: Run linter + run: yarn run lint + - name: Run depcheck + run: yarn run depcheck + - name: Test clean script + run: yarn run clean + + test: + name: Unit tests strategy: + fail-fast: false matrix: - os: [ubuntu-latest, macos-latest, windows-latest] + os: + - macos-latest + - ubuntu-latest + - windows-latest node-version: - 18.x - 20.x - 22.x + runs-on: ${{ matrix.os }} steps: + - name: Ensure line endings are consistent + run: git config --global core.autocrlf input + - name: Check out repository + uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} + - name: Load dependency cache + uses: actions/cache@v4 + with: + path: | + **/node_modules + key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} + - name: Install dependencies and build + run: yarn install --frozen-lockfile + - name: Run unit tests + run: yarn run test-ci:unit + env: + NODE_OPTIONS: --max_old_space_size=4096 + - name: Submit coverage results + uses: coverallsapp/github-action@v2 + with: + github-token: ${{ secrets.github_token }} + flag-name: run-${{ matrix.node-version }} + parallel: true + + systemtest: + name: System tests + strategy: + fail-fast: false + matrix: + os: + - macos-latest + - ubuntu-latest + - windows-latest + node-version: + - 18.x + - 20.x + - 22.x + runs-on: ${{ matrix.os }} + steps: - name: Ensure line endings are consistent run: git config --global core.autocrlf input - name: Check out repository uses: actions/checkout@v4 - - name: Load cache + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + - name: Load dependency cache uses: actions/cache@v4 with: path: | **/node_modules - key: ${{ runner.os }}-test-modules-v1-${{ hashFiles('**/yarn.lock') }} - - name: Install dependencies - run: yarn install --frozen-lockfile --ignore-engines - - name: Build project - run: yarn run build - - name: Build project -- esModuleInterop true - run: yarn run build:ts --esModuleInterop true - - name: Run unit tests (ubuntu, mac) - if: ${{ (matrix.os == 'ubuntu-latest') || (matrix.os == 'macos-latest') }} - run: export NODE_OPTIONS="--max_old_space_size=4096" && yarn run test-ci:unit - - name: Run unit tests (windows) - if: ${{ matrix.os == 'windows-latest' }} - run: set NODE_OPTIONS=--max-old-space-size=4096 && yarn run test-ci:unit + key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} + - name: Install dependencies and build + run: yarn install --frozen-lockfile - name: Run system tests - if: ${{ matrix.os == 'ubuntu-latest' }} - uses: nick-fields/retry@v3 + run: yarn run test-ci:system + env: + NODE_OPTIONS: --max_old_space_size=4096 + + browsertest: + name: Browser tests + strategy: + fail-fast: false + matrix: + node-version: + - 18.x + - 20.x + - 22.x + runs-on: ubuntu-latest + steps: + - name: Ensure line endings are consistent + run: git config --global core.autocrlf input + - name: Check out repository + uses: actions/checkout@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 with: - timeout_minutes: 2 - max_attempts: 3 - command: export NODE_OPTIONS="--max_old_space_size=4096" && yarn run test-ci:system + node-version: ${{ matrix.node-version }} + - name: Load dependency cache + uses: actions/cache@v4 + with: + path: | + **/node_modules + key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} + - name: Install dependencies and build + run: yarn install --frozen-lockfile - name: Run browser tests - if: ${{ matrix.os == 'ubuntu-latest' }} uses: nick-fields/retry@v3 with: timeout_minutes: 3 max_attempts: 3 command: yarn run test-browser - - name: Submit coverage results - uses: coverallsapp/github-action@v2 - with: - github-token: ${{ secrets.github_token }} - flag-name: run-${{ matrix.node-version }} - parallel: true coveralls: + name: Coverage check needs: test runs-on: ubuntu-latest steps: @@ -74,44 +169,34 @@ jobs: github-token: ${{ secrets.github_token }} parallel-finished: true - lint: - runs-on: ubuntu-latest - steps: - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: 18.x - - name: Check out repository - uses: actions/checkout@v4 - - name: Load cache - uses: actions/cache@v4 - with: - path: '**/node_modules' - key: ${{ runner.os }}-lint-modules-v1-${{ hashFiles('**/yarn.lock') }} - - name: Install dependencies - run: yarn install --frozen-lockfile --ignore-engines - - name: Run linter - run: yarn run lint - - docker: + dockerimages: + name: Docker images needs: + - misc - test - - lint + - systemtest + - browsertest + env: + # TODO: remove this override once lerna-docker works with Node 18+ + DEFAULT_NODE_VERSION: 18.x runs-on: ubuntu-latest steps: - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: 18.x + - name: Ensure line endings are consistent + run: git config --global core.autocrlf input - name: Check out repository uses: actions/checkout@v4 - - name: Load cache + - name: Use Node.js ${{ env.DEFAULT_NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.DEFAULT_NODE_VERSION }} + - name: Load dependency cache uses: actions/cache@v4 with: - path: '**/node_modules' - key: ${{ runner.os }}-docker-modules-v1-${{ hashFiles('**/yarn.lock') }} - - name: Install dependencies - run: yarn install --frozen-lockfile --ignore-engines + path: | + **/node_modules + key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} + - name: Install dependencies and build monorepo + run: yarn install --frozen-lockfile - name: Install Lerna Docker run: sh -c "`curl -fsSl https://raw.githubusercontent.com/rubensworks/lerna-docker/master/install.sh`" - name: Build Docker images @@ -122,26 +207,39 @@ jobs: env: DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Deploy Docker images (next/major) + if: startsWith(github.ref, 'refs/heads/next') + run: ~/.lerna-docker/bin/lerna-docker comunica push next + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} performance: + name: Performance benchmarks + if: startsWith(github.ref, 'refs/heads/master') || startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/heads/feature') || startsWith(github.ref, 'refs/heads/next') runs-on: ubuntu-latest strategy: + fail-fast: false matrix: benchmark: - solidbench - needs: - - test - - lint - if: startsWith(github.ref, 'refs/heads/master') || startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/heads/feature') || startsWith(github.ref, 'refs/heads/next') steps: + - name: Ensure line endings are consistent + run: git config --global core.autocrlf input - name: Check out repository uses: actions/checkout@v4 - - name: Use Node.js + - name: Use Node.js ${{ env.DEFAULT_NODE_VERSION }} uses: actions/setup-node@v4 with: - node-version: 22.x - - name: Install dependencies - run: yarn install --frozen-lockfile --ignore-engines + node-version: ${{ env.DEFAULT_NODE_VERSION }} + - name: Load dependency cache + uses: actions/cache@v4 + with: + path: | + **/node_modules + key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} + - name: Install dependencies and build monorepo + run: yarn install --frozen-lockfile - name: Run benchmarks run: cd performance/benchmark-${{ matrix.benchmark }}/ && yarn run performance:ci - uses: actions/upload-artifact@v4 @@ -152,17 +250,23 @@ jobs: run: cat performance/benchmark-${{ matrix.benchmark }}/combinations/combination_0/output/query-times.csv performance-consolidate: + name: Performance analysis needs: + - misc + - test + - systemtest + - browsertest - performance runs-on: ubuntu-latest - if: startsWith(github.ref, 'refs/heads/master') || startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/heads/feature') || startsWith(github.ref, 'refs/heads/next') steps: + - name: Ensure line endings are consistent + run: git config --global core.autocrlf input - name: Check out repository uses: actions/checkout@v4 - - name: Use Node.js + - name: Use Node.js ${{ env.DEFAULT_NODE_VERSION }} uses: actions/setup-node@v4 with: - node-version: 18.x + node-version: ${{ env.DEFAULT_NODE_VERSION }} - uses: actions/download-artifact@v4 with: name: performance-benchmark-solidbench @@ -212,51 +316,82 @@ jobs: with: body-path: ./commit-comment-body.txt - docs: + documentation: + name: Prepare documentation runs-on: ubuntu-latest steps: - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: 18.x + - name: Ensure line endings are consistent + run: git config --global core.autocrlf input - name: Check out repository uses: actions/checkout@v4 - - name: Load cache + - name: Use Node.js ${{ env.DEFAULT_NODE_VERSION }} + uses: actions/setup-node@v4 + with: + node-version: ${{ env.DEFAULT_NODE_VERSION }} + - name: Load dependency cache uses: actions/cache@v4 with: - path: '**/node_modules' - key: ${{ runner.os }}-docs-modules-v1-${{ hashFiles('**/yarn.lock') }} + path: | + **/node_modules + key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - name: Install dependencies - run: yarn install --frozen-lockfile --ignore-engines - - name: Build docs + run: yarn install --ignore-scripts --frozen-lockfile + - name: Build documentation run: yarn run doc - - name: Deploy TSDoc to GitHub Pages - if: startsWith(github.ref, 'refs/heads/master') - uses: JamesIves/github-pages-deploy-action@v4 + - name: Prepare artifact + uses: actions/upload-pages-artifact@v3 with: - branch: gh-pages - folder: documentation - clean: true + path: documentation + name: documentation - webclients: + documentation-publish: + name: Publish documentation needs: + - misc - test - - lint + - systemtest + - browsertest + - documentation runs-on: ubuntu-latest + # The documentation is only published for master branch + if: startsWith(github.ref, 'refs/heads/master') + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} steps: - - name: Use Node.js - uses: actions/setup-node@v4 + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 with: - node-version: 18.x + artifact_name: documentation + + webclients: + needs: + - misc + - test + - systemtest + - browsertest + runs-on: ubuntu-latest + steps: + - name: Ensure line endings are consistent + run: git config --global core.autocrlf input - name: Check out repository uses: actions/checkout@v4 - - name: Load cache + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + - name: Load dependency cache uses: actions/cache@v4 with: - path: '**/node_modules' - key: ${{ runner.os }}-webclients-modules-v1-${{ hashFiles('**/yarn.lock') }} - - name: Install dependencies - run: yarn install --frozen-lockfile --ignore-engines + path: | + **/node_modules + key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} + - name: Install dependencies and build + run: yarn install --frozen-lockfile - name: Build web clients run: ./web-clients/build-web-clients.sh - name: Deploy web clients