From 059e8561fa5bb7a81ac48a2a9b7a1e27724047d0 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Mon, 16 Feb 2026 23:49:49 +0100 Subject: [PATCH 01/27] Removing directory with GH action --- ci-repository-reserve-instance-url/Dockerfile | 11 -- ci-repository-reserve-instance-url/README.md | 171 ------------------ .../action.yaml | 28 --- .../entrypoint.sh | 74 -------- 4 files changed, 284 deletions(-) delete mode 100644 ci-repository-reserve-instance-url/Dockerfile delete mode 100644 ci-repository-reserve-instance-url/README.md delete mode 100644 ci-repository-reserve-instance-url/action.yaml delete mode 100755 ci-repository-reserve-instance-url/entrypoint.sh diff --git a/ci-repository-reserve-instance-url/Dockerfile b/ci-repository-reserve-instance-url/Dockerfile deleted file mode 100644 index 25f0701..0000000 --- a/ci-repository-reserve-instance-url/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -# Container image that runs your code -FROM alpine:3.15 -MAINTAINER Darek - -RUN apk add --update --no-cache curl jq - -# Copies your code file from your action repository to the filesystem path `/` of the container -COPY entrypoint.sh /entrypoint.sh - -# Code file to execute when the docker container starts up (`entrypoint.sh`) -ENTRYPOINT ["/entrypoint.sh"] diff --git a/ci-repository-reserve-instance-url/README.md b/ci-repository-reserve-instance-url/README.md deleted file mode 100644 index d965a64..0000000 --- a/ci-repository-reserve-instance-url/README.md +++ /dev/null @@ -1,171 +0,0 @@ -# ci-repository-reserve-instance-url - -This repository provides a custom GitHub Action for reserving CI instances, getting authorization tokens from the instances and releasing them. These instances are important for deploying applications and running tests in isolated and consistent environments, which helps avoid conflicts and ensures reliable test results. - -## Why Reserve an Instance? - -Each developer working on a branch triggers tests, and the tests need to run somewhere on platformOS. We need to **reserve an instance** on which the application will be deployed and then the test will be run against it. This avoids conflicts that might arise from running multiple tests simultaneously on the same instance. It also ensures consistency across test runs, making it easier to identify issues. - -GH Actions need to be authorized to access the instance. This is done by getting an authorization token from the instance. The token is used to authenticate the GH Actions requests to the instance. - -The reserved instance needs to be **released** after the tests are complete. This is an important step to ensure that the instance is available for future tests. PlatformOS' internal solution involves a pool of 6 instances (ci.1, ci.2, ci.3, ci.4, ci.5, ci.6) shared across projects. - -The process works as follows: - -- The first available instance that is not currently used by any other GitHub Action is taken and removed from the pool. -- This prevents multiple projects from running their tests in parallel on the same instance, which would cause conflicts. -- The instance is reserved for the duration of the tests, regardless of whether the tests fail or succeed. -- GH Actions are authorized to access the instance by getting an authorization token from the instance. -- Once the tests are done, the instance is given back to the pool. -- Without this reserve and release mechanism, we would quickly run out of available instances, preventing new tests from running. - -### Custom Action Details - -The custom action `Platform-OS/ci-repository-reserve-instance-url@0.1.2` handles reserving and releasing instances, and getting authorization tokens from them. It operates based on the method provided (`reserve`, `get-token` or `release`). The action communicates with the CI repository to manage instance reservations. - -## Replace old worfklow code like - -Replace your existing code for releasing an instance: - -### beginning - -```yaml - - name: Get ci-instance-url - shell: sh - run: | - export MPKIT_URL=https://$(./scripts/ci/repository reserve) - export REPORT_PATH=$(echo $MPKIT_URL | cut -d'/' -f3)/$(date +'%Y-%m-%d-%H-%M-%S') - echo "MPKIT_URL=$MPKIT_URL" >> $GITHUB_ENV - echo "REPORT_PATH=$REPORT_PATH" >> $GITHUB_ENV -``` - -### closing - -```yaml - - name: Release instance - if: ${{ always() }} - shell: sh - run: | - ./scripts/ci/repository release -``` - -## With the following - -Use the following code to reserve an instance: - -### beginning - -```yaml - reserve-ci-instance: - runs-on: ubuntu-latest - container: alpine:3.15 - outputs: - mpkit-url: ${{ steps.reserve.outputs.mpkit-url }} - report-path: ${{ steps.reserve.outputs.report-path }} - steps: - - name: reserve ci-instance-url - id: reserve - uses: Platform-OS/ci-repository-reserve-instance-url@0.1.2 - with: - repository-url: https://ci-repository.staging.oregon.platform-os.com - method: reserve - pos-ci-repo-token: ${{ secrets.POS_CI_REPO_ACCESS_TOKEN }} -``` - -### authorization - -```yaml - steps: - - name: Get MPKIT token - id: get-token - uses: Platform-OS/ci-repository-reserve-instance-url@0.1.2 - with: - method: get-token - repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} - pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} - - - name: Deploy - shell: sh - env: - MPKIT_TOKEN: ${{ steps.get-token.outputs.mpkit-token }} -``` - -### closing - -```yaml - cleanup: - if: ${{ always() }} - needs: ["reserve-ci-instance","deploy","tests"] - runs-on: ubuntu-latest - container: alpine:3.15 - steps: - - name: release ci-instance-url back to the instance-pool - uses: Platform-OS/ci-repository-reserve-instance-url@0.1.2 - with: - method: release - repository-url: https://ci-repository.staging.oregon.platform-os.com - pos-ci-repo-token: ${{ secrets.POS_CI_REPO_ACCESS_TOKEN }} -``` - -## Update Your Jobs - -Also update your jobs code with the following: - -```yaml -deploy: - needs: ["reserve-ci-instance"] - env: - MPKIT_URL: ${{ needs.reserve-ci-instance.outputs.mpkit-url }} - [...] - -tests: - needs: ["reserve-ci-instance", "deploy"] - env: - MPKIT_URL: ${{ needs.reserve-ci-instance.outputs.mpkit-url }} - REPORT_PATH: ${{ needs.reserve-ci-instance.outputs.report-path }} - [...] -``` - -## Troubleshooting - -### Using `act` for Testing - -You can use the `act` tool for local testing of GitHub Actions: - -- [act](https://github.com/nektos/act) - -Usage: - -```sh -act pull_request --secret-file .secrets --pull=false - -act pull_request --secret-file .secrets -``` - -## Script Details - -The action's entry point script (`entrypoint.sh`) handles the logic for reserving, extracting and masking tokens and releasing instances. The script processes the method argument to perform the appropriate action (reserve or release). - -- **Script Entry Point**: `entrypoint.sh` is designed for use in Docker. -- **Method Argument**: The first argument provided to the script determines the method. - -### Key Actions: -1. **Release**: Triggers a delete request when the method is `release`. - -2. **Get Token**: Sends a post request and logs the token in a masked form when the method is `get-token`. - -3. **Reserve**: Sends a post request and logs it when the method is `reserve`. - -Additional Responsibilities: - -- **Instance Setup and Report Path Preparation**: The script sets up the instance and prepares the report path. -- **Persistent Log Access**: It ensures that you can access previous test logs even after running new tests. This is important for accessing test results at a later time (e.g., triggering a test on Friday and accessing the results on Monday). -- **Instance URL**: The script logs the instance URL for reference. -- **Authorization Token**: It logs the authorization token in a masked form. -- **Timestamped Report Path**: To keep logs organized and unique, it creates a report path with the current timestamp. - -For more details, check the [entrypoint.sh script](https://github.com/Platform-OS/ci-repository-reserve-instance-url/blob/main/entrypoint.sh). - -### Instance Naming Conventions - -The custom action still uses some legacy naming conventions like `mpkit-url`. This refers to the instance URL. For clarity, consider this as the instance URL. diff --git a/ci-repository-reserve-instance-url/action.yaml b/ci-repository-reserve-instance-url/action.yaml deleted file mode 100644 index 63d9402..0000000 --- a/ci-repository-reserve-instance-url/action.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# action.yml -name: 'Get POS CI Instance URL' -description: 'populate env with ci-instance-url and report-url variables' -inputs: - method: # id of input - description: 'method to execute. either reserve or release' - required: true - default: 'reserve' - repository-url: # id of input - description: 'url of the instance repository' - required: true - pos-ci-repo-token: # id of input - description: 'pos cli ci repo access token' - required: true -outputs: - mpkit-token: - description: 'mpkit token' - mpkit-url: # id of output - description: 'reserved instance url' - report-path: - description: 'report-path' -runs: - using: 'docker' - image: 'Dockerfile' - args: - - ${{ inputs.method }} - - ${{ inputs.repository-url }} - - ${{ inputs.pos-ci-repo-token }} diff --git a/ci-repository-reserve-instance-url/entrypoint.sh b/ci-repository-reserve-instance-url/entrypoint.sh deleted file mode 100755 index 5a9fbd8..0000000 --- a/ci-repository-reserve-instance-url/entrypoint.sh +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/sh -l - -set -eu - -METHOD=$1 -CI_REPO_URL=${2}/api/instances -POS_CI_REPO_ACCESS_TOKEN=$3 - -GITHUB_REPOSITORY=${GITHUB_REPOSITORY:-octocat/Hello-World} -GITHUB_RUN_ID=${GITHUB_RUN_ID:-run-888} - -CLIENT=${GITHUB_REPOSITORY}--${GITHUB_RUN_ID}--${GITHUB_RUN_NUMBER:-0} -CLIENT=${CLIENT/\//--} - -request() { - curl -s -X$1 \ - -H "Authorization: Bearer $POS_CI_REPO_ACCESS_TOKEN" \ - -H 'Content-type: application/json' \ - -d "{\"client\":\"$CLIENT\"}" \ - --fail-with-body \ - ${CI_REPO_URL}/${2:-} -} - -case $METHOD in - - release) - echo releasing instance - request DELETE release - ;; - - get-token) - set +e - request POST get-token > .log - RESCODE=$? - set -e - if [ $RESCODE != 0 ]; then - echo "get-token request failed. [${RESCODE}]" - cat .log - exit 2137 - else - MPKIT_TOKEN=$(cat .log) - fi - - echo "::add-mask::$MPKIT_TOKEN" - echo "mpkit-token=$MPKIT_TOKEN" >> $GITHUB_OUTPUT - ;; - - reserve) - set +e - request POST reserve > .log - RESCODE=$? - set -e - if [ $RESCODE != 0 ]; then - echo "Reserve request failed. [${RESCODE}]" - cat .log - exit 2137 - else - INSTANCE_DOMAIN=$(cat .log) - fi - - echo "mpkit-url=https://$INSTANCE_DOMAIN" >> $GITHUB_OUTPUT - echo "report-path=${INSTANCE_DOMAIN}/$(date +'%Y-%m-%d-%H-%M-%S')" >> $GITHUB_OUTPUT - ;; - - test) - request POST test - ;; - - all) - request POST - ;; - *) - echo $METHOD command not found: Usage: ./scripts/ci/repository all | reserve | release -esac From 06e4e38b89575c033881265556eb85fae937e575 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Tue, 17 Feb 2026 01:46:58 +0100 Subject: [PATCH 02/27] Add a test workflow - initial commit. --- .github/workflows/test.yml | 314 +++++++++++++++++++++++++++++++++++++ 1 file changed, 314 insertions(+) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..21e488b --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,314 @@ +name: Module tests +on: + pull_request: + branches: [ master ] + paths-ignore: + - "**/README.md" + push: + paths-ignore: + - "**/README.md" + workflow_dispatch: + +jobs: + pre_job: + runs-on: ubuntu-latest + outputs: + should_skip: ${{ steps.skip_check.outputs.should_skip }} + steps: + - id: skip_check + uses: fkirc/skip-duplicate-actions@master + with: + github_token: ${{ github.token }} + paths_ignore: '["**/README.md"]' + do_not_skip: '["push"]' + + detect-changes: + needs: pre_job + if: ${{ needs.pre_job.outputs.should_skip != 'true' }} + runs-on: ubuntu-latest + outputs: + payments: ${{ steps.filter.outputs.payments }} + user: ${{ steps.filter.outputs.user }} + chat: ${{ steps.filter.outputs.chat }} + common-styling: ${{ steps.filter.outputs.common-styling }} + tests: ${{ steps.filter.outputs.tests }} + core: ${{ steps.filter.outputs.core }} + oauth-facebook: ${{ steps.filter.outputs.oauth-facebook }} + oauth-github: ${{ steps.filter.outputs.oauth-github }} + oauth-google: ${{ steps.filter.outputs.oauth-google }} + openai: ${{ steps.filter.outputs.openai }} + reports: ${{ steps.filter.outputs.reports }} + data-export-api: ${{ steps.filter.outputs.data-export-api }} + payments-stripe: ${{ steps.filter.outputs.payments-stripe }} + payments-example-gateway: ${{ steps.filter.outputs.payments-example-gateway }} + steps: + - uses: actions/checkout@v4 + + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + payments: + - 'pos-module-payments/**' + user: + - 'pos-module-user/**' + chat: + - 'pos-module-chat/**' + common-styling: + - 'pos-module-common-styling/**' + tests: + - 'pos-module-tests/**' + core: + - 'pos-module-core/**' + oauth-facebook: + - 'pos-module-oauth-facebook/**' + oauth-github: + - 'pos-module-oauth-github/**' + oauth-google: + - 'pos-module-oauth-google/**' + openai: + - 'pos-module-openai/**' + reports: + - 'pos-module-reports/**' + data-export-api: + - 'pos-module-data-export-api/**' + payments-stripe: + - 'pos-module-payments-stripe/**' + payments-example-gateway: + - 'pos-module-payments-example-gateway/**' + + test-platformos: + needs: detect-changes + if: | + needs.detect-changes.outputs.payments == 'true' || + needs.detect-changes.outputs.user == 'true' + runs-on: ubuntu-latest + container: platformos/pos-cli:latest + strategy: + matrix: + include: + - module: payments + path: pos-module-payments + - module: user + path: pos-module-user + fail-fast: false + timeout-minutes: 20 + env: + CI: true + MPKIT_EMAIL: ${{ secrets.MPKIT_EMAIL }} + steps: + - name: Check if this module changed + id: changed + run: | + MODULE_CHANGED="${{ needs.detect-changes.outputs[matrix.module] }}" + if [ "$MODULE_CHANGED" != "true" ]; then + echo "skip=true" >> $GITHUB_OUTPUT + else + echo "skip=false" >> $GITHUB_OUTPUT + fi + + - name: Reserve CI instance + if: steps.changed.outputs.skip != 'true' + id: reserve + uses: Platform-OS/ci-repository-reserve-instance-url@0.0.9 + with: + repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} + method: reserve + pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} + + - name: Get MPKIT token + if: steps.changed.outputs.skip != 'true' + id: get-token + uses: Platform-OS/ci-repository-reserve-instance-url@mask-token + with: + method: get-token + repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} + pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} + + - uses: actions/checkout@v4 + if: steps.changed.outputs.skip != 'true' + + - name: Deploy module + if: steps.changed.outputs.skip != 'true' + timeout-minutes: 10 + env: + MPKIT_URL: ${{ steps.reserve.outputs.mpkit-url }} + MPKIT_TOKEN: ${{ steps.get-token.outputs.mpkit-token }} + working-directory: ${{ matrix.path }} + run: | + pos-cli deploy + + - name: Run platformOS tests + if: steps.changed.outputs.skip != 'true' + timeout-minutes: 10 + env: + MPKIT_URL: ${{ steps.reserve.outputs.mpkit-url }} + MPKIT_TOKEN: ${{ steps.get-token.outputs.mpkit-token }} + working-directory: ${{ matrix.path }} + run: | + pos-cli test run + + - name: Release CI instance + if: always() && steps.changed.outputs.skip != 'true' + uses: Platform-OS/ci-repository-reserve-instance-url@0.0.9 + with: + method: release + repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} + pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} + + test-playwright: + needs: detect-changes + if: | + needs.detect-changes.outputs.user == 'true' || + needs.detect-changes.outputs.chat == 'true' || + needs.detect-changes.outputs.common-styling == 'true' + runs-on: ubuntu-latest + container: platformos/playwright:5.4.0-1.52 + strategy: + matrix: + include: + - module: user + path: pos-module-user + deploy-script: | + rm app/pos-modules.* || true + sh ./tests/data/seed/seed.sh + test-commands: | + npm run admin-panel-pw-tests + npm run pw-tests + - module: chat + path: pos-module-chat + deploy-script: | + rm app/pos-modules.* || true + sh ./tests/data/seed/seed.sh + test-commands: npm run pw-tests + - module: common-styling + path: pos-module-common-styling + deploy-script: | + pos-cli data clean --include-schema --auto-confirm + pos-cli deploy + test-commands: npm run pw-tests + fail-fast: false + timeout-minutes: 35 + env: + CI: true + MPKIT_EMAIL: ${{ secrets.MPKIT_EMAIL }} + E2E_TEST_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }} + HTML_ATTACHMENTS_BASE_URL: ${{ vars.HTML_ATTACHMENTS_BASE_URL }} + TEST_REPORT_MPKIT_URL: ${{ vars.TEST_REPORT_MPKIT_URL }} + TEST_REPORT_MPKIT_TOKEN: ${{ secrets.TEST_REPORT_MPKIT_TOKEN }} + HOME: /root + steps: + - name: Check if this module changed + id: changed + run: | + MODULE_CHANGED="${{ needs.detect-changes.outputs[matrix.module] }}" + if [ "$MODULE_CHANGED" != "true" ]; then + echo "skip=true" >> $GITHUB_OUTPUT + else + echo "skip=false" >> $GITHUB_OUTPUT + fi + + - name: Reserve CI instance + if: steps.changed.outputs.skip != 'true' + id: reserve + uses: Platform-OS/ci-repository-reserve-instance-url@0.0.9 + with: + repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} + method: reserve + pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} + + - name: Get MPKIT token + if: steps.changed.outputs.skip != 'true' + id: get-token + uses: Platform-OS/ci-repository-reserve-instance-url@mask-token + with: + method: get-token + repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} + pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} + + - uses: actions/checkout@v4 + if: steps.changed.outputs.skip != 'true' + + - uses: actions/setup-node@v4 + if: steps.changed.outputs.skip != 'true' + with: + node-version: 20.x + + - name: Deploy module + if: steps.changed.outputs.skip != 'true' + timeout-minutes: 10 + shell: sh + env: + MPKIT_URL: ${{ steps.reserve.outputs.mpkit-url }} + MPKIT_TOKEN: ${{ steps.get-token.outputs.mpkit-token }} + working-directory: ${{ matrix.path }} + run: | + set -eu + ${{ matrix.deploy-script }} + + - name: Install test dependencies + if: steps.changed.outputs.skip != 'true' + shell: sh + working-directory: ${{ matrix.path }} + run: | + set -eu + npm install + + - name: Run Playwright tests + if: steps.changed.outputs.skip != 'true' + shell: sh + working-directory: ${{ matrix.path }} + env: + MPKIT_URL: ${{ steps.reserve.outputs.mpkit-url }} + run: | + set -eu + ${{ matrix.test-commands }} + + - name: Release CI instance + if: always() && steps.changed.outputs.skip != 'true' + uses: Platform-OS/ci-repository-reserve-instance-url@0.0.9 + with: + method: release + repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} + pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} + + lint-platformos-check: + needs: detect-changes + runs-on: ubuntu-latest + strategy: + matrix: + module: + - payments + - user + - chat + - common-styling + - tests + - core + - oauth-facebook + - oauth-github + - oauth-google + - openai + - reports + - data-export-api + - payments-stripe + - payments-example-gateway + fail-fast: false + steps: + - name: Check if this module changed + id: changed + run: | + MODULE_CHANGED="${{ needs.detect-changes.outputs[matrix.module] }}" + if [ "$MODULE_CHANGED" != "true" ]; then + echo "skip=true" >> $GITHUB_OUTPUT + else + echo "skip=false" >> $GITHUB_OUTPUT + fi + + - uses: actions/checkout@v4 + if: steps.changed.outputs.skip != 'true' + + - name: Run platformOS-check + if: steps.changed.outputs.skip != 'true' + uses: Platform-OS/platformos-check-action@v1 + with: + path: pos-module-${{ matrix.module }} From b0d2f604d034559c18c456d5d961721958f51bc7 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Tue, 17 Feb 2026 18:12:17 +0100 Subject: [PATCH 03/27] add module testing and linting workflows Implement GitHub Actions workflows for automated testing and linting: - test.yml: Runs platformOS and Playwright tests with isolated CI instances - lint.yml: Runs platformos-check linter across all modules Uses matrix strategies with path-based change detection to test only modified modules in parallel. Each module gets its own CI instance for complete isolation. --- .github/workflows/lint.yml | 189 +++++++++++++++++++++++++++++++++++++ .github/workflows/test.yml | 41 -------- 2 files changed, 189 insertions(+), 41 deletions(-) create mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..fa50481 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,189 @@ +name: Lint modules + +on: + pull_request: + branches: [ master ] + paths-ignore: + - "**/README.md" + push: + paths-ignore: + - "**/README.md" + workflow_dispatch: + +jobs: + pre_job: + runs-on: ubuntu-latest + outputs: + should_skip: ${{ steps.skip_check.outputs.should_skip }} + steps: + - id: skip_check + uses: fkirc/skip-duplicate-actions@master + with: + github_token: ${{ github.token }} + paths_ignore: '["**/README.md"]' + do_not_skip: '["push"]' + + detect-changes: + needs: pre_job + if: ${{ needs.pre_job.outputs.should_skip != 'true' }} + runs-on: ubuntu-latest + outputs: + payments: ${{ steps.filter.outputs.payments }} + user: ${{ steps.filter.outputs.user }} + chat: ${{ steps.filter.outputs.chat }} + common-styling: ${{ steps.filter.outputs.common-styling }} + tests: ${{ steps.filter.outputs.tests }} + core: ${{ steps.filter.outputs.core }} + oauth-facebook: ${{ steps.filter.outputs.oauth-facebook }} + oauth-github: ${{ steps.filter.outputs.oauth-github }} + oauth-google: ${{ steps.filter.outputs.oauth-google }} + openai: ${{ steps.filter.outputs.openai }} + reports: ${{ steps.filter.outputs.reports }} + data-export-api: ${{ steps.filter.outputs.data-export-api }} + payments-stripe: ${{ steps.filter.outputs.payments-stripe }} + payments-example-gateway: ${{ steps.filter.outputs.payments-example-gateway }} + steps: + - uses: actions/checkout@v4 + + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + payments: + - 'pos-module-payments/**' + user: + - 'pos-module-user/**' + chat: + - 'pos-module-chat/**' + common-styling: + - 'pos-module-common-styling/**' + tests: + - 'pos-module-tests/**' + core: + - 'pos-module-core/**' + oauth-facebook: + - 'pos-module-oauth-facebook/**' + oauth-github: + - 'pos-module-oauth-github/**' + oauth-google: + - 'pos-module-oauth-google/**' + openai: + - 'pos-module-openai/**' + reports: + - 'pos-module-reports/**' + data-export-api: + - 'pos-module-data-export-api/**' + payments-stripe: + - 'pos-module-payments-stripe/**' + payments-example-gateway: + - 'pos-module-payments-example-gateway/**' + + lint-platformos-check: + needs: detect-changes + runs-on: ubuntu-latest + strategy: + matrix: + module: + - payments + - user + - chat + - common-styling + - tests + - core + - oauth-facebook + - oauth-github + - oauth-google + - openai + - reports + - data-export-api + - payments-stripe + - payments-example-gateway + fail-fast: false + env: + CI: true + PLATFORMOS_CHECK_DEBUG: true + DOCKER_WORKSPACE: ${{ github.workspace }}/pos-module-${{ matrix.module }} + LOGS_DIR: ${{ github.workspace }}/pos-module-${{ matrix.module }}/logs + steps: + - name: Check if this module changed + id: changed + run: | + MODULE_CHANGED="${{ needs.detect-changes.outputs[matrix.module] }}" + if [ "$MODULE_CHANGED" != "true" ]; then + echo "skip=true" >> $GITHUB_OUTPUT + else + echo "skip=false" >> $GITHUB_OUTPUT + fi + + - name: Checkout code + if: steps.changed.outputs.skip != 'true' + uses: actions/checkout@v4 + + - name: Set up logs directory + if: steps.changed.outputs.skip != 'true' + run: | + mkdir -p ${{ env.LOGS_DIR }} + chmod -R 777 ${{ env.LOGS_DIR }} + + - name: Start PlatformOS LSP + if: steps.changed.outputs.skip != 'true' + id: start_lsp + run: | + docker run -i \ + -v ${{ env.DOCKER_WORKSPACE }}:${{ env.DOCKER_WORKSPACE }} \ + -w ${{ env.DOCKER_WORKSPACE }} \ + -e PLATFORMOS_CHECK_DEBUG=${{ env.PLATFORMOS_CHECK_DEBUG }} \ + -e PLATFORMOS_CHECK_DEBUG_LOG_FILE=${{ env.LOGS_DIR }}/platformos-lsp.log \ + platformos/platformos-lsp:latest + + - name: Run platformos-check + if: steps.changed.outputs.skip != 'true' && steps.start_lsp.outcome == 'success' + id: run_check + run: | + set +e # Disable exit on error + docker run -i \ + -v ${{ env.DOCKER_WORKSPACE }}:${{ env.DOCKER_WORKSPACE }} \ + -w ${{ env.DOCKER_WORKSPACE }} \ + -e PLATFORMOS_CHECK_DEBUG=${{ env.PLATFORMOS_CHECK_DEBUG }} \ + -e PLATFORMOS_CHECK_DEBUG_LOG_FILE=${{ env.LOGS_DIR }}/platformos-check.log \ + platformos/platformos-check:latest -o json > ${{ env.LOGS_DIR }}/platformos-check-raw.json + docker_exit_code=$? + set -e # Re-enable exit on error + + jq . ${{ env.LOGS_DIR }}/platformos-check-raw.json | tee ${{ env.LOGS_DIR }}/platformos-check.json + + exit $docker_exit_code + + - name: Upload logs + if: always() && steps.changed.outputs.skip != 'true' && steps.run_check.outcome != 'skipped' + uses: actions/upload-artifact@v4 + with: + name: platformos_check_logs_${{ matrix.module }}_${{ github.run_id }} + path: | + ${{ env.LOGS_DIR }}/platformos-lsp.log + ${{ env.LOGS_DIR }}/platformos-check.json + ${{ env.LOGS_DIR }}/platformos-check-raw.json + + - name: Generate summary + if: always() && steps.changed.outputs.skip != 'true' && steps.run_check.outcome != 'skipped' + run: | + echo "# PlatformOS Check Summary - ${{ matrix.module }} :checkered_flag:" >> $GITHUB_STEP_SUMMARY + echo "## Result: ${{ steps.run_check.outcome }} ${{ env.RESULT_ICON }}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + if [ -f "${{ env.LOGS_DIR }}/platformos-check.json" ]; then + echo "## Issues Found" >> $GITHUB_STEP_SUMMARY + echo "| File | Line | Column | Severity | Check | Message |" >> $GITHUB_STEP_SUMMARY + echo "|------|------|--------|----------|-------|---------|" >> $GITHUB_STEP_SUMMARY + jq -r '.[] | .path as $file | .offenses[] | "| \($file) | \(.start_row) | \(.start_column) | \(.severity) | \(.check) | \(.message) |"' ${{ env.LOGS_DIR }}/platformos-check.json >> $GITHUB_STEP_SUMMARY 2>/dev/null || echo "| N/A | N/A | N/A | N/A | N/A | Failed to parse JSON output |" >> $GITHUB_STEP_SUMMARY + else + echo "## No output file found" >> $GITHUB_STEP_SUMMARY + fi + env: + RESULT_ICON: ${{ steps.run_check.outcome == 'success' && ':white_check_mark:' || ':x:' }} + + - name: Fail job if platformos-check failed + if: always() && steps.changed.outputs.skip != 'true' && steps.run_check.outcome == 'failure' + run: | + echo "platformos-check failed — marking job as failed" + exit 1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 21e488b..86a4170 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -271,44 +271,3 @@ jobs: method: release repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} - - lint-platformos-check: - needs: detect-changes - runs-on: ubuntu-latest - strategy: - matrix: - module: - - payments - - user - - chat - - common-styling - - tests - - core - - oauth-facebook - - oauth-github - - oauth-google - - openai - - reports - - data-export-api - - payments-stripe - - payments-example-gateway - fail-fast: false - steps: - - name: Check if this module changed - id: changed - run: | - MODULE_CHANGED="${{ needs.detect-changes.outputs[matrix.module] }}" - if [ "$MODULE_CHANGED" != "true" ]; then - echo "skip=true" >> $GITHUB_OUTPUT - else - echo "skip=false" >> $GITHUB_OUTPUT - fi - - - uses: actions/checkout@v4 - if: steps.changed.outputs.skip != 'true' - - - name: Run platformOS-check - if: steps.changed.outputs.skip != 'true' - uses: Platform-OS/platformos-check-action@v1 - with: - path: pos-module-${{ matrix.module }} From d564af436823ada61b60b74e830fad8a0098e4a7 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Tue, 17 Feb 2026 18:31:45 +0100 Subject: [PATCH 04/27] test: add a comment to trigger tests in pos-module-user --- .../user/public/lib/queries/role_permissions/permissions.liquid | 1 + 1 file changed, 1 insertion(+) diff --git a/pos-module-user/app/modules/user/public/lib/queries/role_permissions/permissions.liquid b/pos-module-user/app/modules/user/public/lib/queries/role_permissions/permissions.liquid index 5557577..a0501e8 100644 --- a/pos-module-user/app/modules/user/public/lib/queries/role_permissions/permissions.liquid +++ b/pos-module-user/app/modules/user/public/lib/queries/role_permissions/permissions.liquid @@ -1,4 +1,5 @@ {% parse_json data %} +# This comment is here to trigger GH Actions to test workflows { {% if context.constants.USER_DEFAULT_ROLE != blank %} "{{ context.constants.USER_DEFAULT_ROLE }}": [], From 0295a14462fce4fb0bbec9f5d75c0bb54b8b4b0a Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Tue, 17 Feb 2026 22:45:39 +0100 Subject: [PATCH 05/27] test: remove payments module from platformOS test job The payments module lacks an app/ directory and cannot be deployed via pos-cli deploy. Only keep modules with app/ directories in the test-platformos job until deployment strategy is determined for module-only packages. --- .github/workflows/test.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 86a4170..aa23da1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -79,16 +79,12 @@ jobs: test-platformos: needs: detect-changes - if: | - needs.detect-changes.outputs.payments == 'true' || - needs.detect-changes.outputs.user == 'true' + if: needs.detect-changes.outputs.user == 'true' runs-on: ubuntu-latest container: platformos/pos-cli:latest strategy: matrix: include: - - module: payments - path: pos-module-payments - module: user path: pos-module-user fail-fast: false From 752835c69b938911b8ca03261ac0e3c508943e70 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Wed, 18 Feb 2026 00:10:26 +0100 Subject: [PATCH 06/27] test: use seed script to deploy pos-module-user --- .github/workflows/test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index aa23da1..b735ecc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -132,7 +132,8 @@ jobs: MPKIT_TOKEN: ${{ steps.get-token.outputs.mpkit-token }} working-directory: ${{ matrix.path }} run: | - pos-cli deploy + rm app/pos-modules.* || true + sh ./tests/data/seed/seed.sh - name: Run platformOS tests if: steps.changed.outputs.skip != 'true' From d773e668f9889a39f8ac74d64ad62cabc74442e4 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Wed, 18 Feb 2026 15:20:19 +0100 Subject: [PATCH 07/27] test: split workflows to avoid CI instance conflicts Create separate workflows for different test types: - test.yml: module/Liquid tests (pos-cli test run) - test-e2e.yml: Playwright E2E tests This resolves instance reservation conflicts that occurred when both test jobs tried to reserve the same CI instance simultaneously. --- .github/workflows/test-e2e.yml | 194 +++++++++++++++++++++++++++++++++ .github/workflows/test.yml | 116 -------------------- 2 files changed, 194 insertions(+), 116 deletions(-) create mode 100644 .github/workflows/test-e2e.yml diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml new file mode 100644 index 0000000..0e42a80 --- /dev/null +++ b/.github/workflows/test-e2e.yml @@ -0,0 +1,194 @@ +name: E2E tests +on: + pull_request: + branches: [ master ] + paths-ignore: + - "**/README.md" + push: + paths-ignore: + - "**/README.md" + workflow_dispatch: + +jobs: + pre_job: + runs-on: ubuntu-latest + outputs: + should_skip: ${{ steps.skip_check.outputs.should_skip }} + steps: + - id: skip_check + uses: fkirc/skip-duplicate-actions@master + with: + github_token: ${{ github.token }} + paths_ignore: '["**/README.md"]' + do_not_skip: '["push"]' + + detect-changes: + needs: pre_job + if: ${{ needs.pre_job.outputs.should_skip != 'true' }} + runs-on: ubuntu-latest + outputs: + payments: ${{ steps.filter.outputs.payments }} + user: ${{ steps.filter.outputs.user }} + chat: ${{ steps.filter.outputs.chat }} + common-styling: ${{ steps.filter.outputs.common-styling }} + tests: ${{ steps.filter.outputs.tests }} + core: ${{ steps.filter.outputs.core }} + oauth-facebook: ${{ steps.filter.outputs.oauth-facebook }} + oauth-github: ${{ steps.filter.outputs.oauth-github }} + oauth-google: ${{ steps.filter.outputs.oauth-google }} + openai: ${{ steps.filter.outputs.openai }} + reports: ${{ steps.filter.outputs.reports }} + data-export-api: ${{ steps.filter.outputs.data-export-api }} + payments-stripe: ${{ steps.filter.outputs.payments-stripe }} + payments-example-gateway: ${{ steps.filter.outputs.payments-example-gateway }} + steps: + - uses: actions/checkout@v4 + + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + payments: + - 'pos-module-payments/**' + user: + - 'pos-module-user/**' + chat: + - 'pos-module-chat/**' + common-styling: + - 'pos-module-common-styling/**' + tests: + - 'pos-module-tests/**' + core: + - 'pos-module-core/**' + oauth-facebook: + - 'pos-module-oauth-facebook/**' + oauth-github: + - 'pos-module-oauth-github/**' + oauth-google: + - 'pos-module-oauth-google/**' + openai: + - 'pos-module-openai/**' + reports: + - 'pos-module-reports/**' + data-export-api: + - 'pos-module-data-export-api/**' + payments-stripe: + - 'pos-module-payments-stripe/**' + payments-example-gateway: + - 'pos-module-payments-example-gateway/**' + + test-playwright: + needs: detect-changes + if: | + needs.detect-changes.outputs.user == 'true' || + needs.detect-changes.outputs.chat == 'true' || + needs.detect-changes.outputs.common-styling == 'true' + runs-on: ubuntu-latest + container: platformos/playwright:5.4.0-1.52 + strategy: + matrix: + include: + - module: user + path: pos-module-user + deploy-script: | + rm app/pos-modules.* || true + sh ./tests/data/seed/seed.sh + test-commands: | + npm run admin-panel-pw-tests + npm run pw-tests + - module: chat + path: pos-module-chat + deploy-script: | + rm app/pos-modules.* || true + sh ./tests/data/seed/seed.sh + test-commands: npm run pw-tests + - module: common-styling + path: pos-module-common-styling + deploy-script: | + pos-cli data clean --include-schema --auto-confirm + pos-cli deploy + test-commands: npm run pw-tests + fail-fast: false + timeout-minutes: 35 + env: + CI: true + MPKIT_EMAIL: ${{ secrets.MPKIT_EMAIL }} + E2E_TEST_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }} + HTML_ATTACHMENTS_BASE_URL: ${{ vars.HTML_ATTACHMENTS_BASE_URL }} + TEST_REPORT_MPKIT_URL: ${{ vars.TEST_REPORT_MPKIT_URL }} + TEST_REPORT_MPKIT_TOKEN: ${{ secrets.TEST_REPORT_MPKIT_TOKEN }} + HOME: /root + steps: + - name: Check if this module changed + id: changed + run: | + MODULE_CHANGED="${{ needs.detect-changes.outputs[matrix.module] }}" + if [ "$MODULE_CHANGED" != "true" ]; then + echo "skip=true" >> $GITHUB_OUTPUT + else + echo "skip=false" >> $GITHUB_OUTPUT + fi + + - name: Reserve CI instance + if: steps.changed.outputs.skip != 'true' + id: reserve + uses: Platform-OS/ci-repository-reserve-instance-url@0.0.9 + with: + repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} + method: reserve + pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} + + - name: Get MPKIT token + if: steps.changed.outputs.skip != 'true' + id: get-token + uses: Platform-OS/ci-repository-reserve-instance-url@mask-token + with: + method: get-token + repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} + pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} + + - uses: actions/checkout@v4 + if: steps.changed.outputs.skip != 'true' + + - uses: actions/setup-node@v4 + if: steps.changed.outputs.skip != 'true' + with: + node-version: 20.x + + - name: Deploy module + if: steps.changed.outputs.skip != 'true' + timeout-minutes: 10 + shell: sh + env: + MPKIT_URL: ${{ steps.reserve.outputs.mpkit-url }} + MPKIT_TOKEN: ${{ steps.get-token.outputs.mpkit-token }} + working-directory: ${{ matrix.path }} + run: | + set -eu + ${{ matrix.deploy-script }} + + - name: Install test dependencies + if: steps.changed.outputs.skip != 'true' + shell: sh + working-directory: ${{ matrix.path }} + run: | + set -eu + npm install + + - name: Run Playwright tests + if: steps.changed.outputs.skip != 'true' + shell: sh + working-directory: ${{ matrix.path }} + env: + MPKIT_URL: ${{ steps.reserve.outputs.mpkit-url }} + run: | + set -eu + ${{ matrix.test-commands }} + + - name: Release CI instance + if: always() && steps.changed.outputs.skip != 'true' + uses: Platform-OS/ci-repository-reserve-instance-url@0.0.9 + with: + method: release + repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} + pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b735ecc..0b22b0b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -152,119 +152,3 @@ jobs: method: release repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} - - test-playwright: - needs: detect-changes - if: | - needs.detect-changes.outputs.user == 'true' || - needs.detect-changes.outputs.chat == 'true' || - needs.detect-changes.outputs.common-styling == 'true' - runs-on: ubuntu-latest - container: platformos/playwright:5.4.0-1.52 - strategy: - matrix: - include: - - module: user - path: pos-module-user - deploy-script: | - rm app/pos-modules.* || true - sh ./tests/data/seed/seed.sh - test-commands: | - npm run admin-panel-pw-tests - npm run pw-tests - - module: chat - path: pos-module-chat - deploy-script: | - rm app/pos-modules.* || true - sh ./tests/data/seed/seed.sh - test-commands: npm run pw-tests - - module: common-styling - path: pos-module-common-styling - deploy-script: | - pos-cli data clean --include-schema --auto-confirm - pos-cli deploy - test-commands: npm run pw-tests - fail-fast: false - timeout-minutes: 35 - env: - CI: true - MPKIT_EMAIL: ${{ secrets.MPKIT_EMAIL }} - E2E_TEST_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }} - HTML_ATTACHMENTS_BASE_URL: ${{ vars.HTML_ATTACHMENTS_BASE_URL }} - TEST_REPORT_MPKIT_URL: ${{ vars.TEST_REPORT_MPKIT_URL }} - TEST_REPORT_MPKIT_TOKEN: ${{ secrets.TEST_REPORT_MPKIT_TOKEN }} - HOME: /root - steps: - - name: Check if this module changed - id: changed - run: | - MODULE_CHANGED="${{ needs.detect-changes.outputs[matrix.module] }}" - if [ "$MODULE_CHANGED" != "true" ]; then - echo "skip=true" >> $GITHUB_OUTPUT - else - echo "skip=false" >> $GITHUB_OUTPUT - fi - - - name: Reserve CI instance - if: steps.changed.outputs.skip != 'true' - id: reserve - uses: Platform-OS/ci-repository-reserve-instance-url@0.0.9 - with: - repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} - method: reserve - pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} - - - name: Get MPKIT token - if: steps.changed.outputs.skip != 'true' - id: get-token - uses: Platform-OS/ci-repository-reserve-instance-url@mask-token - with: - method: get-token - repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} - pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} - - - uses: actions/checkout@v4 - if: steps.changed.outputs.skip != 'true' - - - uses: actions/setup-node@v4 - if: steps.changed.outputs.skip != 'true' - with: - node-version: 20.x - - - name: Deploy module - if: steps.changed.outputs.skip != 'true' - timeout-minutes: 10 - shell: sh - env: - MPKIT_URL: ${{ steps.reserve.outputs.mpkit-url }} - MPKIT_TOKEN: ${{ steps.get-token.outputs.mpkit-token }} - working-directory: ${{ matrix.path }} - run: | - set -eu - ${{ matrix.deploy-script }} - - - name: Install test dependencies - if: steps.changed.outputs.skip != 'true' - shell: sh - working-directory: ${{ matrix.path }} - run: | - set -eu - npm install - - - name: Run Playwright tests - if: steps.changed.outputs.skip != 'true' - shell: sh - working-directory: ${{ matrix.path }} - env: - MPKIT_URL: ${{ steps.reserve.outputs.mpkit-url }} - run: | - set -eu - ${{ matrix.test-commands }} - - - name: Release CI instance - if: always() && steps.changed.outputs.skip != 'true' - uses: Platform-OS/ci-repository-reserve-instance-url@0.0.9 - with: - method: release - repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} - pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} From b503469fa8aa5012b3fd1de0fd4fa1459df228ac Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Wed, 18 Feb 2026 20:40:29 +0100 Subject: [PATCH 08/27] test: added a test-triggering-comment to a different module Removed comment-trigger from pos-module-user --- .../user/public/lib/queries/role_permissions/permissions.liquid | 1 + .../user/public/lib/queries/role_permissions/permissions.liquid | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pos-module-chat/app/modules/user/public/lib/queries/role_permissions/permissions.liquid b/pos-module-chat/app/modules/user/public/lib/queries/role_permissions/permissions.liquid index 14a245a..d2edc51 100644 --- a/pos-module-chat/app/modules/user/public/lib/queries/role_permissions/permissions.liquid +++ b/pos-module-chat/app/modules/user/public/lib/queries/role_permissions/permissions.liquid @@ -1,4 +1,5 @@ {% parse_json data %} +# This comment is here to trigger GH Actions to test workflows { {% if context.constants.USER_DEFAULT_ROLE != blank %} "{{ context.constants.USER_DEFAULT_ROLE }}": [], diff --git a/pos-module-user/app/modules/user/public/lib/queries/role_permissions/permissions.liquid b/pos-module-user/app/modules/user/public/lib/queries/role_permissions/permissions.liquid index a0501e8..5557577 100644 --- a/pos-module-user/app/modules/user/public/lib/queries/role_permissions/permissions.liquid +++ b/pos-module-user/app/modules/user/public/lib/queries/role_permissions/permissions.liquid @@ -1,5 +1,4 @@ {% parse_json data %} -# This comment is here to trigger GH Actions to test workflows { {% if context.constants.USER_DEFAULT_ROLE != blank %} "{{ context.constants.USER_DEFAULT_ROLE }}": [], From 581096b742c18e63de1b7269004e53edd06f5c64 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Wed, 18 Feb 2026 21:11:18 +0100 Subject: [PATCH 09/27] test: use deploy-script pattern for module-specific deployment Refactor test.yml to use matrix deploy-script field instead of hardcoded deployment commands. This allows each module to define its own deployment strategy, enabling future addition of modules without seed infrastructure (e.g., pos-module-core). Aligns with the pattern already used in test-e2e.yml. --- .github/workflows/test.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0b22b0b..1de56fb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -87,6 +87,9 @@ jobs: include: - module: user path: pos-module-user + deploy-script: | + rm app/pos-modules.* || true + sh ./tests/data/seed/seed.sh fail-fast: false timeout-minutes: 20 env: @@ -132,8 +135,8 @@ jobs: MPKIT_TOKEN: ${{ steps.get-token.outputs.mpkit-token }} working-directory: ${{ matrix.path }} run: | - rm app/pos-modules.* || true - sh ./tests/data/seed/seed.sh + set -eu + ${{ matrix.deploy-script }} - name: Run platformOS tests if: steps.changed.outputs.skip != 'true' From a9dd386629ee9c8600e85970c21cf491855f8cd9 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Wed, 18 Feb 2026 23:57:23 +0100 Subject: [PATCH 10/27] use repo variable to define PW container and do not install dependencies --- .github/workflows/test-e2e.yml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 0e42a80..836ffc6 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -84,7 +84,7 @@ jobs: needs.detect-changes.outputs.chat == 'true' || needs.detect-changes.outputs.common-styling == 'true' runs-on: ubuntu-latest - container: platformos/playwright:5.4.0-1.52 + container: ${{ vars.PW_CONTAINER }} strategy: matrix: include: @@ -167,14 +167,6 @@ jobs: set -eu ${{ matrix.deploy-script }} - - name: Install test dependencies - if: steps.changed.outputs.skip != 'true' - shell: sh - working-directory: ${{ matrix.path }} - run: | - set -eu - npm install - - name: Run Playwright tests if: steps.changed.outputs.skip != 'true' shell: sh From 3a11d3011140017c05764422d0e0c562810132cd Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Thu, 19 Feb 2026 00:52:35 +0100 Subject: [PATCH 11/27] test: split E2E workflow into deploy, test, and cleanup jobs Refactor test-playwright job into three separate jobs following the pattern from e2e_tests_on_ps.yml: - deploy: Reserves instances and deploys modules (10min timeout) - test: Retrieves instance URLs and runs Playwright tests (35min timeout) - cleanup: Always releases CI instances, even on failure Benefits: - Clear separation between deployment and test failures - Better visibility in GitHub Actions UI - Ensures CI instances are always released via cleanup job - Aligns with established workflow patterns in the repository --- .github/workflows/test-e2e.yml | 92 +++++++++++++++++++++++++++++----- 1 file changed, 79 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 836ffc6..fb8271b 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -77,7 +77,7 @@ jobs: payments-example-gateway: - 'pos-module-payments-example-gateway/**' - test-playwright: + deploy: needs: detect-changes if: | needs.detect-changes.outputs.user == 'true' || @@ -93,30 +93,21 @@ jobs: deploy-script: | rm app/pos-modules.* || true sh ./tests/data/seed/seed.sh - test-commands: | - npm run admin-panel-pw-tests - npm run pw-tests - module: chat path: pos-module-chat deploy-script: | rm app/pos-modules.* || true sh ./tests/data/seed/seed.sh - test-commands: npm run pw-tests - module: common-styling path: pos-module-common-styling deploy-script: | pos-cli data clean --include-schema --auto-confirm pos-cli deploy - test-commands: npm run pw-tests fail-fast: false - timeout-minutes: 35 + timeout-minutes: 10 env: CI: true MPKIT_EMAIL: ${{ secrets.MPKIT_EMAIL }} - E2E_TEST_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }} - HTML_ATTACHMENTS_BASE_URL: ${{ vars.HTML_ATTACHMENTS_BASE_URL }} - TEST_REPORT_MPKIT_URL: ${{ vars.TEST_REPORT_MPKIT_URL }} - TEST_REPORT_MPKIT_TOKEN: ${{ secrets.TEST_REPORT_MPKIT_TOKEN }} HOME: /root steps: - name: Check if this module changed @@ -167,18 +158,93 @@ jobs: set -eu ${{ matrix.deploy-script }} + test: + needs: ["detect-changes", "deploy"] + if: ${{ success() && (needs.detect-changes.outputs.user == 'true' || needs.detect-changes.outputs.chat == 'true' || needs.detect-changes.outputs.common-styling == 'true') }} + runs-on: ubuntu-latest + container: ${{ vars.PW_CONTAINER }} + strategy: + matrix: + include: + - module: user + path: pos-module-user + test-commands: | + npm run admin-panel-pw-tests + npm run pw-tests + - module: chat + path: pos-module-chat + test-commands: npm run pw-tests + - module: common-styling + path: pos-module-common-styling + test-commands: npm run pw-tests + fail-fast: false + timeout-minutes: 35 + env: + CI: true + E2E_TEST_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }} + MPKIT_EMAIL: ${{ secrets.MPKIT_EMAIL }} + HTML_ATTACHMENTS_BASE_URL: ${{ vars.HTML_ATTACHMENTS_BASE_URL }} + TEST_REPORT_MPKIT_URL: ${{ vars.TEST_REPORT_MPKIT_URL }} + TEST_REPORT_MPKIT_TOKEN: ${{ secrets.TEST_REPORT_MPKIT_TOKEN }} + HOME: /root + steps: + - name: Check if this module changed + id: changed + run: | + MODULE_CHANGED="${{ needs.detect-changes.outputs[matrix.module] }}" + if [ "$MODULE_CHANGED" != "true" ]; then + echo "skip=true" >> $GITHUB_OUTPUT + else + echo "skip=false" >> $GITHUB_OUTPUT + fi + + - name: Get reserved instance URL + if: steps.changed.outputs.skip != 'true' + id: get-url + uses: Platform-OS/ci-repository-reserve-instance-url@0.0.9 + with: + repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} + method: get-url + pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} + + - uses: actions/checkout@v4 + if: steps.changed.outputs.skip != 'true' + - name: Run Playwright tests if: steps.changed.outputs.skip != 'true' shell: sh working-directory: ${{ matrix.path }} env: - MPKIT_URL: ${{ steps.reserve.outputs.mpkit-url }} + MPKIT_URL: ${{ steps.get-url.outputs.mpkit-url }} run: | set -eu ${{ matrix.test-commands }} + cleanup: + if: ${{ always() }} + needs: ["detect-changes", "deploy", "test"] + runs-on: ubuntu-latest + container: alpine:3.20 + strategy: + matrix: + include: + - module: user + - module: chat + - module: common-styling + fail-fast: false + steps: + - name: Check if this module changed + id: changed + run: | + MODULE_CHANGED="${{ needs.detect-changes.outputs[matrix.module] }}" + if [ "$MODULE_CHANGED" != "true" ]; then + echo "skip=true" >> $GITHUB_OUTPUT + else + echo "skip=false" >> $GITHUB_OUTPUT + fi + - name: Release CI instance - if: always() && steps.changed.outputs.skip != 'true' + if: steps.changed.outputs.skip != 'true' uses: Platform-OS/ci-repository-reserve-instance-url@0.0.9 with: method: release From d33532d0f67638ce85d401cb6b481be075818e10 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Thu, 19 Feb 2026 01:33:16 +0100 Subject: [PATCH 12/27] update version of reserve-instance action and add NPM_CONFIG_CACHE var --- .github/workflows/test-e2e.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index fb8271b..0af587a 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -123,7 +123,7 @@ jobs: - name: Reserve CI instance if: steps.changed.outputs.skip != 'true' id: reserve - uses: Platform-OS/ci-repository-reserve-instance-url@0.0.9 + uses: Platform-OS/ci-repository-reserve-instance-url@0.1.2 with: repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} method: reserve @@ -184,6 +184,7 @@ jobs: E2E_TEST_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }} MPKIT_EMAIL: ${{ secrets.MPKIT_EMAIL }} HTML_ATTACHMENTS_BASE_URL: ${{ vars.HTML_ATTACHMENTS_BASE_URL }} + NPM_CONFIG_CACHE: ${{ github.workspace }}/.npm TEST_REPORT_MPKIT_URL: ${{ vars.TEST_REPORT_MPKIT_URL }} TEST_REPORT_MPKIT_TOKEN: ${{ secrets.TEST_REPORT_MPKIT_TOKEN }} HOME: /root @@ -201,7 +202,7 @@ jobs: - name: Get reserved instance URL if: steps.changed.outputs.skip != 'true' id: get-url - uses: Platform-OS/ci-repository-reserve-instance-url@0.0.9 + uses: Platform-OS/ci-repository-reserve-instance-url@0.1.2 with: repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} method: get-url @@ -245,7 +246,7 @@ jobs: - name: Release CI instance if: steps.changed.outputs.skip != 'true' - uses: Platform-OS/ci-repository-reserve-instance-url@0.0.9 + uses: Platform-OS/ci-repository-reserve-instance-url@0.1.2 with: method: release repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} From d3bf03e88bc9f735faca961c6fa3e7d07dfd07e9 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sat, 21 Feb 2026 01:05:54 +0100 Subject: [PATCH 13/27] test: align E2E deploy job with reserve-and-deploy-cs pattern Mirror the structure and action versions from reserve-and-deploy-cs.yml into the test-e2e.yml deploy job to maintain consistency across workflows. Changes: - Update Get MPKIT token action from @mask-token to @0.1.2 - Add ref parameter to checkout step for proper branch handling - Increase deploy timeout from 10 to 15 minutes --- .github/workflows/test-e2e.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 0af587a..6812eaa 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -104,7 +104,7 @@ jobs: pos-cli data clean --include-schema --auto-confirm pos-cli deploy fail-fast: false - timeout-minutes: 10 + timeout-minutes: 15 env: CI: true MPKIT_EMAIL: ${{ secrets.MPKIT_EMAIL }} @@ -132,7 +132,7 @@ jobs: - name: Get MPKIT token if: steps.changed.outputs.skip != 'true' id: get-token - uses: Platform-OS/ci-repository-reserve-instance-url@mask-token + uses: Platform-OS/ci-repository-reserve-instance-url@0.1.2 with: method: get-token repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} @@ -140,6 +140,8 @@ jobs: - uses: actions/checkout@v4 if: steps.changed.outputs.skip != 'true' + with: + ref: ${{ github.head_ref || github.ref_name }} - uses: actions/setup-node@v4 if: steps.changed.outputs.skip != 'true' From 2cad645062fc4895b0b0fb72e7d06fd5940478d7 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sat, 21 Feb 2026 01:43:39 +0100 Subject: [PATCH 14/27] test: update E2E workflow environment variables Replace HOME environment variable with NPM_CONFIG_CACHE in deploy job and remove redundant HOME variable from test job. - Deploy job: use NPM_CONFIG_CACHE instead of HOME for npm caching - Test job: remove HOME variable (NPM_CONFIG_CACHE already present) --- .github/workflows/test-e2e.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 6812eaa..a64c86e 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -108,7 +108,7 @@ jobs: env: CI: true MPKIT_EMAIL: ${{ secrets.MPKIT_EMAIL }} - HOME: /root + NPM_CONFIG_CACHE: ${{ github.workspace }}/.npm steps: - name: Check if this module changed id: changed @@ -189,7 +189,6 @@ jobs: NPM_CONFIG_CACHE: ${{ github.workspace }}/.npm TEST_REPORT_MPKIT_URL: ${{ vars.TEST_REPORT_MPKIT_URL }} TEST_REPORT_MPKIT_TOKEN: ${{ secrets.TEST_REPORT_MPKIT_TOKEN }} - HOME: /root steps: - name: Check if this module changed id: changed From 958c8eef18d09c7eda8e816a21f242be929d53e7 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sat, 21 Feb 2026 02:21:02 +0100 Subject: [PATCH 15/27] test: pass mpkit-url from deploy to test via job outputs Refactor instance URL handling to use job outputs instead of querying the CI repository in the test job. Changes: - Deploy job: add mpkit-url output from reserve step - Test job: use deploy job output for MPKIT_URL environment variable - Test job: remove redundant "Get reserved instance URL" step - Test job: move MPKIT_URL to job-level env for cleaner configuration This simplifies the workflow by eliminating an extra API call to retrieve the instance URL that was already reserved in the deploy job. --- .github/workflows/test-e2e.yml | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index a64c86e..4159cb5 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -109,6 +109,8 @@ jobs: CI: true MPKIT_EMAIL: ${{ secrets.MPKIT_EMAIL }} NPM_CONFIG_CACHE: ${{ github.workspace }}/.npm + outputs: + mpkit-url: ${{ steps.reserve.outputs.mpkit-url }} steps: - name: Check if this module changed id: changed @@ -185,8 +187,9 @@ jobs: CI: true E2E_TEST_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }} MPKIT_EMAIL: ${{ secrets.MPKIT_EMAIL }} - HTML_ATTACHMENTS_BASE_URL: ${{ vars.HTML_ATTACHMENTS_BASE_URL }} + MPKIT_URL: ${{ needs.reserve-and-deploy.outputs.mpkit-url }} NPM_CONFIG_CACHE: ${{ github.workspace }}/.npm + HTML_ATTACHMENTS_BASE_URL: ${{ vars.HTML_ATTACHMENTS_BASE_URL }} TEST_REPORT_MPKIT_URL: ${{ vars.TEST_REPORT_MPKIT_URL }} TEST_REPORT_MPKIT_TOKEN: ${{ secrets.TEST_REPORT_MPKIT_TOKEN }} steps: @@ -200,15 +203,6 @@ jobs: echo "skip=false" >> $GITHUB_OUTPUT fi - - name: Get reserved instance URL - if: steps.changed.outputs.skip != 'true' - id: get-url - uses: Platform-OS/ci-repository-reserve-instance-url@0.1.2 - with: - repository-url: ${{ vars.CI_PS_REPOSITORY_URL }} - method: get-url - pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} - - uses: actions/checkout@v4 if: steps.changed.outputs.skip != 'true' @@ -216,8 +210,6 @@ jobs: if: steps.changed.outputs.skip != 'true' shell: sh working-directory: ${{ matrix.path }} - env: - MPKIT_URL: ${{ steps.get-url.outputs.mpkit-url }} run: | set -eu ${{ matrix.test-commands }} From 7806d8c9a07041557f59c66e3abb4819c26f46b8 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sat, 21 Feb 2026 02:27:50 +0100 Subject: [PATCH 16/27] test: rename deploy job to reserve-and-deploy in E2E workflow --- .github/workflows/test-e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 4159cb5..8313bb0 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -77,7 +77,7 @@ jobs: payments-example-gateway: - 'pos-module-payments-example-gateway/**' - deploy: + reserve-and-deploy: needs: detect-changes if: | needs.detect-changes.outputs.user == 'true' || From c89ee723f80cb0f2617f9480415b064c4cb39b75 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sat, 21 Feb 2026 02:29:47 +0100 Subject: [PATCH 17/27] test: update job dependencies after renaming deploy job Update test and cleanup job dependencies to reference the renamed reserve-and-deploy job instead of deploy. --- .github/workflows/test-e2e.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 8313bb0..70bd587 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -163,7 +163,7 @@ jobs: ${{ matrix.deploy-script }} test: - needs: ["detect-changes", "deploy"] + needs: ["detect-changes", "reserve-and-deploy"] if: ${{ success() && (needs.detect-changes.outputs.user == 'true' || needs.detect-changes.outputs.chat == 'true' || needs.detect-changes.outputs.common-styling == 'true') }} runs-on: ubuntu-latest container: ${{ vars.PW_CONTAINER }} @@ -216,7 +216,7 @@ jobs: cleanup: if: ${{ always() }} - needs: ["detect-changes", "deploy", "test"] + needs: ["detect-changes", "reserve-and-deploy", "test"] runs-on: ubuntu-latest container: alpine:3.20 strategy: From 7c5697d682a22045b1277c83d847f7e8b72d8cfd Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sat, 21 Feb 2026 13:54:18 +0100 Subject: [PATCH 18/27] fix: move comment outside parse_json block in chat permissions Move the comment from inside the {% parse_json %} block to before it using Liquid comment syntax to prevent JSON parsing errors. --- .../user/public/lib/queries/role_permissions/permissions.liquid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pos-module-chat/app/modules/user/public/lib/queries/role_permissions/permissions.liquid b/pos-module-chat/app/modules/user/public/lib/queries/role_permissions/permissions.liquid index d2edc51..d98e47a 100644 --- a/pos-module-chat/app/modules/user/public/lib/queries/role_permissions/permissions.liquid +++ b/pos-module-chat/app/modules/user/public/lib/queries/role_permissions/permissions.liquid @@ -1,5 +1,5 @@ +{% comment %}This comment is here to trigger GH Actions to test workflows{% endcomment %} {% parse_json data %} -# This comment is here to trigger GH Actions to test workflows { {% if context.constants.USER_DEFAULT_ROLE != blank %} "{{ context.constants.USER_DEFAULT_ROLE }}": [], From bb40dc38f4390320621c45708da3bf24387f56c6 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sat, 21 Feb 2026 16:44:40 +0100 Subject: [PATCH 19/27] test: refactor E2E workflow to use dynamic matrix Replace hardcoded matrices with dynamic matrix generation based on changed modules. This eliminates redundant change detection and makes adding new modules significantly easier. --- .github/workflows/test-e2e.yml | 139 +++++++-------------------------- 1 file changed, 27 insertions(+), 112 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 70bd587..c4dd952 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -27,20 +27,7 @@ jobs: if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest outputs: - payments: ${{ steps.filter.outputs.payments }} - user: ${{ steps.filter.outputs.user }} - chat: ${{ steps.filter.outputs.chat }} - common-styling: ${{ steps.filter.outputs.common-styling }} - tests: ${{ steps.filter.outputs.tests }} - core: ${{ steps.filter.outputs.core }} - oauth-facebook: ${{ steps.filter.outputs.oauth-facebook }} - oauth-github: ${{ steps.filter.outputs.oauth-github }} - oauth-google: ${{ steps.filter.outputs.oauth-google }} - openai: ${{ steps.filter.outputs.openai }} - reports: ${{ steps.filter.outputs.reports }} - data-export-api: ${{ steps.filter.outputs.data-export-api }} - payments-stripe: ${{ steps.filter.outputs.payments-stripe }} - payments-example-gateway: ${{ steps.filter.outputs.payments-example-gateway }} + changed-modules: ${{ steps.set-matrix.outputs.matrix }} steps: - uses: actions/checkout@v4 @@ -48,61 +35,41 @@ jobs: id: filter with: filters: | - payments: - - 'pos-module-payments/**' user: - 'pos-module-user/**' chat: - 'pos-module-chat/**' common-styling: - 'pos-module-common-styling/**' - tests: - - 'pos-module-tests/**' - core: - - 'pos-module-core/**' - oauth-facebook: - - 'pos-module-oauth-facebook/**' - oauth-github: - - 'pos-module-oauth-github/**' - oauth-google: - - 'pos-module-oauth-google/**' - openai: - - 'pos-module-openai/**' - reports: - - 'pos-module-reports/**' - data-export-api: - - 'pos-module-data-export-api/**' - payments-stripe: - - 'pos-module-payments-stripe/**' - payments-example-gateway: - - 'pos-module-payments-example-gateway/**' + + - name: Set matrix for changed modules + id: set-matrix + run: | + modules='[]' + + if [ "${{ steps.filter.outputs.user }}" == "true" ]; then + modules=$(echo "$modules" | jq -c '. += [{"module":"user","path":"pos-module-user","deploy-script":"rm app/pos-modules.* || true\nsh ./tests/data/seed/seed.sh","test-commands":"npm run admin-panel-pw-tests\nnpm run pw-tests"}]') + fi + + if [ "${{ steps.filter.outputs.chat }}" == "true" ]; then + modules=$(echo "$modules" | jq -c '. += [{"module":"chat","path":"pos-module-chat","deploy-script":"rm app/pos-modules.* || true\nsh ./tests/data/seed/seed.sh","test-commands":"npm run pw-tests"}]') + fi + + if [ "${{ steps.filter.outputs.common-styling }}" == "true" ]; then + modules=$(echo "$modules" | jq -c '. += [{"module":"common-styling","path":"pos-module-common-styling","deploy-script":"pos-cli data clean --include-schema --auto-confirm\npos-cli deploy","test-commands":"npm run pw-tests"}]') + fi + + echo "matrix=$modules" >> $GITHUB_OUTPUT + echo "Changed modules matrix: $modules" reserve-and-deploy: needs: detect-changes - if: | - needs.detect-changes.outputs.user == 'true' || - needs.detect-changes.outputs.chat == 'true' || - needs.detect-changes.outputs.common-styling == 'true' + if: needs.detect-changes.outputs.changed-modules != '[]' runs-on: ubuntu-latest container: ${{ vars.PW_CONTAINER }} strategy: matrix: - include: - - module: user - path: pos-module-user - deploy-script: | - rm app/pos-modules.* || true - sh ./tests/data/seed/seed.sh - - module: chat - path: pos-module-chat - deploy-script: | - rm app/pos-modules.* || true - sh ./tests/data/seed/seed.sh - - module: common-styling - path: pos-module-common-styling - deploy-script: | - pos-cli data clean --include-schema --auto-confirm - pos-cli deploy + include: ${{ fromJSON(needs.detect-changes.outputs.changed-modules) }} fail-fast: false timeout-minutes: 15 env: @@ -112,18 +79,7 @@ jobs: outputs: mpkit-url: ${{ steps.reserve.outputs.mpkit-url }} steps: - - name: Check if this module changed - id: changed - run: | - MODULE_CHANGED="${{ needs.detect-changes.outputs[matrix.module] }}" - if [ "$MODULE_CHANGED" != "true" ]; then - echo "skip=true" >> $GITHUB_OUTPUT - else - echo "skip=false" >> $GITHUB_OUTPUT - fi - - name: Reserve CI instance - if: steps.changed.outputs.skip != 'true' id: reserve uses: Platform-OS/ci-repository-reserve-instance-url@0.1.2 with: @@ -132,7 +88,6 @@ jobs: pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} - name: Get MPKIT token - if: steps.changed.outputs.skip != 'true' id: get-token uses: Platform-OS/ci-repository-reserve-instance-url@0.1.2 with: @@ -141,17 +96,14 @@ jobs: pos-ci-repo-token: ${{ secrets.POS_CI_PS_REPO_ACCESS_TOKEN }} - uses: actions/checkout@v4 - if: steps.changed.outputs.skip != 'true' with: ref: ${{ github.head_ref || github.ref_name }} - uses: actions/setup-node@v4 - if: steps.changed.outputs.skip != 'true' with: node-version: 20.x - name: Deploy module - if: steps.changed.outputs.skip != 'true' timeout-minutes: 10 shell: sh env: @@ -164,23 +116,12 @@ jobs: test: needs: ["detect-changes", "reserve-and-deploy"] - if: ${{ success() && (needs.detect-changes.outputs.user == 'true' || needs.detect-changes.outputs.chat == 'true' || needs.detect-changes.outputs.common-styling == 'true') }} + if: ${{ success() && needs.detect-changes.outputs.changed-modules != '[]' }} runs-on: ubuntu-latest container: ${{ vars.PW_CONTAINER }} strategy: matrix: - include: - - module: user - path: pos-module-user - test-commands: | - npm run admin-panel-pw-tests - npm run pw-tests - - module: chat - path: pos-module-chat - test-commands: npm run pw-tests - - module: common-styling - path: pos-module-common-styling - test-commands: npm run pw-tests + include: ${{ fromJSON(needs.detect-changes.outputs.changed-modules) }} fail-fast: false timeout-minutes: 35 env: @@ -193,21 +134,9 @@ jobs: TEST_REPORT_MPKIT_URL: ${{ vars.TEST_REPORT_MPKIT_URL }} TEST_REPORT_MPKIT_TOKEN: ${{ secrets.TEST_REPORT_MPKIT_TOKEN }} steps: - - name: Check if this module changed - id: changed - run: | - MODULE_CHANGED="${{ needs.detect-changes.outputs[matrix.module] }}" - if [ "$MODULE_CHANGED" != "true" ]; then - echo "skip=true" >> $GITHUB_OUTPUT - else - echo "skip=false" >> $GITHUB_OUTPUT - fi - - uses: actions/checkout@v4 - if: steps.changed.outputs.skip != 'true' - name: Run Playwright tests - if: steps.changed.outputs.skip != 'true' shell: sh working-directory: ${{ matrix.path }} run: | @@ -215,30 +144,16 @@ jobs: ${{ matrix.test-commands }} cleanup: - if: ${{ always() }} + if: ${{ always() && needs.detect-changes.outputs.changed-modules != '[]' }} needs: ["detect-changes", "reserve-and-deploy", "test"] runs-on: ubuntu-latest container: alpine:3.20 strategy: matrix: - include: - - module: user - - module: chat - - module: common-styling + include: ${{ fromJSON(needs.detect-changes.outputs.changed-modules) }} fail-fast: false steps: - - name: Check if this module changed - id: changed - run: | - MODULE_CHANGED="${{ needs.detect-changes.outputs[matrix.module] }}" - if [ "$MODULE_CHANGED" != "true" ]; then - echo "skip=true" >> $GITHUB_OUTPUT - else - echo "skip=false" >> $GITHUB_OUTPUT - fi - - name: Release CI instance - if: steps.changed.outputs.skip != 'true' uses: Platform-OS/ci-repository-reserve-instance-url@0.1.2 with: method: release From 0760d85880e792de8584750b593b54a8a00fd827 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sat, 21 Feb 2026 20:43:40 +0100 Subject: [PATCH 20/27] refactor: eliminate boilerplate in set-matrix steps Replace repetitive if-blocks with automatic extraction of changed modules using toJSON() and jq filtering. This drastically reduces code duplication and maintenance burden. Changes: - lint.yml: replace 14 if-blocks (64 lines) with single jq filter (4 lines) - test-e2e.yml: replace 3 if-blocks with config JSON + jq mapping - Use toJSON(steps.filter.outputs) to get all filter results - Use jq to extract only modules where value == "true" - test-e2e.yml: define module configs in clean JSON format --- .github/workflows/lint.yml | 64 +++++++++------------------------- .github/workflows/test-e2e.yml | 41 +++++++++++++++------- 2 files changed, 45 insertions(+), 60 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index fa50481..b9fe922 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -28,23 +28,10 @@ jobs: if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest outputs: - payments: ${{ steps.filter.outputs.payments }} - user: ${{ steps.filter.outputs.user }} - chat: ${{ steps.filter.outputs.chat }} - common-styling: ${{ steps.filter.outputs.common-styling }} - tests: ${{ steps.filter.outputs.tests }} - core: ${{ steps.filter.outputs.core }} - oauth-facebook: ${{ steps.filter.outputs.oauth-facebook }} - oauth-github: ${{ steps.filter.outputs.oauth-github }} - oauth-google: ${{ steps.filter.outputs.oauth-google }} - openai: ${{ steps.filter.outputs.openai }} - reports: ${{ steps.filter.outputs.reports }} - data-export-api: ${{ steps.filter.outputs.data-export-api }} - payments-stripe: ${{ steps.filter.outputs.payments-stripe }} - payments-example-gateway: ${{ steps.filter.outputs.payments-example-gateway }} + changed-modules: ${{ steps.set-matrix.outputs.matrix }} steps: - uses: actions/checkout@v4 - + - uses: dorny/paths-filter@v3 id: filter with: @@ -78,26 +65,22 @@ jobs: payments-example-gateway: - 'pos-module-payments-example-gateway/**' + - name: Set matrix for changed modules + id: set-matrix + run: | + # Extract module names where filter output is "true" + modules=$(echo '${{ toJSON(steps.filter.outputs) }}' | jq -c '[to_entries[] | select(.value == "true") | .key]') + + echo "matrix=$modules" >> $GITHUB_OUTPUT + echo "Changed modules for linting: $modules" + lint-platformos-check: needs: detect-changes + if: needs.detect-changes.outputs.changed-modules != '[]' runs-on: ubuntu-latest strategy: matrix: - module: - - payments - - user - - chat - - common-styling - - tests - - core - - oauth-facebook - - oauth-github - - oauth-google - - openai - - reports - - data-export-api - - payments-stripe - - payments-example-gateway + module: ${{ fromJSON(needs.detect-changes.outputs.changed-modules) }} fail-fast: false env: CI: true @@ -105,28 +88,15 @@ jobs: DOCKER_WORKSPACE: ${{ github.workspace }}/pos-module-${{ matrix.module }} LOGS_DIR: ${{ github.workspace }}/pos-module-${{ matrix.module }}/logs steps: - - name: Check if this module changed - id: changed - run: | - MODULE_CHANGED="${{ needs.detect-changes.outputs[matrix.module] }}" - if [ "$MODULE_CHANGED" != "true" ]; then - echo "skip=true" >> $GITHUB_OUTPUT - else - echo "skip=false" >> $GITHUB_OUTPUT - fi - - name: Checkout code - if: steps.changed.outputs.skip != 'true' uses: actions/checkout@v4 - name: Set up logs directory - if: steps.changed.outputs.skip != 'true' run: | mkdir -p ${{ env.LOGS_DIR }} chmod -R 777 ${{ env.LOGS_DIR }} - name: Start PlatformOS LSP - if: steps.changed.outputs.skip != 'true' id: start_lsp run: | docker run -i \ @@ -137,7 +107,7 @@ jobs: platformos/platformos-lsp:latest - name: Run platformos-check - if: steps.changed.outputs.skip != 'true' && steps.start_lsp.outcome == 'success' + if: steps.start_lsp.outcome == 'success' id: run_check run: | set +e # Disable exit on error @@ -155,7 +125,7 @@ jobs: exit $docker_exit_code - name: Upload logs - if: always() && steps.changed.outputs.skip != 'true' && steps.run_check.outcome != 'skipped' + if: always() && steps.run_check.outcome != 'skipped' uses: actions/upload-artifact@v4 with: name: platformos_check_logs_${{ matrix.module }}_${{ github.run_id }} @@ -165,7 +135,7 @@ jobs: ${{ env.LOGS_DIR }}/platformos-check-raw.json - name: Generate summary - if: always() && steps.changed.outputs.skip != 'true' && steps.run_check.outcome != 'skipped' + if: always() && steps.run_check.outcome != 'skipped' run: | echo "# PlatformOS Check Summary - ${{ matrix.module }} :checkered_flag:" >> $GITHUB_STEP_SUMMARY echo "## Result: ${{ steps.run_check.outcome }} ${{ env.RESULT_ICON }}" >> $GITHUB_STEP_SUMMARY @@ -183,7 +153,7 @@ jobs: RESULT_ICON: ${{ steps.run_check.outcome == 'success' && ':white_check_mark:' || ':x:' }} - name: Fail job if platformos-check failed - if: always() && steps.changed.outputs.skip != 'true' && steps.run_check.outcome == 'failure' + if: always() && steps.run_check.outcome == 'failure' run: | echo "platformos-check failed — marking job as failed" exit 1 diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index c4dd952..4745434 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -45,19 +45,34 @@ jobs: - name: Set matrix for changed modules id: set-matrix run: | - modules='[]' - - if [ "${{ steps.filter.outputs.user }}" == "true" ]; then - modules=$(echo "$modules" | jq -c '. += [{"module":"user","path":"pos-module-user","deploy-script":"rm app/pos-modules.* || true\nsh ./tests/data/seed/seed.sh","test-commands":"npm run admin-panel-pw-tests\nnpm run pw-tests"}]') - fi - - if [ "${{ steps.filter.outputs.chat }}" == "true" ]; then - modules=$(echo "$modules" | jq -c '. += [{"module":"chat","path":"pos-module-chat","deploy-script":"rm app/pos-modules.* || true\nsh ./tests/data/seed/seed.sh","test-commands":"npm run pw-tests"}]') - fi - - if [ "${{ steps.filter.outputs.common-styling }}" == "true" ]; then - modules=$(echo "$modules" | jq -c '. += [{"module":"common-styling","path":"pos-module-common-styling","deploy-script":"pos-cli data clean --include-schema --auto-confirm\npos-cli deploy","test-commands":"npm run pw-tests"}]') - fi + # Define module configurations + cat > /tmp/module-config.json << 'EOF' + { + "user": { + "module": "user", + "path": "pos-module-user", + "deploy-script": "rm app/pos-modules.* || true\nsh ./tests/data/seed/seed.sh", + "test-commands": "npm run admin-panel-pw-tests\nnpm run pw-tests" + }, + "chat": { + "module": "chat", + "path": "pos-module-chat", + "deploy-script": "rm app/pos-modules.* || true\nsh ./tests/data/seed/seed.sh", + "test-commands": "npm run pw-tests" + }, + "common-styling": { + "module": "common-styling", + "path": "pos-module-common-styling", + "deploy-script": "pos-cli data clean --include-schema --auto-confirm\npos-cli deploy", + "test-commands": "npm run pw-tests" + } + } + EOF + + # Extract changed modules and map to their configurations + modules=$(echo '${{ toJSON(steps.filter.outputs) }}' | \ + jq -c --slurpfile config /tmp/module-config.json \ + '[to_entries[] | select(.value == "true") | .key as $m | $config[0][$m] | select(. != null)]') echo "matrix=$modules" >> $GITHUB_OUTPUT echo "Changed modules matrix: $modules" From a94fb3426e860dd465e930ea89395b7db13776b3 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sat, 21 Feb 2026 21:32:38 +0100 Subject: [PATCH 21/27] lint: improve summary generation error handling and debugging Add better error handling to the Generate summary step to diagnose why summary reports aren't rendering after workflow completion. Changes: - Remove error suppression (2>/dev/null) to expose jq failures - Add success/failure conditional logic with feedback messages - Show actual JSON content in summary when jq parsing fails - Display expected file path when platformos-check.json is missing - Add debug output to help identify root cause of rendering issues This will reveal whether the problem is: - Missing JSON output file - Malformed JSON structure - jq parsing errors - Incorrect file paths --- .github/workflows/lint.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b9fe922..31930f9 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -145,9 +145,20 @@ jobs: echo "## Issues Found" >> $GITHUB_STEP_SUMMARY echo "| File | Line | Column | Severity | Check | Message |" >> $GITHUB_STEP_SUMMARY echo "|------|------|--------|----------|-------|---------|" >> $GITHUB_STEP_SUMMARY - jq -r '.[] | .path as $file | .offenses[] | "| \($file) | \(.start_row) | \(.start_column) | \(.severity) | \(.check) | \(.message) |"' ${{ env.LOGS_DIR }}/platformos-check.json >> $GITHUB_STEP_SUMMARY 2>/dev/null || echo "| N/A | N/A | N/A | N/A | N/A | Failed to parse JSON output |" >> $GITHUB_STEP_SUMMARY + + # Try to parse and add issues + if jq -r '.[] | .path as $file | .offenses[] | "| \($file) | \(.start_row) | \(.start_column) | \(.severity) | \(.check) | \(.message) |"' ${{ env.LOGS_DIR }}/platformos-check.json >> $GITHUB_STEP_SUMMARY 2>&1; then + echo "Issues table generated successfully" + else + echo "| N/A | N/A | N/A | N/A | N/A | Failed to parse JSON - see logs for details |" >> $GITHUB_STEP_SUMMARY + echo "JSON parse error. File contents:" >> $GITHUB_STEP_SUMMARY + echo '```json' >> $GITHUB_STEP_SUMMARY + cat ${{ env.LOGS_DIR }}/platformos-check.json >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + fi else echo "## No output file found" >> $GITHUB_STEP_SUMMARY + echo "Expected location: ${{ env.LOGS_DIR }}/platformos-check.json" >> $GITHUB_STEP_SUMMARY fi env: RESULT_ICON: ${{ steps.run_check.outcome == 'success' && ':white_check_mark:' || ':x:' }} From b82bea4c97c1ae1affb069361350e92e57f5b31a Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sat, 21 Feb 2026 22:04:33 +0100 Subject: [PATCH 22/27] test: add comment to one of the liquid files to trigger test workflow --- .../user/public/lib/queries/role_permissions/permissions.liquid | 1 + 1 file changed, 1 insertion(+) diff --git a/pos-module-user/modules/user/public/lib/queries/role_permissions/permissions.liquid b/pos-module-user/modules/user/public/lib/queries/role_permissions/permissions.liquid index 5557577..7004539 100644 --- a/pos-module-user/modules/user/public/lib/queries/role_permissions/permissions.liquid +++ b/pos-module-user/modules/user/public/lib/queries/role_permissions/permissions.liquid @@ -1,3 +1,4 @@ +{% comment %}This comment is here to trigger GH Actions to test workflows{% endcomment %} {% parse_json data %} { {% if context.constants.USER_DEFAULT_ROLE != blank %} From e5eee6149688b5de67a6fd91eead6c6399c6f0b3 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sat, 21 Feb 2026 23:20:25 +0100 Subject: [PATCH 23/27] fix: prevent parallel CI instance reservations in E2E workflow Add max-parallel: 1 to reserve-and-deploy, test, and cleanup jobs to ensure sequential execution when multiple modules change. This prevents "Instance already reserved" errors that occurred when matrix jobs attempted to reserve the same CI instance concurrently. Trade-off: Multiple module changes will now run sequentially rather than in parallel, increasing total runtime but ensuring reliability. --- .github/workflows/test-e2e.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 4745434..631bc87 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -85,6 +85,7 @@ jobs: strategy: matrix: include: ${{ fromJSON(needs.detect-changes.outputs.changed-modules) }} + max-parallel: 1 fail-fast: false timeout-minutes: 15 env: @@ -137,6 +138,7 @@ jobs: strategy: matrix: include: ${{ fromJSON(needs.detect-changes.outputs.changed-modules) }} + max-parallel: 1 fail-fast: false timeout-minutes: 35 env: @@ -166,6 +168,7 @@ jobs: strategy: matrix: include: ${{ fromJSON(needs.detect-changes.outputs.changed-modules) }} + max-parallel: 1 fail-fast: false steps: - name: Release CI instance From d107831d36512b0db9bf91a8b8e3084df52b23ef Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sat, 21 Feb 2026 23:41:18 +0100 Subject: [PATCH 24/27] fix: restructure E2E workflow to prevent instance reservation conflicts Combine reserve-and-deploy, test, and cleanup jobs into a single test-e2e job to ensure each module completes its full lifecycle before the next begins. Previously, when multiple modules changed, the workflow would: 1. Reserve instances for all modules (in sequence) 2. Run tests for all modules 3. Release all instances This caused "Instance already reserved" errors because Module 2 would attempt to reserve before Module 1 released its instance. Now, with max-parallel: 1 and a unified job, each module: 1. Reserves instance 2. Deploys 3. Tests 4. Releases instance (always, even on failure) Before the next module starts. This ensures the instance is available for subsequent modules while maintaining test isolation. --- .github/workflows/test-e2e.yml | 47 +++++++--------------------------- 1 file changed, 9 insertions(+), 38 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 631bc87..ffa02f5 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -77,7 +77,7 @@ jobs: echo "matrix=$modules" >> $GITHUB_OUTPUT echo "Changed modules matrix: $modules" - reserve-and-deploy: + test-e2e: needs: detect-changes if: needs.detect-changes.outputs.changed-modules != '[]' runs-on: ubuntu-latest @@ -87,13 +87,15 @@ jobs: include: ${{ fromJSON(needs.detect-changes.outputs.changed-modules) }} max-parallel: 1 fail-fast: false - timeout-minutes: 15 + timeout-minutes: 60 env: CI: true MPKIT_EMAIL: ${{ secrets.MPKIT_EMAIL }} NPM_CONFIG_CACHE: ${{ github.workspace }}/.npm - outputs: - mpkit-url: ${{ steps.reserve.outputs.mpkit-url }} + E2E_TEST_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }} + HTML_ATTACHMENTS_BASE_URL: ${{ vars.HTML_ATTACHMENTS_BASE_URL }} + TEST_REPORT_MPKIT_URL: ${{ vars.TEST_REPORT_MPKIT_URL }} + TEST_REPORT_MPKIT_TOKEN: ${{ secrets.TEST_REPORT_MPKIT_TOKEN }} steps: - name: Reserve CI instance id: reserve @@ -130,48 +132,17 @@ jobs: set -eu ${{ matrix.deploy-script }} - test: - needs: ["detect-changes", "reserve-and-deploy"] - if: ${{ success() && needs.detect-changes.outputs.changed-modules != '[]' }} - runs-on: ubuntu-latest - container: ${{ vars.PW_CONTAINER }} - strategy: - matrix: - include: ${{ fromJSON(needs.detect-changes.outputs.changed-modules) }} - max-parallel: 1 - fail-fast: false - timeout-minutes: 35 - env: - CI: true - E2E_TEST_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }} - MPKIT_EMAIL: ${{ secrets.MPKIT_EMAIL }} - MPKIT_URL: ${{ needs.reserve-and-deploy.outputs.mpkit-url }} - NPM_CONFIG_CACHE: ${{ github.workspace }}/.npm - HTML_ATTACHMENTS_BASE_URL: ${{ vars.HTML_ATTACHMENTS_BASE_URL }} - TEST_REPORT_MPKIT_URL: ${{ vars.TEST_REPORT_MPKIT_URL }} - TEST_REPORT_MPKIT_TOKEN: ${{ secrets.TEST_REPORT_MPKIT_TOKEN }} - steps: - - uses: actions/checkout@v4 - - name: Run Playwright tests shell: sh + env: + MPKIT_URL: ${{ steps.reserve.outputs.mpkit-url }} working-directory: ${{ matrix.path }} run: | set -eu ${{ matrix.test-commands }} - cleanup: - if: ${{ always() && needs.detect-changes.outputs.changed-modules != '[]' }} - needs: ["detect-changes", "reserve-and-deploy", "test"] - runs-on: ubuntu-latest - container: alpine:3.20 - strategy: - matrix: - include: ${{ fromJSON(needs.detect-changes.outputs.changed-modules) }} - max-parallel: 1 - fail-fast: false - steps: - name: Release CI instance + if: always() uses: Platform-OS/ci-repository-reserve-instance-url@0.1.2 with: method: release From 940c8aef34a4ee91756edabd1df1663454844565 Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sun, 22 Feb 2026 00:23:10 +0100 Subject: [PATCH 25/27] fix: resolve E2E workflow instance conflicts and Playwright version issues Fix chat module to use container's pre-installed Playwright - Change package.json script from "npx playwright test" to "playwright test" - Prevents version conflicts between container's Playwright and package.json - Matches user module pattern which was working correctly --- pos-module-chat/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pos-module-chat/package.json b/pos-module-chat/package.json index e21e80e..768f295 100644 --- a/pos-module-chat/package.json +++ b/pos-module-chat/package.json @@ -1,6 +1,6 @@ { "scripts": { - "pw-tests": "npx playwright test tests --project=test --reporter=list", + "pw-tests": "playwright test tests --project=test --reporter=list", "test": "playwright test", "install: playwright": "npx playwright install" }, From ce7fc3238f99754b42aebdfcf795462b71b8f69f Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sun, 22 Feb 2026 00:30:08 +0100 Subject: [PATCH 26/27] temporarily disable automatic triggers for test.yml --- .github/workflows/test.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1de56fb..9be6ffe 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,12 +1,12 @@ name: Module tests on: - pull_request: - branches: [ master ] - paths-ignore: - - "**/README.md" - push: - paths-ignore: - - "**/README.md" + # pull_request: + # branches: [ master ] + # paths-ignore: + # - "**/README.md" + # push: + # paths-ignore: + # - "**/README.md" workflow_dispatch: jobs: From 8b9eae25cfbe8ad913ca4060cede09445f458a7a Mon Sep 17 00:00:00 2001 From: Rafal Krysiak Date: Sun, 22 Feb 2026 00:31:04 +0100 Subject: [PATCH 27/27] remove the comments used to trigger test workflows --- .../user/public/lib/queries/role_permissions/permissions.liquid | 1 - .../user/public/lib/queries/role_permissions/permissions.liquid | 1 - 2 files changed, 2 deletions(-) diff --git a/pos-module-chat/app/modules/user/public/lib/queries/role_permissions/permissions.liquid b/pos-module-chat/app/modules/user/public/lib/queries/role_permissions/permissions.liquid index d98e47a..14a245a 100644 --- a/pos-module-chat/app/modules/user/public/lib/queries/role_permissions/permissions.liquid +++ b/pos-module-chat/app/modules/user/public/lib/queries/role_permissions/permissions.liquid @@ -1,4 +1,3 @@ -{% comment %}This comment is here to trigger GH Actions to test workflows{% endcomment %} {% parse_json data %} { {% if context.constants.USER_DEFAULT_ROLE != blank %} diff --git a/pos-module-user/modules/user/public/lib/queries/role_permissions/permissions.liquid b/pos-module-user/modules/user/public/lib/queries/role_permissions/permissions.liquid index 7004539..5557577 100644 --- a/pos-module-user/modules/user/public/lib/queries/role_permissions/permissions.liquid +++ b/pos-module-user/modules/user/public/lib/queries/role_permissions/permissions.liquid @@ -1,4 +1,3 @@ -{% comment %}This comment is here to trigger GH Actions to test workflows{% endcomment %} {% parse_json data %} { {% if context.constants.USER_DEFAULT_ROLE != blank %}