domjtalbot/nx-mesh

View on GitHub
.github/actions/setup-job/action.yml

Summary

Maintainability
Test Coverage
name: 'Set up the job'
description: 'Install Node, PNPM, project dependencies and get NX SHAs'

inputs:
  browsers:
    description: Set up Node with Cypress browsers?
    required: false
    default: 'false'
  fetch_depth:
    description: >
      Number of commits to fetch.
      0 indicates all history for all branches and tags.
    default: '1'
  node_version:
    description: >
      Optionally define the version of Node to install.
    required: false
    default: 'lts/*'
  skip_node_cache:
    description: >
      Should node_modules cahce be skipped?
    required: false
    default: 'false'
  save_cache:
    description: Should the cache be saved upon completion?
    required: false
    default: 'false'

outputs:
  cache_hit:
    description: >
      A boolean value to indicate an exact match was found for the primary key
    value: ${{ steps.pnpm-global-cache.outputs.cache-hit }}
  cache_key:
    description: >
      The cache key used to suffix node cache keys
    value: ${{ steps.cache_key.outputs.key }}
  node_version:
    description: The installed node version.
    value: ${{ steps.node.outputs.version }}
  nx_base:
    description: >
      The value intended for use with --base or NX_BASE in all subsequent
      `nx affected` commands within the current workflow.
    value: ${{ steps.nx_shas.outputs.base }}
  nx_head:
    description: >
      The value intended for use with --head or NX_HEAD in all subsequent
      `nx affected` commands within the current workflow.
    value: ${{ steps.nx_shas.outputs.head }}
  pnpm_directory:
    description: The installed pnpm directory.
    value: ${{ steps.directory.outputs.path }}
  pnpm_version:
    description: The installed pnpm version.
    value: ${{ steps.pnpm.outputs.version }}
  restore_cache_key:
    description: >
      The restore cache key used to suffix node restore cache keys
    value: ${{ steps.restore_cache_key.outputs.key }}
  apps:
    description: 'All apps'
    value: ${{ steps.affected.outputs.apps }}
  e2eApps:
    description: 'All E2E apps'
    value: ${{ steps.affected.outputs.e2eApps }}
  nonE2EApps:
    description: 'All Non-E2E apps'
    value: ${{ steps.affected.outputs.nonE2EApps }}
  libs:
    description: 'All libs'
    value: ${{ steps.affected.outputs.libs }}
  numberOfApps:
    description: 'The number of apps'
    value: ${{ steps.affected.outputs.numberOfApps }}
  numberOfE2eApps:
    description: 'The number of E2E apps'
    value: ${{ steps.affected.outputs.numberOfE2eApps }}
  numberOfNonE2EApps:
    description: 'The number of non-e2e apps'
    value: ${{ steps.affected.outputs.numberOfNonE2EApps }}
  numberOfLibs:
    description: 'The number of libs'
    value: ${{ steps.affected.outputs.numberOfLibs }}
  hasApps:
    description: 'Are there apps?'
    value: ${{ steps.affected.outputs.hasApps }}
  hasE2EApps:
    description: 'Are there E2E apps?'
    value: ${{ steps.affected.outputs.hasE2EApps }}
  hasNonE2EApps:
    description: 'Are there non-e2e apps?'
    value: ${{ steps.affected.outputs.hasNonE2EApps }}
  hasLibs:
    description: 'Are there libs?'
    value: ${{ steps.affected.outputs.hasLibs }}
  hasProjects:
    description: 'Are there apps or libs?'
    value: ${{ steps.affected.outputs.hasProjects }}
  affectedApps:
    description: 'Affected apps'
    value: ${{ steps.affected.outputs.affectedApps }}
  affectedE2eApps:
    description: 'Affected E2E apps'
    value: ${{ steps.affected.outputs.affectedE2eApps }}
  affectedNonE2EApps:
    description: 'Affected non-e2e apps'
    value: ${{ steps.affected.outputs.affectedNonE2EApps }}
  affectedLibs:
    description: 'Affected libs'
    value: ${{ steps.affected.outputs.affectedLibs }}
  numberOfAffectedApps:
    description: 'The number of affected apps'
    value: ${{ steps.affected.outputs.numberOfAffectedApps }}
  numberOfAffectedE2eApps:
    description: 'The number of affected E2E apps'
    value: ${{ steps.affected.outputs.numberOfAffectedE2eApps }}
  numberOfAffectedNonE2EApps:
    description: 'The number of affected non-E2E apps'
    value: ${{ steps.affected.outputs.numberOfAffectedNonE2EApps }}
  numberOfAffectedLibs:
    description: 'The number of affected libs'
    value: ${{ steps.affected.outputs.numberOfAffectedLibs }}
  hasAffectedApps:
    description: 'Are there affected apps?'
    value: ${{ steps.affected.outputs.hasAffectedApps }}
  hasAffectedE2EApps:
    description: 'Are there affected E2E apps?'
    value: ${{ steps.affected.outputs.hasAffectedE2EApps }}
  hasAffectedNonE2EApps:
    description: 'Are there affected non-e2e apps?'
    value: ${{ steps.affected.outputs.hasAffectedNonE2EApps }}
  hasAffectedLibs:
    description: 'Are there affected libs?'
    value: ${{ steps.affected.outputs.hasAffectedLibs }}
  hasAffected:
    description: 'Are there affected apps or libs?'
    value: ${{ steps.affected.outputs.hasAffected }}

