diff --git a/.github/workflows/client-build.yml b/.github/workflows/client-build.yml index ffb48774a8..64634c637b 100644 --- a/.github/workflows/client-build.yml +++ b/.github/workflows/client-build.yml @@ -74,10 +74,23 @@ jobs: uses: actions/checkout@v4 with: fetch-tags: true + - name: Get changed files in the client folder + id: changed-files-specific + uses: tj-actions/changed-files@v41 + with: + files: 'app/client/**' + + - name: Run step if any file(s) in the client folder change + if: steps.changed-files-specific.outputs.any_changed == 'true' + env: + ALL_CHANGED_FILES: ${{ steps.changed-files-specific.outputs.all_changed_files }} + run: | + echo "One or more files in the server folder has changed." + echo "List all the files that have changed: $ALL_CHANGED_FILES" # get all the files changes in the cypress/e2e folder - name: Get added files in cypress/e2e folder - if: inputs.pr != 0 + if: inputs.pr != 0 && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') id: files uses: umani/changed-files@v4.1.0 with: @@ -87,7 +100,7 @@ jobs: # Check all the newly added files are in ts - name: Check the newly added files are written in ts - if: inputs.check-test-files == 'true' && inputs.pr != 0 + if: inputs.check-test-files == 'true' && inputs.pr != 0 && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') id: check_files run: | files=(${{steps.files.outputs.files_created}}) @@ -102,7 +115,7 @@ jobs: # Comment in PR if test files are not written in ts and fail the workflow - name: Comment in PR if test files are not written in ts - if: steps.check_files.outputs.non_ts_files_count != 0 && inputs.check-test-files == 'true' && inputs.pr != 0 + if: steps.check_files.outputs.non_ts_files_count != 0 && inputs.check-test-files == 'true' && inputs.pr != 0 && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') uses: peter-evans/create-or-update-comment@v3 with: issue-number: ${{ inputs.pr }} @@ -110,11 +123,11 @@ jobs: Below new test files are written in js 🔴 Expected format ts. Please fix and retrigger ok-to-test:
    ${{ steps.check_files.outputs.non_ts_files }}
