name: TestJS on: # Run on relevant pushes to select branches and on all relevant pull requests. push: branches: - main - trunk - 'release/**' - 'hotfix/[0-9]+.[0-9]+*' - 'feature/**' paths: - '**.js' # Includes Gruntfile.js. - '.browserslistrc' - '.eslintignore' - '.eslintrc' - '.nvmrc' - '.yarnrc' - 'lerna.json' - 'package.json' - 'yarn.lock' - '.github/workflows/jstest.yml' - '.yarn/**' - 'apps/**' - 'config/grunt/**' - 'packages/**' pull_request: paths: - '**.js' # Includes Gruntfile.js. - '.browserslistrc' - '.eslintignore' - '.eslintrc' - '.nvmrc' - '.yarnrc' - 'lerna.json' - 'package.json' - 'yarn.lock' - '.github/workflows/jstest.yml' - '.yarn/**' - 'apps/**' - 'config/grunt/**' - 'packages/**' # Allow manually triggering the workflow. workflow_dispatch: # Cancels all previous workflow runs for the same branch that have not yet completed. concurrency: # The concurrency group contains the workflow name and the branch name. group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: ######################################################################################### # For packages in this job, the full test suite is always run. ######################################################################################### yarn-test-full: runs-on: ubuntu-latest strategy: # As these packages are all unique, don't stop the workflow when the test run of one package fails. fail-fast: false matrix: package: - 'analysis-report' - 'browserslist-config' - 'components' - 'feature-flag' - 'helpers' - 'js' - 'replacement-variable-editor' - 'search-metadata-previews' - 'social-metadata-forms' - 'social-metadata-previews' name: "TestJS - ${{ matrix.package }} (full)" steps: - name: Checkout code uses: actions/checkout@v4 # The ubuntu images come with Node, npm and yarn pre-installed. # https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md # This action also handles the caching of the Yarn dependencies. # https://github.com/actions/setup-node - name: Set up node and enable caching of dependencies uses: actions/setup-node@v4 with: node-version-file: './.nvmrc' cache: 'yarn' - name: Yarn install run: yarn install - name: Show debug info run: | npm --version node --version yarn --version grunt --version - name: Build all packages run: yarn run build --ignore "@yoast/wordpress-seo" - name: Show Jest version run: yarn run jest --version working-directory: packages/${{ matrix.package }} - name: Show Config run: yarn test --showConfig working-directory: packages/${{ matrix.package }} - name: Run Javascript tests run: yarn test --ci --coverage working-directory: packages/${{ matrix.package }} - name: Upload coverage results to Coveralls uses: coverallsapp/github-action@v2 env: COVERALLS_SERVICE_NUMBER: ${{ github.sha }} # Connect all builds together. with: flag-name: package-${{ matrix.package }} parallel: true ######################################################################################### # For packages in this job, PRs will only run the tests related to changed files # to make the build faster. # For merges and pushes to select branches, the full test suite is still run. # Packages should (only) be moved to this job if the full test run is exceedingly slow. ######################################################################################### yarn-test-onlyChanged: runs-on: ubuntu-latest strategy: # As these packages are all unique, don't stop the workflow when the test run of one package fails. fail-fast: false matrix: include: - package: 'yoastseo' needs_premium_config: true name: "TestJS - ${{ matrix.package }}${{ github.event_name == 'pull_request' && ' (onlyChanged)' || ' (full)' }}" steps: - name: Checkout code uses: actions/checkout@v4 - name: Checks for changes uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # dorny/paths-filter@v3.0.2 id: changes with: filters: | src: - 'packages/${{ matrix.package }}/**' # For pull requests, only run the full tests when touching this package. - name: Checks if tests should be run id: checks-run run: | echo "should=${{ github.event_name != 'pull_request' || steps.changes.outputs.src == 'true' }}" >> "$GITHUB_OUTPUT" # Check out the premium config repo ahead of running the tests to prevent issues with permissions. - name: Checkout premium configuration if: ${{ steps.checks-run.outputs.should == 'true' && matrix.needs_premium_config == true }} uses: actions/checkout@v4 with: repository: Yoast/YoastSEO.js-premium-configuration path: packages/yoastseo/premium-configuration fetch-depth: 0 token: ${{ secrets.YOASTBOT_CI_PAT_DIST }} # The ubuntu images come with Node, npm and yarn pre-installed. # https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md # This action also handles the caching of the Yarn dependencies. # https://github.com/actions/setup-node - name: Set up node and enable caching of dependencies if: ${{ steps.checks-run.outputs.should == 'true' }} uses: actions/setup-node@v4 with: node-version-file: './.nvmrc' cache: 'yarn' - name: Yarn install if: ${{ steps.checks-run.outputs.should == 'true' }} run: yarn install - name: Show debug info if: ${{ steps.checks-run.outputs.should == 'true' }} run: | npm --version node --version yarn --version grunt --version - name: Build all packages if: ${{ steps.checks-run.outputs.should == 'true' }} run: yarn run build --ignore "@yoast/wordpress-seo" - name: Show Jest version if: ${{ steps.checks-run.outputs.should == 'true' }} run: yarn run jest --version working-directory: packages/${{ matrix.package }} - name: Show Config if: ${{ steps.checks-run.outputs.should == 'true' }} run: yarn test --showConfig working-directory: packages/${{ matrix.package }} - name: Run Javascript tests if: ${{ steps.checks-run.outputs.should == 'true' }} run: yarn test --ci --coverage working-directory: packages/${{ matrix.package }} - name: Upload coverage results to Coveralls if: ${{ steps.checks-run.outputs.should == 'true' }} uses: coverallsapp/github-action@v2 env: COVERALLS_SERVICE_NUMBER: ${{ github.sha }} # Connect all builds together. with: flag-name: package-${{ matrix.package }} parallel: true