runs:
  using: 'composite'
  steps:
    # node

    - name: Setup Node.js
      uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3
      with:
        node-version: ${{ inputs.node_version }}

    # pnpm

    - uses: pnpm/action-setup@v2
      with:
        run_install: false

    # Utils

    - name: Directory
      id: directory
      shell: bash
      run: |
        echo "path=$(pwd)" >> $GITHUB_OUTPUT

    - name: Node version
      id: node
      shell: bash
      run: |
        echo "version=$(node --version)" >> $GITHUB_OUTPUT

    - name: PNPM version
      id: pnpm
      shell: bash
      run: |
        echo 'cache_dir<<EOF' >> $GITHUB_OUTPUT
        pnpm store path >> $GITHUB_OUTPUT
        echo 'EOF' >> $GITHUB_OUTPUT
        echo "version=$(pnpm --version)" >> $GITHUB_OUTPUT

    - name: NX Cloud Envs
      id: nx-cloud
      shell: bash
      run: |
        echo "NX_CLOUD_ENV_NAME=node_${{ steps.node.outputs.version }}__pnpm_${{ steps.pnpm.outputs.version }}" >> $GITHUB_ENV

    - name: Create restore cache key
      id: restore_cache_key
      if: inputs.skip_node_cache == 'false'
      shell: bash
      run: |
        echo "key=os-${{ runner.os }}--node-${{ steps.node.outputs.version }}--pnpm-${{ steps.pnpm.outputs.version }}" >> $GITHUB_OUTPUT

    - name: Create cache key
      id: cache_key
      if: inputs.skip_node_cache == 'false'
      shell: bash
      run: |
        echo "key=${{ steps.restore_cache_key.outputs.key }}--package-${{ hashFiles('**/package.json') }}--lockfile-${{ hashFiles('**/pnpm-lock.yaml') }}" >> $GITHUB_OUTPUT

    - name: Nx Shas
      id: nx_shas
      if: inputs.skip_node_cache == 'false'
      uses: nrwl/nx-set-shas@v3

    # Restore Cache

    - name: Restore PNPM cache
      uses: actions/cache/restore@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
      if: inputs.skip_node_cache == 'false'
      id: pnpm-cache
      with:
        path: |
          ${{ steps.pnpm.outputs.cache_dir }}
          ${{ steps.directory.outputs.path }}/node_modules
          !${{ steps.directory.outputs.path }}/node_modules/.cache/nx
        key: |
          pnpm--${{ steps.cache_key.outputs.key }}
        restore-keys: |
          pnpm--${{ steps.restore_cache_key.outputs.key }}

    - name: Restore Cypress Cache
      uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
      id: cypress-cache
      if: inputs.browsers == 'true' && inputs.skip_node_cache == 'false'
      with:
        path: |
          ~/.cache/Cypress
        key: |
          browsers--${{ steps.cache_key.outputs.key }}
        restore-keys: |
          browsers--${{ steps.restore_cache_key.outputs.key }}

    # Install

    - name: Install Node Dependencies
      if: steps.pnpm-cache.outputs.cache-hit != 'true' && inputs.skip_node_cache == 'false'
      shell: bash
      run: |
        pnpm install --frozen-lockfile

    # Affected

    - name: Affected
      id: affected
      if: inputs.skip_node_cache == 'false'
      uses: ./.github/actions/nx-affected

    # Save Cache

    - name: Save Cypress cache
      uses: actions/cache/save@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
      if: inputs.save_cache == 'true' && steps.pnpm-cache.outputs.cache-hit != 'true' && inputs.skip_node_cache == 'false'
      with:
        path: |
          ~/.cache/Cypress
        key: |
          browsers--${{ steps.cache_key.outputs.key }}

    - name: Save PNPM cache
      uses: actions/cache/save@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
      if: inputs.save_cache == 'true' && steps.pnpm-cache.outputs.cache-hit != 'true' && inputs.skip_node_cache == 'false'
      with:
        path: |
          ${{ steps.pnpm.outputs.cache_dir }}
          ${{ steps.directory.outputs.path }}/node_modules
          !${{ steps.directory.outputs.path }}/node_modules/.cache/nx
        key: |
          pnpm--${{ steps.cache_key.outputs.key }}