From 518baac140279e0f8108c11b48f6fb3b3af2b603 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Tue, 19 May 2026 22:32:04 +0200 Subject: [PATCH 1/3] ci: compile on CI after merge to reduce conflicts and total CI time One of the biggest CI problems we currently face are conflicts, not within source code but in compiled assets. So if you have 2 PRs targeting e.g. files then the assets will likely conflict even if the source can be merged without problems. This causes unnecessary CI time and developer frustration. Another really bad example: Dependency updates. So this solution is the currently lived soltion of the `text` app: 1. we add a CI check to forbid checking in compiled assets 2. we adjust the node workflow to no longer check for asset changes 3. we add a CI workflow to compile after merges. For the corner case where a new PR is merged before the compilation has finished this will abort the first compile and start a new one for the current HEAD. So this also reduces the repository size in cases of many quick merged like during dependabot updates. Signed-off-by: Ferdinand Thiessen --- .github/workflows/node-dist-unchanged.yml | 29 ++++++++ .github/workflows/npm-build.yml | 30 ++++---- .github/workflows/update-node-dist.yml | 84 +++++++++++++++++++++++ 3 files changed, 127 insertions(+), 16 deletions(-) create mode 100644 .github/workflows/node-dist-unchanged.yml create mode 100644 .github/workflows/update-node-dist.yml diff --git a/.github/workflows/node-dist-unchanged.yml b/.github/workflows/node-dist-unchanged.yml new file mode 100644 index 0000000000000..aa575121761ce --- /dev/null +++ b/.github/workflows/node-dist-unchanged.yml @@ -0,0 +1,29 @@ +# SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors +# SPDX-License-Identifier: AGPL-3.0-or-later + +name: Check node dist files + +on: + pull_request: + + +jobs: + changed_files: + runs-on: ubuntu-latest-low + name: Check node dist files + permissions: + pull-requests: read + + steps: + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@dcc7a0cba800f454d79fff4b993e8c3555bcc0a8 # v45.0.7 + with: + files: dist/** + + - name: Run step if any file(s) in the dist folder change + if: steps.changed-files.outputs.any_changed == 'true' + run: | + echo "One or more files in the dist folder has changed. Do NOT commit files in there as they will be generated automatically once a pull request is merged" + echo "List all the files that have changed: ${{ steps.changed-files.outputs.all_changed_files }}" + exit 1 diff --git a/.github/workflows/npm-build.yml b/.github/workflows/npm-build.yml index 571057f49837e..1cd1e12df5a91 100644 --- a/.github/workflows/npm-build.yml +++ b/.github/workflows/npm-build.yml @@ -35,17 +35,14 @@ jobs: filters: | src: - '.github/workflows/**' - - '**/src/**' - - '**/appinfo/info.xml' - - 'core/css/*' - - 'core/img/**' + - 'src/**' + - 'appinfo/info.xml' - 'package.json' - - '**/package-lock.json' + - 'package-lock.json' - 'tsconfig.json' - '**.js' - '**.ts' - '**.vue' - - 'version.php' build: runs-on: ubuntu-latest @@ -89,16 +86,17 @@ jobs: npm ci npm run build --if-present - - name: Check build changes - run: | - bash -c "[[ ! \"`git status --porcelain `\" ]] || (echo 'Please recompile and commit the assets, see the section \"Show changes on failure\" for details' && exit 1)" - - - name: Show changes on failure - if: failure() - run: | - git status - git --no-pager diff - exit 1 # make it red to grab attention + # Not used as we compile on CI, see update-node-dist.yml and node-dist-unchanged.yml + # - name: Check build changes + # run: | + # bash -c "[[ ! \"`git status --porcelain `\" ]] || (echo 'Please recompile and commit the assets, see the section \"Show changes on failure\" for details' && exit 1)" + + # - name: Show changes on failure + # if: failure() + # run: | + # git status + # git --no-pager diff + # exit 1 # make it red to grab attention summary: permissions: diff --git a/.github/workflows/update-node-dist.yml b/.github/workflows/update-node-dist.yml new file mode 100644 index 0000000000000..469dfd29b2a8c --- /dev/null +++ b/.github/workflows/update-node-dist.yml @@ -0,0 +1,84 @@ +# SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors +# SPDX-License-Identifier: AGPL-3.0-or-later + +name: Update Node dist + +on: + workflow_dispatch: + push: + branches: + # implemented since 35, once branched off, add your stable branch here + - master + +permissions: + contents: write + +concurrency: + group: update-node-dist-${{ github.head_ref || github.ref || github.run_id }} + +jobs: + update-node-dist: + runs-on: ubuntu-latest-assets + environment: update-node-dist + + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + # Needed to allow force push later + persist-credentials: true + token: ${{ secrets.BOT_GITHUB_TOKEN }} + + - name: Read package.json node and npm engines version + uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.1 + id: versions + with: + fallbackNode: '^20' + fallbackNpm: '^9' + + - name: Set up node ${{ steps.versions.outputs.nodeVersion }} + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 + with: + node-version: ${{ steps.versions.outputs.nodeVersion }} + + - name: Set up npm ${{ steps.versions.outputs.npmVersion }} + run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}" + + - name: Setup git + run: | + git config --local user.email "nextcloud-command@users.noreply.github.com" + git config --local user.name "nextcloud-command" + + - name: Get last commit message if it was not a recompile + id: last_commit + run: | + { + echo 'MESSAGE<> $GITHUB_OUTPUT + + - name: Install dependencies & build + if: steps.last_commit.outputs.MESSAGE != '' + env: + CYPRESS_INSTALL_BINARY: 0 + run: | + npm ci + npm run build --if-present + + - name: Check webpack build changes + id: changes + continue-on-error: true + run: | + { + echo 'CHANGED<> "$GITHUB_OUTPUT" + + - name: Add and commit + if: steps.changes.outputs.CHANGED != '' + run: | + git add --force dist/ core/css/ + git commit --signoff -m 'chore(assets): recompile assets' + git push origin ${{ github.head_ref }} From 22c8a463e46597dc114617987fc64a1aadac7e3a Mon Sep 17 00:00:00 2001 From: Louis Date: Tue, 15 Sep 2026 11:03:32 +0200 Subject: [PATCH 2/3] feat(ci): Add stable35 branch to update-node-dist Signed-off-by: Louis --- .github/workflows/update-node-dist.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/update-node-dist.yml b/.github/workflows/update-node-dist.yml index 469dfd29b2a8c..db1dce65539a8 100644 --- a/.github/workflows/update-node-dist.yml +++ b/.github/workflows/update-node-dist.yml @@ -9,6 +9,7 @@ on: branches: # implemented since 35, once branched off, add your stable branch here - master + - stable35 permissions: contents: write From 19745156c8f5cb3f2cc88b176d16ca98f26150fd Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Wed, 16 Sep 2026 20:58:32 +0200 Subject: [PATCH 3/3] chore: add workflow patch Signed-off-by: Ferdinand Thiessen --- .github/workflows/npm-build.yml.patch | 53 +++++++++++++++++++++++++++ REUSE.toml | 8 ++-- 2 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/npm-build.yml.patch diff --git a/.github/workflows/npm-build.yml.patch b/.github/workflows/npm-build.yml.patch new file mode 100644 index 0000000000000..eb9ab3eab38da --- /dev/null +++ b/.github/workflows/npm-build.yml.patch @@ -0,0 +1,53 @@ +diff --git a/.github/workflows/npm-build.yml b/.github/workflows/npm-build.yml +index 571057f4983..1cd1e12df5a 100644 +--- a/.github/workflows/npm-build.yml ++++ b/.github/workflows/npm-build.yml +@@ -35,17 +35,14 @@ jobs: + filters: | + src: + - '.github/workflows/**' +- - '**/src/**' +- - '**/appinfo/info.xml' +- - 'core/css/*' +- - 'core/img/**' ++ - 'src/**' ++ - 'appinfo/info.xml' + - 'package.json' +- - '**/package-lock.json' ++ - 'package-lock.json' + - 'tsconfig.json' + - '**.js' + - '**.ts' + - '**.vue' +- - 'version.php' + + build: + runs-on: ubuntu-latest +@@ -89,16 +86,17 @@ jobs: + npm ci + npm run build --if-present + +- - name: Check build changes +- run: | +- bash -c "[[ ! \"`git status --porcelain `\" ]] || (echo 'Please recompile and commit the assets, see the section \"Show changes on failure\" for details' && exit 1)" +- +- - name: Show changes on failure +- if: failure() +- run: | +- git status +- git --no-pager diff +- exit 1 # make it red to grab attention ++ # Not used as we compile on CI, see update-node-dist.yml and node-dist-unchanged.yml ++ # - name: Check build changes ++ # run: | ++ # bash -c "[[ ! \"`git status --porcelain `\" ]] || (echo 'Please recompile and commit the assets, see the section \"Show changes on failure\" for details' && exit 1)" ++ ++ # - name: Show changes on failure ++ # if: failure() ++ # run: | ++ # git status ++ # git --no-pager diff ++ # exit 1 # make it red to grab attention + + summary: + permissions: diff --git a/REUSE.toml b/REUSE.toml index 2904855498246..92a73780e4fd5 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -52,13 +52,13 @@ SPDX-FileCopyrightText = "2013 ownCloud, Inc., 2016 Nextcloud GmbH and Nextcloud SPDX-License-Identifier = "AGPL-3.0-only" [[annotations]] -path = ".jshintrc" +path = ".github/workflows/*.patch" precedence = "aggregate" -SPDX-FileCopyrightText = "2014 ownCloud, Inc., 2017 Nextcloud GmbH and Nextcloud contributors" -SPDX-License-Identifier = "AGPL-3.0-only" +SPDX-FileCopyrightText = "2026 Nextcloud GmbH and Nextcloud contributors" +SPDX-License-Identifier = "AGPL-3.0-or-later" [[annotations]] -path = ".mailmap" +path = [".mailmap", ".jshintrc"] precedence = "aggregate" SPDX-FileCopyrightText = "2015-2016 ownCloud, Inc., 2016-2021 Nextcloud GmbH and Nextcloud contributors" SPDX-License-Identifier = "AGPL-3.0-only"