| # This workflow builds and tests the C++ implementation of TsFile on Windows |
| # using the MSVC toolchain (Visual Studio generator), as a complement to |
| # unit-test-cpp.yml which builds the Windows target with MinGW. |
| |
| name: Unit-Test-Cpp-MSVC |
| |
| on: |
| push: |
| branches: |
| - develop |
| - iotdb |
| - rc/* |
| paths-ignore: |
| - 'docs/**' |
| - 'java/**' |
| pull_request: |
| branches: |
| - develop |
| - dev/* |
| - iotdb |
| - rc/* |
| paths-ignore: |
| - 'docs/**' |
| - 'java/**' |
| # Enable manually starting builds. |
| workflow_dispatch: |
| |
| concurrency: |
| group: ${{ github.workflow }}-${{ github.ref }} |
| cancel-in-progress: true |
| |
| env: |
| MAVEN_OPTS: -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.http.retryHandler.class=standard -Dmaven.wagon.http.retryHandler.count=3 |
| DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }} |
| |
| jobs: |
| unit-test-msvc: |
| strategy: |
| fail-fast: false |
| # To exercise the VS 2017 compatibility this branch targets, the non-ASan |
| # jobs build with the v141 toolset (the VS 2017 compiler, cl.exe 19.16) |
| # via a VS 2022 generator. AddressSanitizer is not supported by v141, so |
| # the ASan jobs use the default v143 toolset (VS 2022), which fully |
| # supports /fsanitize=address. |
| matrix: |
| include: |
| - build_type: Release |
| enable_asan: NoAsan |
| toolset: v141 |
| - build_type: Debug |
| enable_asan: NoAsan |
| toolset: v141 |
| - build_type: Release |
| enable_asan: Asan |
| toolset: default |
| - build_type: Debug |
| enable_asan: Asan |
| toolset: default |
| # Pinned to windows-2022 deliberately: it ships Visual Studio 2022, which |
| # the "Visual Studio 17 2022" CMake generator requires. The windows-latest |
| # image has since moved to a newer Visual Studio that the bundled CMake |
| # (3.30.x) does not yet recognise as a generator. Bump this (and |
| # msvc.generator) together when migrating. The v141 (VS 2017) toolset is |
| # no longer bundled with the image and is installed by a step below. |
| runs-on: windows-2022 |
| |
| steps: |
| |
| - name: Checkout repository |
| uses: actions/checkout@v6 |
| |
| - name: Set up JDK 17 |
| uses: actions/setup-java@v5 |
| with: |
| distribution: corretto |
| java-version: 17 |
| |
| # Setup caching of the artifacts in the .m2 directory, so they don't have |
| # to all be downloaded again for every build. |
| - name: Cache Maven packages |
| uses: actions/cache@v5 |
| with: |
| path: ~/.m2 |
| key: ${{ runner.os }}-m2-msvc-${{ hashFiles('**/pom.xml') }} |
| restore-keys: ${{ runner.os }}-m2- |
| |
| # Put the MSVC toolchain (and, importantly, the AddressSanitizer runtime |
| # clang_rt.asan_dynamic-*.dll) on PATH so the test executable can run |
| # during ctest discovery and execution. |
| - name: Set up MSVC developer environment |
| uses: ilammy/msvc-dev-cmd@v1 |
| with: |
| arch: x64 |
| |
| # The windows-2022 image no longer ships the v141 (VS 2017) toolset, so |
| # install it on demand for the v141 jobs. With the component present the |
| # VS 2022 generator can build with the VS 2017 compiler via |
| # -DCMAKE_GENERATOR_TOOLSET=v141. |
| - name: Install MSVC v141 (VS 2017) toolset |
| if: matrix.toolset == 'v141' |
| shell: pwsh |
| run: | |
| $ErrorActionPreference = "Stop" |
| $installerDir = "C:\Program Files (x86)\Microsoft Visual Studio\Installer" |
| $installPath = & (Join-Path $installerDir "vswhere.exe") -latest -property installationPath |
| Write-Host "Visual Studio install path: $installPath" |
| |
| # The v141 (VS 2017) toolset always installs as a 14.16.* directory. |
| function Test-V141Toolset { |
| [bool](Get-ChildItem -Path (Join-Path $installPath "VC\Tools\MSVC") ` |
| -Directory -Filter "14.16.*" -ErrorAction SilentlyContinue) |
| } |
| |
| if (Test-V141Toolset) { |
| Write-Host "v141 toolset already present." |
| } else { |
| # vs_installer.exe 'modify' accepts only a limited switch set; |
| # bootstrapper-only switches such as --wait / --nocache make it |
| # fail with exit code 87 (ERROR_INVALID_PARAMETER). |
| $argString = "modify --installPath `"$installPath`" " + |
| "--add Microsoft.VisualStudio.Component.VC.v141.x86.x64 " + |
| "--quiet --norestart" |
| $proc = Start-Process -FilePath (Join-Path $installerDir "vs_installer.exe") ` |
| -ArgumentList $argString -Wait -PassThru |
| Write-Host "vs_installer exit code: $($proc.ExitCode)" |
| # vs_installer may delegate to a background process; wait for it. |
| Get-Process -Name "vs_installer", "setup" -ErrorAction SilentlyContinue | |
| Wait-Process -Timeout 900 -ErrorAction SilentlyContinue |
| if (-not (Test-V141Toolset)) { |
| throw "v141 toolset not found after install (vs_installer exit code $($proc.ExitCode))" |
| } |
| Write-Host "v141 toolset installed." |
| } |
| |
| # Run the maven build, selecting the MSVC toolchain via -Dcpp.toolchain=msvc. |
| # spotless (clang-format) is already covered by unit-test-cpp.yml, so it is |
| # skipped here to keep this workflow focused on the MSVC build. |
| # |
| # For the v141 jobs, -Dmsvc.toolset=v141 pins the VS 2017 compiler; the |
| # ASan jobs pass no toolset and so use the generator's default (v143). |
| - name: Build and test with Maven (MSVC) |
| shell: bash |
| run: | |
| if [ "${{ matrix.enable_asan }}" = "Asan" ]; then |
| ASAN_VALUE="ON" |
| else |
| ASAN_VALUE="OFF" |
| fi |
| if [ "${{ matrix.toolset }}" = "default" ]; then |
| TOOLSET_ARG="" |
| else |
| TOOLSET_ARG="-Dmsvc.toolset=${{ matrix.toolset }}" |
| fi |
| ./mvnw.cmd -P with-cpp \ |
| -Dcpp.toolchain=msvc \ |
| $TOOLSET_ARG \ |
| -Denable.asan=$ASAN_VALUE \ |
| -Dbuild.type=${{ matrix.build_type }} \ |
| -Dspotless.skip=true \ |
| clean verify |