чт, 30 июл. 2026 г. в 17:40, Willy Tarreau <[email protected]>:
> Hi Ilya,
>
> On Wed, Jul 01, 2026 at 10:44:02PM +0200, Ilia Shipitsin wrote:
> > Convert the vtest setup action to a Node 24 JavaScript action.
> > Rename the action path from setup-vtest to vtest and update workflow
> references.
> > move VTest execution into the action so Run VTest steps call the action
> directly
> > move VTest failure logs and coredump reporting into the action post step
> > simplify workflow jobs by removing duplicated Show VTest results and
> Show coredumps steps
> > fix container path issues by using a workspace-relative vtest binary
> during reg-tests
>
> Care to explain the purpose ? I'm having a hard time decoding what is
> written above (missing punctuation and case makes it quite hard), and
> I don't understand if it tries to resolve an issue, improve something,
> clean something up, simplify something, perform some needed code
> maintenance etc. It would really help reviews to have more info, because
> I think that for most readers the question remains "I'm not sure whether
> I'm supposed to be authoritative on that", and that's left for someone
> else to deal with :-(
>
>
Convert vtest setup action from composite action to javascript action
Rationale
While a composite action can combine multiple steps into a reusable
imported action,
it cannot execute steps after the entire job has completed.
The vtest job is typically followed by several post-processing steps, such
as analyzing the test
results and examining core dumps. Previously, these post-processing steps
had to be duplicated
across multiple workflows. In contrast, a JavaScript action can implement
this functionality
using post actions, allowing analysis logic to run automatically after the
job finishes.
> Thanks!
> Willy
>
> > ---
> > .github/actions/setup-vtest/action.yml | 49 ---------------
> > .github/actions/vtest/action.yml | 11 ++++
> > .github/actions/vtest/dist/main.js | 83 ++++++++++++++++++++++++++
> > .github/actions/vtest/dist/post.js | 54 +++++++++++++++++
> > .github/workflows/aws-lc.yml | 28 +--------
> > .github/workflows/fedora-rawhide.yml | 13 +---
> > .github/workflows/openssl-ech.yml | 33 +---------
> > .github/workflows/openssl-master.yml | 33 +---------
> > .github/workflows/quictls.yml | 28 +--------
> > .github/workflows/vtest.yml | 27 +--------
> > .github/workflows/wolfssl.yml | 28 +--------
> > 11 files changed, 155 insertions(+), 232 deletions(-)
> > delete mode 100644 .github/actions/setup-vtest/action.yml
> > create mode 100644 .github/actions/vtest/action.yml
> > create mode 100644 .github/actions/vtest/dist/main.js
> > create mode 100644 .github/actions/vtest/dist/post.js
> >
> > diff --git a/.github/actions/setup-vtest/action.yml
> b/.github/actions/setup-vtest/action.yml
> > deleted file mode 100644
> > index c6071b473..000000000
> > --- a/.github/actions/setup-vtest/action.yml
> > +++ /dev/null
> > @@ -1,49 +0,0 @@
> > -name: 'setup VTest'
> > -description: 'ssss'
> > -
> > -runs:
> > - using: "composite"
> > - steps:
> > -
> > - - name: Setup coredumps
> > - if: ${{ runner.os == 'Linux' }}
> > - shell: sh
> > - run: |
> > - sudo mkdir -p /tmp/core
> > - sudo sysctl fs.suid_dumpable=1
> > - sudo sysctl kernel.core_pattern=/tmp/core/core.%h.%e.%t
> > -
> > - - name: Setup ulimit for core dumps
> > - shell: sh
> > - run: |
> > - # This is required for macOS which does not actually allow to
> increase
> > - # the '-n' soft limit to the hard limit, thus failing to run.
> > - ulimit -n 65536
> > - ulimit -c unlimited
> > -
> > - - name: Get VTest latest commit SHA
> > - id: vtest-sha
> > - shell: sh
> > - run: |
> > - echo "sha=$(git ls-remote
> https://code.vinyl-cache.org/vtest/VTest2 HEAD | cut -f1)" >>
> $GITHUB_OUTPUT
> > -
> > - - name: Cache VTest
> > - id: cache-vtest
> > - uses: actions/cache@v5
> > - with:
> > - path: ${{ github.workspace }}/vtest
> > - key: vtest-${{ runner.os }}-${{ runner.arch }}-${{
> steps.vtest-sha.outputs.sha }}
> > -
> > - - name: Install VTest
> > - if: ${{ steps.cache-vtest.outputs.cache-hit != 'true' }}
> > - shell: sh
> > - run: |
> > - DESTDIR=${{ github.workspace }}/vtest scripts/build-vtest.sh
> > -
> > - - name: Install problem matcher for VTest
> > - shell: sh
> > - # This allows one to more easily see which tests fail.
> > - run: echo "::add-matcher::.github/vtest.json"
> > -
> > -
> > -
> > diff --git a/.github/actions/vtest/action.yml
> b/.github/actions/vtest/action.yml
> > new file mode 100644
> > index 000000000..2ebc8eae1
> > --- /dev/null
> > +++ b/.github/actions/vtest/action.yml
> > @@ -0,0 +1,11 @@
> > +name: vtest
> > +description: Setup VTest and publish failing VTest logs automatically
> in a post step.
> > +
> > +runs:
> > + using: node24
> > + main: dist/main.js
> > + post: dist/post.js
> > + post-if: failure()
> > +
> > +
> > +
> > diff --git a/.github/actions/vtest/dist/main.js
> b/.github/actions/vtest/dist/main.js
> > new file mode 100644
> > index 000000000..f797a36df
> > --- /dev/null
> > +++ b/.github/actions/vtest/dist/main.js
> > @@ -0,0 +1,83 @@
> > +const { execSync } = require('child_process');
> > +const fs = require('fs');
> > +const path = require('path');
> > +
> > +function run(command, options = {}) {
> > + const { ignoreError = false, cwd = process.cwd() } = options;
> > +
> > + try {
> > + execSync(command, {
> > + cwd,
> > + stdio: 'inherit',
> > + shell: '/bin/sh'
> > + });
> > + } catch (error) {
> > + if (!ignoreError) {
> > + throw error;
> > + }
> > + }
> > +}
> > +
> > +function setupCoreDumps() {
> > + if (process.platform !== 'linux') {
> > + return;
> > + }
> > +
> > + run('sudo mkdir -p /tmp/core');
> > + run('sudo sysctl fs.suid_dumpable=1');
> > + run('sudo sysctl kernel.core_pattern=/tmp/core/core.%h.%e.%t');
> > +}
> > +
> > +function setupUlimit() {
> > + if (process.platform === 'win32') {
> > + return;
> > + }
> > +
> > + run('ulimit -n 65536; ulimit -c unlimited');
> > +}
> > +
> > +function installVtest(workspace) {
> > + const vtestBin = path.join(workspace, 'vtest', 'vtest');
> > + if (fs.existsSync(vtestBin)) {
> > + return;
> > + }
> > +
> > + run(`DESTDIR="${path.join(workspace, 'vtest')}"
> scripts/build-vtest.sh`, { cwd: workspace });
> > +}
> > +
> > +function addMatcher() {
> > + // This allows one to more easily see which tests fail.
> > + process.stdout.write('::add-matcher::.github/vtest.json\n');
> > +}
> > +
> > +function shellQuote(value) {
> > + return `'${String(value).replace(/'/g, `'"'"'`)}'`;
> > +}
> > +
> > +function runRegtests(workspace) {
> > + const vtestProgram = './vtest/vtest';
> > + const regtestsTypes = 'default,bug,devel';
> > +
> > + run(
> > + `make reg-tests VTEST_PROGRAM=${shellQuote(vtestProgram)}
> REGTESTS_TYPES=${shellQuote(regtestsTypes)}`,
> > + { cwd: workspace }
> > + );
> > +}
> > +
> > +function main() {
> > + const workspace = process.env.GITHUB_WORKSPACE || process.cwd();
> > +
> > + setupCoreDumps();
> > + setupUlimit();
> > + installVtest(workspace);
> > + addMatcher();
> > + runRegtests(workspace);
> > +}
> > +
> > +try {
> > + main();
> > +} catch (error) {
> > + const message = error && error.message ? error.message :
> String(error);
> > + process.stdout.write(`::error::vtest action failed: ${message}\n`);
> > + process.exit(1);
> > +}
> > diff --git a/.github/actions/vtest/dist/post.js
> b/.github/actions/vtest/dist/post.js
> > new file mode 100644
> > index 000000000..3699c42a2
> > --- /dev/null
> > +++ b/.github/actions/vtest/dist/post.js
> > @@ -0,0 +1,54 @@
> > +const { execSync } = require('child_process');
> > +
> > +function run(command) {
> > + execSync(command, {
> > + stdio: 'inherit',
> > + shell: '/bin/sh'
> > + });
> > +}
> > +
> > +function showVtestLogs() {
> > + const command = [
> > + 'for folder in ${TMPDIR:-/tmp}/haregtests-*/vtc.*; do',
> > + ' if [ ! -f "$folder/INFO" ] && [ ! -f "$folder/LOG" ]; then',
> > + ' continue',
> > + ' fi',
> > + ' printf "::group::"',
> > + ' [ -f "$folder/INFO" ] && cat "$folder/INFO"',
> > + ' [ -f "$folder/LOG" ] && cat "$folder/LOG"',
> > + ' echo "::endgroup::"',
> > + 'done'
> > + ].join('\n');
> > +
> > + run(command);
> > +}
> > +
> > +function showCoreDumps() {
> > + const command = [
> > + 'HAPROXY_BIN=./haproxy',
> > + 'for file in /tmp/core/core.* /tmp/core.*; do',
> > + ' [ -f "$file" ] || continue',
> > + ' printf "::group::"',
> > + ' gdb -ex "thread apply all bt full" "$HAPROXY_BIN" "$file" ||
> true',
> > + ' echo "::endgroup::"',
> > + 'done'
> > + ].join('\n');
> > +
> > + run(command);
> > +}
> > +
> > +function main() {
> > + if (process.platform === 'win32') {
> > + return;
> > + }
> > +
> > + showVtestLogs();
> > + showCoreDumps();
> > +}
> > +
> > +try {
> > + main();
> > +} catch (error) {
> > + const message = error && error.message ? error.message :
> String(error);
> > + process.stdout.write(`::warning::vtest post step could not show VTest
> logs: ${message}\n`);
> > +}
> > diff --git a/.github/workflows/aws-lc.yml b/.github/workflows/aws-lc.yml
> > index e239fa94f..8509447d9 100644
> > --- a/.github/workflows/aws-lc.yml
> > +++ b/.github/workflows/aws-lc.yml
> > @@ -55,39 +55,13 @@ jobs:
> > ldd $(which haproxy)
> > haproxy -vv
> > echo "version=$(haproxy -vq)" >> $GITHUB_OUTPUT
> > - - uses: ./.github/actions/setup-vtest
> > - name: Run VTest for HAProxy
> > id: vtest
> > - run: |
> > - make reg-tests VTEST_PROGRAM=${{ github.workspace
> }}/vtest/vtest REGTESTS_TYPES=default,bug,devel
> > + uses: ./.github/actions/vtest
> > - name: Run Unit tests
> > id: unittests
> > run: |
> > make unit-tests
> > - - name: Show VTest results
> > - if: ${{ failure() && steps.vtest.outcome == 'failure' }}
> > - run: |
> > - for folder in ${TMPDIR:-/tmp}/haregtests-*/vtc.*; do
> > - printf "::group::"
> > - cat $folder/INFO
> > - cat $folder/LOG
> > - echo "::endgroup::"
> > - done
> > - exit 1
> > - - name: Show coredumps
> > - if: ${{ failure() && steps.vtest.outcome == 'failure' }}
> > - run: |
> > - failed=false
> > - shopt -s nullglob
> > - for file in /tmp/core.*; do
> > - failed=true
> > - printf "::group::"
> > - gdb -ex 'thread apply all bt full' ./haproxy $file
> > - echo "::endgroup::"
> > - done
> > - if [ "$failed" = true ]; then
> > - exit 1;
> > - fi
> > - name: Show Unit-Tests results
> > if: ${{ failure() && steps.unittests.outcome == 'failure' }}
> > run: |
> > diff --git a/.github/workflows/fedora-rawhide.yml
> b/.github/workflows/fedora-rawhide.yml
> > index 7b8c9a3af..52f145e3f 100644
> > --- a/.github/workflows/fedora-rawhide.yml
> > +++ b/.github/workflows/fedora-rawhide.yml
> > @@ -31,7 +31,6 @@ jobs:
> > run: |
> > dnf -y install awk diffutils git zlib-devel pcre2-devel
> 'perl(FindBin)' perl-IPC-Cmd 'perl(File::Copy)' 'perl(File::Compare)'
> lua-devel socat findutils systemd-devel clang openssl-devel.x86_64 procps-ng
> > dnf -y install 'perl(FindBin)' 'perl(File::Compare)'
> perl-IPC-Cmd 'perl(File::Copy)' glibc-devel.i686 lua-devel.i686
> lua-devel.x86_64 systemd-devel.i686 zlib-ng-compat-devel.i686
> libatomic.i686 openssl-devel.i686 pcre2-devel.i686
> > - - uses: ./.github/actions/setup-vtest
> > - name: Compile HAProxy with ${{ matrix.platform.cc }}
> > run: |
> > make -j3 CC=${{ matrix.platform.cc }} V=1 ERR=1
> TARGET=linux-glibc DEBUG="-DDEBUG_POOL_INTEGRITY -DDEBUG_UNIT" USE_PROMEX=1
> USE_OPENSSL=1 USE_QUIC=1 USE_ZLIB=1 USE_PCRE2=1 USE_PCRE2_JIT=1 USE_LUA=1
> ADDLIB="${{ matrix.platform.ADDLIB_ATOMIC }}" ARCH_FLAGS="${{
> matrix.platform.ARCH_FLAGS }}"
> > @@ -53,17 +52,7 @@ jobs:
> > update-crypto-policies
> > - name: Run VTest for HAProxy ${{
> steps.show-version.outputs.version }}
> > id: vtest
> > - run: |
> > - make reg-tests VTEST_PROGRAM=${{ github.workspace
> }}/vtest/vtest REGTESTS_TYPES=default,bug,devel
> > - - name: Show VTest results
> > - if: ${{ failure() && steps.vtest.outcome == 'failure' }}
> > - run: |
> > - for folder in ${TMPDIR:-/tmp}/haregtests-*/vtc.*; do
> > - printf "::group::"
> > - cat $folder/INFO
> > - cat $folder/LOG
> > - echo "::endgroup::"
> > - done
> > + uses: ./.github/actions/vtest
> > - name: Run Unit tests
> > id: unittests
> > run: |
> > diff --git a/.github/workflows/openssl-ech.yml
> b/.github/workflows/openssl-ech.yml
> > index 0ee3a2273..8538eb744 100644
> > --- a/.github/workflows/openssl-ech.yml
> > +++ b/.github/workflows/openssl-ech.yml
> > @@ -19,7 +19,6 @@ jobs:
> > sudo apt-get update -o Acquire::Languages=none -o
> Acquire::Translation=none
> > sudo apt-get --no-install-recommends -y install socat gdb
> > sudo apt-get --no-install-recommends -y install libpsl-dev
> > - - uses: ./.github/actions/setup-vtest
> > - name: Install OpenSSL+ECH
> > run: env OPENSSL_VERSION="git-feature/ech" GIT_TYPE="branch"
> scripts/build-ssl.sh
> > - name: Install curl+ECH
> > @@ -43,38 +42,8 @@ jobs:
> > run: echo "::add-matcher::.github/vtest.json"
> > - name: Run VTest for HAProxy
> > id: vtest
> > - run: |
> > - # This is required for macOS which does not actually allow to
> increase
> > - # the '-n' soft limit to the hard limit, thus failing to run.
> > - ulimit -n 65536
> > - # allow to catch coredumps
> > - ulimit -c unlimited
> > - make reg-tests VTEST_PROGRAM=${{ github.workspace
> }}/vtest/vtest REGTESTS_TYPES=default,bug,devel
> > - - name: Show VTest results
> > - if: ${{ failure() && steps.vtest.outcome == 'failure' }}
> > - run: |
> > - for folder in ${TMPDIR:-/tmp}/haregtests-*/vtc.*; do
> > - printf "::group::"
> > - cat $folder/INFO
> > - cat $folder/LOG
> > - echo "::endgroup::"
> > - done
> > - exit 1
> > + uses: ./.github/actions/vtest
> > - name: Run Unit tests
> > id: unittests
> > run: |
> > make unit-tests
> > - - name: Show coredumps
> > - if: ${{ failure() && steps.vtest.outcome == 'failure' }}
> > - run: |
> > - failed=false
> > - shopt -s nullglob
> > - for file in /tmp/core.*; do
> > - failed=true
> > - printf "::group::"
> > - gdb -ex 'thread apply all bt full' ./haproxy $file
> > - echo "::endgroup::"
> > - done
> > - if [ "$failed" = true ]; then
> > - exit 1;
> > - fi
> > diff --git a/.github/workflows/openssl-master.yml
> b/.github/workflows/openssl-master.yml
> > index ab9d1ca38..b63b44a20 100644
> > --- a/.github/workflows/openssl-master.yml
> > +++ b/.github/workflows/openssl-master.yml
> > @@ -19,7 +19,6 @@ jobs:
> > sudo apt-get update -o Acquire::Languages=none -o
> Acquire::Translation=none
> > sudo apt-get --no-install-recommends -y install socat gdb
> > sudo apt-get --no-install-recommends -y install libpsl-dev
> > - - uses: ./.github/actions/setup-vtest
> > - name: Install OpenSSL master
> > run: env OPENSSL_VERSION="git-master" GIT_TYPE="branch"
> scripts/build-ssl.sh
> > - name: Compile HAProxy
> > @@ -40,38 +39,8 @@ jobs:
> > run: echo "::add-matcher::.github/vtest.json"
> > - name: Run VTest for HAProxy
> > id: vtest
> > - run: |
> > - # This is required for macOS which does not actually allow to
> increase
> > - # the '-n' soft limit to the hard limit, thus failing to run.
> > - ulimit -n 65536
> > - # allow to catch coredumps
> > - ulimit -c unlimited
> > - make reg-tests VTEST_PROGRAM=${{ github.workspace
> }}/vtest/vtest REGTESTS_TYPES=default,bug,devel
> > - - name: Show VTest results
> > - if: ${{ failure() && steps.vtest.outcome == 'failure' }}
> > - run: |
> > - for folder in ${TMPDIR:-/tmp}/haregtests-*/vtc.*; do
> > - printf "::group::"
> > - cat $folder/INFO
> > - cat $folder/LOG
> > - echo "::endgroup::"
> > - done
> > - exit 1
> > + uses: ./.github/actions/vtest
> > - name: Run Unit tests
> > id: unittests
> > run: |
> > make unit-tests
> > - - name: Show coredumps
> > - if: ${{ failure() && steps.vtest.outcome == 'failure' }}
> > - run: |
> > - failed=false
> > - shopt -s nullglob
> > - for file in /tmp/core.*; do
> > - failed=true
> > - printf "::group::"
> > - gdb -ex 'thread apply all bt full' ./haproxy $file
> > - echo "::endgroup::"
> > - done
> > - if [ "$failed" = true ]; then
> > - exit 1;
> > - fi
> > diff --git a/.github/workflows/quictls.yml
> b/.github/workflows/quictls.yml
> > index b662b7347..32825ea36 100644
> > --- a/.github/workflows/quictls.yml
> > +++ b/.github/workflows/quictls.yml
> > @@ -39,36 +39,10 @@ jobs:
> > ldd $(which haproxy)
> > haproxy -vv
> > echo "version=$(haproxy -vq)" >> $GITHUB_OUTPUT
> > - - uses: ./.github/actions/setup-vtest
> > - name: Run VTest for HAProxy
> > id: vtest
> > - run: |
> > - make reg-tests VTEST_PROGRAM=${{ github.workspace
> }}/vtest/vtest REGTESTS_TYPES=default,bug,devel
> > - - name: Show VTest results
> > - if: ${{ failure() && steps.vtest.outcome == 'failure' }}
> > - run: |
> > - for folder in ${TMPDIR:-/tmp}/haregtests-*/vtc.*; do
> > - printf "::group::"
> > - cat $folder/INFO
> > - cat $folder/LOG
> > - echo "::endgroup::"
> > - done
> > - exit 1
> > + uses: ./.github/actions/vtest
> > - name: Run Unit tests
> > id: unittests
> > run: |
> > make unit-tests
> > - - name: Show coredumps
> > - if: ${{ failure() && steps.vtest.outcome == 'failure' }}
> > - run: |
> > - failed=false
> > - shopt -s nullglob
> > - for file in /tmp/core.*; do
> > - failed=true
> > - printf "::group::"
> > - gdb -ex 'thread apply all bt full' ./haproxy $file
> > - echo "::endgroup::"
> > - done
> > - if [ "$failed" = true ]; then
> > - exit 1;
> > - fi
> > diff --git a/.github/workflows/vtest.yml b/.github/workflows/vtest.yml
> > index fd546d5a7..1b242eaba 100644
> > --- a/.github/workflows/vtest.yml
> > +++ b/.github/workflows/vtest.yml
> > @@ -88,7 +88,6 @@ jobs:
> > run: |
> > brew install socat
> > brew install lua
> > - - uses: ./.github/actions/setup-vtest
> > - name: Install SSL ${{ matrix.ssl }}
> > if: ${{ matrix.ssl && matrix.ssl != 'stock' &&
> steps.cache_ssl.outputs.cache-hit != 'true' }}
> > run: env ${{ matrix.ssl }} scripts/build-ssl.sh
> > @@ -127,18 +126,7 @@ jobs:
> > echo "version=$(haproxy -vq)" >> $GITHUB_OUTPUT
> > - name: Run VTest for HAProxy ${{
> steps.show-version.outputs.version }}
> > id: vtest
> > - run: |
> > - make reg-tests VTEST_PROGRAM=${{ github.workspace
> }}/vtest/vtest REGTESTS_TYPES=default,bug,devel
> > - - name: Show VTest results
> > - if: ${{ failure() && steps.vtest.outcome == 'failure' }}
> > - run: |
> > - for folder in ${TMPDIR:-/tmp}/haregtests-*/vtc.*; do
> > - printf "::group::"
> > - cat $folder/INFO
> > - cat $folder/LOG
> > - echo "::endgroup::"
> > - done
> > - exit 1
> > + uses: ./.github/actions/vtest
> > - name: Run Unit tests
> > id: unittests
> > run: |
> > @@ -152,16 +140,3 @@ jobs:
> > echo "::endgroup::"
> > done
> > exit 1
> > - - name: Show coredumps
> > - if: ${{ failure() && steps.vtest.outcome == 'failure' }}
> > - run: |
> > - failed=false
> > - for file in /tmp/core/core.*; do
> > - failed=true
> > - printf "::group::"
> > - gdb -ex 'thread apply all bt full' ./haproxy $file
> > - echo "::endgroup::"
> > - done
> > - if [ "$failed" = true ]; then
> > - exit 1;
> > - fi
> > diff --git a/.github/workflows/wolfssl.yml
> b/.github/workflows/wolfssl.yml
> > index bf0405c41..ec8e6f4ac 100644
> > --- a/.github/workflows/wolfssl.yml
> > +++ b/.github/workflows/wolfssl.yml
> > @@ -35,39 +35,13 @@ jobs:
> > ldd $(which haproxy)
> > haproxy -vv
> > echo "version=$(haproxy -vq)" >> $GITHUB_OUTPUT
> > - - uses: ./.github/actions/setup-vtest
> > - name: Run VTest for HAProxy
> > id: vtest
> > - run: |
> > - make reg-tests VTEST_PROGRAM=${{ github.workspace
> }}/vtest/vtest REGTESTS_TYPES=default,bug,devel
> > + uses: ./.github/actions/vtest
> > - name: Run Unit tests
> > id: unittests
> > run: |
> > make unit-tests
> > - - name: Show VTest results
> > - if: ${{ failure() && steps.vtest.outcome == 'failure' }}
> > - run: |
> > - for folder in ${TMPDIR:-/tmp}/haregtests-*/vtc.*; do
> > - printf "::group::"
> > - cat $folder/INFO
> > - cat $folder/LOG
> > - echo "::endgroup::"
> > - done
> > - exit 1
> > - - name: Show coredumps
> > - if: ${{ failure() && steps.vtest.outcome == 'failure' }}
> > - run: |
> > - failed=false
> > - shopt -s nullglob
> > - for file in /tmp/core.*; do
> > - failed=true
> > - printf "::group::"
> > - gdb -ex 'thread apply all bt full' ./haproxy $file
> > - echo "::endgroup::"
> > - done
> > - if [ "$failed" = true ]; then
> > - exit 1;
> > - fi
> > - name: Show Unit-Tests results
> > if: ${{ failure() && steps.unittests.outcome == 'failure' }}
> > run: |
> > --
> > 2.46.0.windows.1
> >
> >
>