fix(#10209): harden xsltproc against XML external entity attacks #28880
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build and test | |
| on: [push, pull_request] | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| env: | |
| COUCH_URL: http://admin:pass@localhost:5984/medic-test | |
| BUILDS_SERVER: ${{ secrets.AUTH_MARKET_URL && '_couch/builds_testing' || '_couch/builds_external' }} | |
| STAGING_SERVER: ${{ secrets.AUTH_MARKET_URL && '_couch/builds_4' || '_couch/builds_external' }} | |
| MARKET_URL_READ: 'https://staging.dev.medicmobile.org' | |
| MARKET_URL: ${{ secrets.AUTH_MARKET_URL || 'https://staging.dev.medicmobile.org' }} | |
| INTERNAL_CONTRIBUTOR: ${{ secrets.AUTH_MARKET_URL && 'true' }} | |
| DOCKERHUB_USERNAME: 'dockermedic' | |
| ECR_REPO: '720541322708.dkr.ecr.eu-west-2.amazonaws.com/medic' | |
| ECR_PUBLIC_REPO: 'public.ecr.aws/medic' | |
| COUCHDB_LOG_LEVEL: 'debug' | |
| LOG_LEVEL: 'debug' | |
| TAG: ${{ (github.ref_type == 'tag' && github.ref_name) || '' }} | |
| BRANCH: ${{ github.head_ref || github.ref_name }} | |
| BUILD_NUMBER: ${{ github.run_id }} | |
| NODE_VERSION: '22.15' | |
| AFRICAS_TALKING_SANDBOX_API_KEY: ${{ secrets.AFRICAS_TALKING_SANDBOX_API_KEY }} | |
| jobs: | |
| build: | |
| name: Compile the app | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| permissions: | |
| contents: read | |
| pull-requests: write # for update-staging-url-placeholders action | |
| steps: | |
| - name: Install bats | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y bats | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 | |
| with: | |
| username: ${{ env.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| - name: Configure AWS credentials | |
| uses: aws-actions/configure-aws-credentials@7474bc4690e29a8392af63c5b98e7449536d5c3a # v4 | |
| with: | |
| aws-access-key-id: ${{ secrets.ECR_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ secrets.ECR_SECRET_ACCESS_KEY }} | |
| aws-region: eu-west-2 | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| - name: Login to Amazon ECR | |
| id: login-ecr | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| uses: aws-actions/amazon-ecr-login@f2e9fc6c2b355c1890b65e6f6f0e2ac3e6e22f78 # v2 | |
| with: | |
| mask-password: 'true' | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| with: | |
| persist-credentials: false | |
| - name: Use Node.js ${{ env.NODE_VERSION }} | |
| uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 | |
| with: | |
| node-version: ${{ env.NODE_VERSION }} | |
| - name: Set system ulimit | |
| uses: ./.github/actions/bump-system-ulimit | |
| - name: Create logs directory | |
| run: mkdir tests/logs | |
| - run: npm ci | |
| - name: Compile | |
| run: npm run ci-compile | |
| - name: Setup QEMU | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3 | |
| - name: Setup Buildx | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 | |
| - name: Publish for testing | |
| run: npm run publish-for-testing | |
| - name: Upload docker images as artifacts | |
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 | |
| with: | |
| name: cht-images | |
| path: images/ | |
| if: ${{ !env.INTERNAL_CONTRIBUTOR }} | |
| - name: Search-Replace PR Body | |
| if: ${{ env.INTERNAL_CONTRIBUTOR && github.event_name == 'pull_request' }} | |
| uses: ./.github/actions/update-staging-url-placeholders | |
| with: | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| config-tests: | |
| needs: build | |
| name: ${{ matrix.cmd }} | |
| # these tests fail on newer os. https://github.com/medic/cht-conf-test-harness/issues/279 | |
| runs-on: ubuntu-22.04 | |
| timeout-minutes: 60 | |
| permissions: | |
| contents: read | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cmd: ['test-config-covid-19', 'test-config-default', 'test-config-demo'] | |
| steps: | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| with: | |
| persist-credentials: false | |
| - name: Use Node.js ${{ env.NODE_VERSION }} | |
| uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 | |
| with: | |
| node-version: ${{ env.NODE_VERSION }} | |
| - run: | | |
| sudo apt-get update | |
| sudo apt-get install -y xsltproc | |
| - run: npm ci | |
| - name: Run Tests | |
| run: npm run ${{ matrix.cmd }} | |
| test-cht-form: | |
| needs: build | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| steps: | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| with: | |
| persist-credentials: false | |
| - name: Use Node.js ${{ env.NODE_VERSION }} | |
| uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 | |
| with: | |
| node-version: ${{ env.NODE_VERSION }} | |
| - run: | | |
| sudo apt-get update | |
| sudo apt-get install -y xsltproc | |
| - run: npm ci | |
| - name: Build cht-form Web Component | |
| run: npm run build-cht-form | |
| - name: Run Tests | |
| run: npm run integration-cht-form | |
| tests-k3d: | |
| needs: build | |
| name: ${{ matrix.cmd }} | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| permissions: | |
| contents: read | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cmd: ['ci-integration-all-k3d', 'ci-integration-sentinel-k3d'] | |
| steps: | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 | |
| with: | |
| username: ${{ env.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| - name: Configure AWS credentials | |
| uses: aws-actions/configure-aws-credentials@7474bc4690e29a8392af63c5b98e7449536d5c3a # v4 | |
| with: | |
| aws-access-key-id: ${{ secrets.ECR_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ secrets.ECR_SECRET_ACCESS_KEY }} | |
| aws-region: eu-west-2 | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| - name: Login to Amazon ECR | |
| id: login-ecr | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| uses: aws-actions/amazon-ecr-login@f2e9fc6c2b355c1890b65e6f6f0e2ac3e6e22f78 # v2 | |
| with: | |
| mask-password: 'true' | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| with: | |
| persist-credentials: false | |
| - name: Use Node.js ${{ env.NODE_VERSION }} | |
| uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 | |
| with: | |
| node-version: ${{ env.NODE_VERSION }} | |
| - name: Set system ulimit | |
| uses: ./.github/actions/bump-system-ulimit | |
| - name: Download docker images artifacts | |
| uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 | |
| with: | |
| name: cht-images | |
| path: images/ | |
| if: ${{ !env.INTERNAL_CONTRIBUTOR }} | |
| - name: Load docker images | |
| run: ls -1 *.tar | xargs --no-run-if-empty -L 1 docker load -i | |
| working-directory: images/ | |
| if: ${{ !env.INTERNAL_CONTRIBUTOR }} | |
| - run: mkdir tests/logs | |
| - run: npm install -g cht-conf | |
| - run: npm ci | |
| - name: Fix Docker 29 insecure registry handling | |
| run: | | |
| EXISTING=$(cat /etc/docker/daemon.json 2>/dev/null || echo '{}') | |
| echo "$EXISTING" | jq '. + {"features":{"containerd-snapshotter":false}}' | sudo tee /etc/docker/daemon.json | |
| sudo systemctl restart docker | |
| sleep 2 | |
| - name: Pre-pull registry image from Public ECR | |
| run: | | |
| docker pull public.ecr.aws/docker/library/registry:2 | |
| docker tag public.ecr.aws/docker/library/registry:2 registry:2 | |
| if: ${{ !env.INTERNAL_CONTRIBUTOR }} | |
| - uses: nolar/setup-k3d-k3s@62c9d1bd2bc843275c85d2e7dcd696edc1160eee # v1 | |
| - uses: azure/setup-helm@b7246b12e77f7134dc2d460a3d5bad15bbe29390 # v4.1.0 | |
| - uses: azure/setup-kubectl@776406bce94f63e41d621b960d78ee25c8b76ede # v4 | |
| - name: Run tests | |
| run: npm run ${{ matrix.cmd }} | |
| - name: Archive Results | |
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 | |
| with: | |
| name: ${{ matrix.cmd }} | |
| path: | | |
| allure-results | |
| allure-report | |
| tests/logs | |
| tests/results/ | |
| if: ${{ failure() }} | |
| translations: | |
| needs: build | |
| name: Lint translations | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| strategy: | |
| fail-fast: false | |
| steps: | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| with: | |
| persist-credentials: false | |
| - name: Use Node.js ${{ env.NODE_VERSION }} | |
| uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 | |
| with: | |
| node-version: ${{ env.NODE_VERSION }} | |
| - run: npm ci | |
| - run: npm run lint-translations | |
| build-generated-docs: | |
| needs: build | |
| name: Build generated docs | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 5 | |
| permissions: | |
| contents: read | |
| steps: | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| with: | |
| persist-credentials: false | |
| - name: Use Node.js ${{ env.NODE_VERSION }} | |
| uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 | |
| with: | |
| node-version: ${{ env.NODE_VERSION }} | |
| - run: npm ci | |
| - run: node scripts/build/cli npmCiModules | |
| - name: Build Documentation | |
| run: npm run build-documentation | |
| - name: Cache generated docs | |
| if: github.ref == 'refs/heads/master' | |
| uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 | |
| with: | |
| key: cht-datasource-docs | |
| path: ./shared-libs/cht-datasource/docs | |
| tests: | |
| needs: build | |
| name: ${{ matrix.cmd }}-${{ matrix.suite || '' }}${{ matrix.chrome-version == '107' && '-minimum-browser' || '' }} | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| permissions: | |
| contents: read | |
| env: | |
| CHROME_VERSION: ${{ matrix.chrome-version }} | |
| JOB_NAME: ${{ matrix.cmd }}-${{ matrix.suite || '' }}${{ matrix.chrome-version == '107' && '-minimum-browser' || '' }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| cmd: ['ci-integration-all', 'ci-integration-sentinel', 'ci-webdriver-default-mobile', 'wdio-performance'] | |
| chrome-version: ['107', 'latest'] | |
| suite: [all] | |
| include: | |
| - cmd: ci-webdriver-default | |
| suite: core | |
| chrome-version: 107 | |
| - cmd: ci-webdriver-default | |
| suite: core | |
| chrome-version: latest | |
| - cmd: ci-webdriver-default | |
| suite: data | |
| - cmd: ci-webdriver-default | |
| suite: enketo | |
| chrome-version: 107 | |
| - cmd: ci-webdriver-default | |
| suite: enketo | |
| chrome-version: latest | |
| - cmd: ci-webdriver-default | |
| suite: lowLevel | |
| - cmd: ci-webdriver-default | |
| suite: workflows_1 | |
| - cmd: ci-webdriver-default | |
| suite: workflows_2 | |
| exclude: # temporary until all suites run on Chrome 107 | |
| - cmd: ci-integration-all | |
| chrome-version: 107 | |
| - cmd: ci-integration-sentinel | |
| chrome-version: 107 | |
| - cmd: ci-webdriver-default-mobile | |
| chrome-version: 107 | |
| - cmd: wdio-performance | |
| chrome-version: 107 | |
| steps: | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 | |
| with: | |
| username: ${{ env.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| - name: Configure AWS credentials | |
| uses: aws-actions/configure-aws-credentials@7474bc4690e29a8392af63c5b98e7449536d5c3a # v4 | |
| with: | |
| aws-access-key-id: ${{ secrets.ECR_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ secrets.ECR_SECRET_ACCESS_KEY }} | |
| aws-region: eu-west-2 | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| - name: Login to Amazon ECR | |
| id: login-ecr | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| uses: aws-actions/amazon-ecr-login@f2e9fc6c2b355c1890b65e6f6f0e2ac3e6e22f78 # v2 | |
| with: | |
| mask-password: 'true' | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| with: | |
| persist-credentials: false | |
| - name: Use Node.js ${{ env.NODE_VERSION }} | |
| uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 | |
| with: | |
| node-version: ${{ env.NODE_VERSION }} | |
| - name: Download docker images artifacts | |
| uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 | |
| with: | |
| name: cht-images | |
| path: images/ | |
| if: ${{ !env.INTERNAL_CONTRIBUTOR }} | |
| - name: Load docker images | |
| run: ls -1 *.tar | xargs --no-run-if-empty -L 1 docker load -i | |
| working-directory: images/ | |
| if: ${{ !env.INTERNAL_CONTRIBUTOR }} | |
| - name: Set system ulimit | |
| uses: ./.github/actions/bump-system-ulimit | |
| - name: Create logs directory | |
| run: mkdir tests/logs | |
| - name: Install cht-conf | |
| run: npm install -g cht-conf | |
| - run: npm ci | |
| - name: Cache Chrome 107 Installer | |
| if: ${{ matrix.chrome-version == '107' }} | |
| id: cache-chrome | |
| uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 | |
| with: | |
| path: /tmp/chrome107 | |
| key: chrome107-${{ runner.os }}-107.0.5304.87 | |
| restore-keys: | | |
| chrome107-${{ runner.os }}- | |
| chrome107- | |
| - name: Download Chrome 107 | |
| if: ${{ matrix.chrome-version == '107' && steps.cache-chrome.outputs.cache-hit != 'true' }} | |
| run: | | |
| mkdir -p /tmp/chrome107 | |
| wget -O "/tmp/chrome107/google-chrome-stable_current_amd64.deb" https://mirror.cs.uchicago.edu/google-chrome/pool/main/g/google-chrome-stable/google-chrome-stable_107.0.5304.87-1_amd64.deb | |
| - name: Install Chrome 107 | |
| if: ${{ matrix.chrome-version == '107' }} | |
| run: | | |
| sudo dpkg -i "/tmp/chrome107/google-chrome-stable_current_amd64.deb" | |
| npm install chromedriver@^107.0.3 | |
| - name: Run tests ${{ matrix.cmd }}-${{ matrix.suite }} on Chrome ${{ matrix.chrome-version }} | |
| run: npm run ${{ matrix.cmd }} -- --suite=${{ matrix.suite }} | |
| - name: Archive Results | |
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 | |
| with: | |
| name: ${{ env.JOB_NAME }} | |
| path: | | |
| allure-results | |
| allure-report | |
| tests/logs | |
| tests/results/ | |
| if: ${{ failure() }} | |
| publish: | |
| needs: [tests, config-tests, test-cht-form, build-generated-docs] | |
| name: Publish branch build | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| permissions: | |
| contents: read | |
| if: ${{ github.event_name != 'pull_request' }} | |
| steps: | |
| - name: Install regctl | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| uses: regclient/actions/regctl-installer@df29323daedc1f78ee74b261bd8d849327cb4ff0 | |
| - name: Configure AWS credentials | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| uses: aws-actions/configure-aws-credentials@7474bc4690e29a8392af63c5b98e7449536d5c3a # v4 | |
| with: | |
| aws-access-key-id: ${{ secrets.ECR_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ secrets.ECR_SECRET_ACCESS_KEY }} | |
| aws-region: eu-west-2 | |
| - name: Login to Amazon ECR | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| id: login-ecr | |
| uses: aws-actions/amazon-ecr-login@f2e9fc6c2b355c1890b65e6f6f0e2ac3e6e22f78 # v2 | |
| with: | |
| mask-password: 'true' | |
| - name: Configure AWS credentials Public | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| uses: aws-actions/configure-aws-credentials@7474bc4690e29a8392af63c5b98e7449536d5c3a # v4 | |
| with: | |
| aws-access-key-id: ${{ secrets.ECR_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ secrets.ECR_SECRET_ACCESS_KEY }} | |
| aws-region: us-east-1 | |
| - name: Login to Public Amazon ECR | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| id: login-ecr-public | |
| uses: aws-actions/amazon-ecr-login@f2e9fc6c2b355c1890b65e6f6f0e2ac3e6e22f78 # v2 | |
| with: | |
| registry-type: public | |
| mask-password: 'true' | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| with: | |
| persist-credentials: false | |
| - name: Publish | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| run: | | |
| npm ci | |
| cd scripts/ci | |
| node ./publish.js | |
| node ./tag-docker-images.js | |
| - name: Restore generated docs | |
| if: github.ref == 'refs/heads/master' | |
| uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 | |
| with: | |
| key: cht-datasource-docs | |
| path: ./shared-libs/cht-datasource/docs | |
| fail-on-cache-miss: true | |
| - name: Publish docs to GH pages | |
| if: github.ref == 'refs/heads/master' | |
| uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4 | |
| with: | |
| personal_token: ${{ secrets.DEPLOY_TO_GITHUB_PAGES }} | |
| external_repository: medic/cht-datasource | |
| publish_dir: ./shared-libs/cht-datasource/docs | |
| user_name: medic-ci | |
| user_email: medic-ci@github | |
| publish_branch: main | |
| upgrade: | |
| needs: [publish] | |
| name: Upgrade from ${{ matrix.version }} | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 60 | |
| permissions: | |
| contents: read | |
| if: ${{ github.event_name != 'pull_request' }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| version: [ '4.2.4', 'latest' ] | |
| steps: | |
| - name: Configure AWS credentials Public | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| uses: aws-actions/configure-aws-credentials@7474bc4690e29a8392af63c5b98e7449536d5c3a # v4 | |
| with: | |
| aws-access-key-id: ${{ secrets.ECR_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ secrets.ECR_SECRET_ACCESS_KEY }} | |
| aws-region: us-east-1 | |
| - name: Login to Public Amazon ECR | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| id: login-ecr-public | |
| uses: aws-actions/amazon-ecr-login@f2e9fc6c2b355c1890b65e6f6f0e2ac3e6e22f78 # v2 | |
| with: | |
| registry-type: public | |
| mask-password: 'true' | |
| - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| with: | |
| persist-credentials: false | |
| - name: Set system ulimit | |
| uses: ./.github/actions/bump-system-ulimit | |
| - name: Set ENV | |
| run: | | |
| echo "BUILDS_SERVER=$STAGING_SERVER" >> $GITHUB_ENV | |
| echo "BASE_VERSION=${{ matrix.version }}" >> $GITHUB_ENV | |
| - run: npm ci | |
| - name: Create logs directory | |
| run: mkdir tests/logs | |
| - name: Upgrade | |
| if: ${{ env.INTERNAL_CONTRIBUTOR }} | |
| run: npm run upgrade-wdio | |
| - name: Archive Results | |
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 | |
| with: | |
| name: upgrade-${{ matrix.version }} | |
| path: | | |
| allure-results | |
| allure-report | |
| tests/logs | |
| tests/results/ | |
| if: ${{ failure() }} |