- - if: steps.check_files.outputs.non_ts_files_count != 0 && inputs.check-test-files == 'true' && inputs.pr != 0 + - if: steps.check_files.outputs.non_ts_files_count != 0 && inputs.check-test-files == 'true' && inputs.pr != 0 && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') run: exit 1 - name: Get all the added or changed files in client/src folder - if: inputs.ads-compliant-check == 'true' && inputs.pr != 0 && github.pull_request.base.ref == 'release' + if: inputs.ads-compliant-check == 'true' && inputs.pr != 0 && github.pull_request.base.ref == 'release' && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') id: client_files uses: umani/changed-files@v4.1.0 with: @@ -124,7 +137,7 @@ jobs: # Check all the newly added files are in ts - name: ADS compliant check - if: inputs.ads-compliant-check == 'true' && inputs.pr != 0 && github.pull_request.base.ref == 'release' + if: inputs.ads-compliant-check == 'true' && inputs.pr != 0 && github.pull_request.base.ref == 'release' && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') id: ads_check run: | comment_files="" @@ -143,7 +156,7 @@ jobs: # Comment in PR if test files are not written in ts and fail the workflow - name: Comment in PR if test files are not written in ts - if: steps.ads_check.outputs.ads_non_compliant_count != 0 && inputs.ads-compliant-check == 'true' && inputs.pr != 0 && github.pull_request.base.ref == 'release' + if: steps.ads_check.outputs.ads_non_compliant_count != 0 && inputs.ads-compliant-check == 'true' && inputs.pr != 0 && github.pull_request.base.ref == 'release' && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') uses: peter-evans/create-or-update-comment@v3 with: issue-number: ${{ inputs.pr }} @@ -156,6 +169,7 @@ jobs: # Create a run record exactly at the time of merge to release to # ensure we compare run details with code at this point - name: Create Perf Meta + if: steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' continue-on-error: true run: | PGPASSWORD='${{secrets.APPSMITH_PERFORMANCE_DB_PASSWORD}}' psql -h '${{secrets.APPSMITH_PERFORMANCE_DB_HOST}}' \ @@ -165,6 +179,7 @@ jobs: # In case this is second attempt try restoring status of the prior attempt from cache - name: Restore the previous run result + if: steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' uses: actions/cache@v3 with: path: | @@ -173,15 +188,16 @@ jobs: # Fetch prior run result - name: Get the previous run result + if: steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' id: run_result run: cat ~/run_result 2>/dev/null || echo 'default' # In case of prior failure run the job - - if: steps.run_result.outputs.run_result != 'success' + - if: steps.run_result.outputs.run_result != 'success' && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') run: echo "I'm alive!" && exit 0 - name: Use Node.js - if: steps.run_result.outputs.run_result != 'success' + if: steps.run_result.outputs.run_result != 'success' && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') uses: actions/setup-node@v3 with: node-version-file: app/client/package.json @@ -190,7 +206,7 @@ jobs: # when the project lives in a subdirectory: https://github.com/actions/setup-node/issues/488 # Restoring the cache manually instead - name: Restore Yarn cache - if: steps.run_result.outputs.run_result != 'success' + if: steps.run_result.outputs.run_result != 'success' && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') uses: actions/cache@v3 id: cache-dependencies with: @@ -199,18 +215,18 @@ jobs: # Install all the dependencies - name: Install dependencies - if: steps.run_result.outputs.run_result != 'success' + if: steps.run_result.outputs.run_result != 'success' && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') run: | npm install -g yarn yarn install --immutable # Type checking before starting the build - name: Run type check - if: steps.run_result.outputs.run_result != 'success' + if: steps.run_result.outputs.run_result != 'success' && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') run: yarn run check-types - name: Set the build environment based on the branch - if: steps.run_result.outputs.run_result != 'success' + if: steps.run_result.outputs.run_result != 'success' && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') id: vars run: | set +o pipefail @@ -232,6 +248,7 @@ jobs: # We burn React environment & the Segment analytics key into the build itself. # This is to ensure that we don't need to configure it in each installation - name: Create the bundle + if: steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' run: | if [[ "${{ github.ref }}" == "refs/heads/master" ]]; then export REACT_APP_SEGMENT_CE_KEY="${{ secrets.APPSMITH_SEGMENT_CE_KEY }}" @@ -249,13 +266,14 @@ jobs: # Saving the cache to use it in subsequent runs - name: Save Yarn cache uses: actions/cache/save@v3 - if: steps.cache-dependencies.outputs.cache-hit != 'true' + if: steps.cache-dependencies.outputs.cache-hit != 'true' && (steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule') with: path: app/client/.yarn/cache key: v1-yarn3-${{ hashFiles('app/client/yarn.lock') }} # Restore the previous built bundle if present. If not push the newly built into the cache - name: Restore the previous bundle + if: steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' uses: actions/cache@v3 with: path: | @@ -263,9 +281,31 @@ jobs: key: ${{ github.run_id }}-${{ github.job }}-client - name: Pack the client build directory + if: steps.changed-files-specific.outputs.any_changed == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' run: | tar -cvf ./build.tar -C build . + - name: Fetch client build from cache + if: steps.changed-files-specific.outputs.any_changed == 'false' && success() && github.event_name != 'push' && github.event_name != 'workflow_dispatch' && github.event_name != 'schedule' + env: + cachetoken: ${{ secrets.CACHETOKEN }} + reponame: ${{ github.event.repository.name }} + gituser: ${{ secrets.CACHE_GIT_USER }} + gituseremail: ${{ secrets.CACHE_GIT_EMAIL }} + run: | + mkdir cacherepo + cd ./cacherepo + git lfs install + git config --global user.email "$gituseremail" + git config --global user.name "$gituser" + git clone https://$cachetoken@github.com/appsmithorg/cibuildcache.git + git lfs install + if [ "$reponame" = "appsmith" ]; then export repodir="CE"; fi + if [ "$reponame" = "appsmith-ee" ]; then export repodir="EE"; fi + cd cibuildcache/$repodir/release/client + git lfs pull ./build.tar + mv ./build.tar ../../../../../build.tar + # Upload the build artifact so that it can be used by the test & deploy job in the workflow - name: Upload react build bundle uses: actions/upload-artifact@v3