psql ODBC CI - #410
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: MSBuild | |
| run-name: psql ODBC CI - ${{ github.event.head_commit.message }} | |
| on: | |
| push: | |
| branches: [ "main" ] | |
| tags: | |
| - 'REL-*' | |
| - '!REL-*-mimalloc' | |
| pull_request: | |
| branches: [ "main" ] | |
| workflow_dispatch: | |
| env: | |
| BUILD_CONFIGURATION: Release | |
| # PostgreSQL build from source. | |
| POSTGRESQL_SOURCE_TAG: 'REL_18_STABLE' | |
| OPENSSL_VERSION: '3_5_7' | |
| WORKFLOW_VERSION_POSTGRESQL_ARM64: '1' # increment to invalidate the arm64 cache | |
| PKGCONFIGLITE_VERSION: '0.28-1' | |
| WINFLEXBISON_VERSION: '2.5.24' | |
| WORKFLOW_VERSION_POSTGRESQL: '1' # increment to invalidate cache | |
| # PostgreSQL x64 test server (EDB installer). | |
| POSTGRESQL_PACKAGE_FILEID: '1259019' | |
| # Test utilities. | |
| DIFFUTILS_VERSION: '2.8.7-1' | |
| permissions: | |
| contents: read | |
| jobs: | |
| # ===================================================================== | |
| # Build PostgreSQL x64 (full) and x86 (libpq only) from source | |
| # | |
| # Both are built with OpenSSL for SSL support (required for release | |
| # installers). Results are cached so subsequent runs skip this job. | |
| # ===================================================================== | |
| build-postgres: | |
| runs-on: windows-latest | |
| steps: | |
| - name: Cache PostgreSQL build output | |
| uses: actions/cache@v4 | |
| id: cachePostgres | |
| with: | |
| path: | | |
| d:\postgresql | |
| d:\postgresql86 | |
| key: postgresql-${{env.POSTGRESQL_SOURCE_TAG}}_openssl-${{env.OPENSSL_VERSION}}_pkgconfiglite-${{env.PKGCONFIGLITE_VERSION}}_winflexbison-${{env.WINFLEXBISON_VERSION}}_workflow-${{env.WORKFLOW_VERSION_POSTGRESQL}} | |
| # ----------------------------------------------------------------- | |
| # Source code | |
| # ----------------------------------------------------------------- | |
| - name: Cache PostgreSQL source | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| uses: actions/cache@v4 | |
| id: cachePgSource | |
| with: | |
| path: postgres | |
| key: pg-source-${{env.POSTGRESQL_SOURCE_TAG}} | |
| - name: Get PostgreSQL source | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cachePgSource.outputs.cache-hit != 'true' | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: "postgres/postgres.git" | |
| ref: ${{env.POSTGRESQL_SOURCE_TAG}} | |
| path: postgres | |
| # ----------------------------------------------------------------- | |
| # Build tools | |
| # ----------------------------------------------------------------- | |
| - name: Install meson and ninja | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| run: python -m pip install meson ninja | |
| - name: Cache winflexbison | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| uses: actions/cache@v4 | |
| id: cacheWinFlexBison | |
| with: | |
| path: C:\OTHERBIN\winflexbison | |
| key: winflexbison-dworkspace-${{env.WINFLEXBISON_VERSION}} | |
| env: | |
| SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 | |
| - name: Download winflexbison | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cacheWinFlexBison.outputs.cache-hit != 'true' | |
| uses: suisei-cn/actions-download-file@v1.6.0 | |
| id: downloadWinFlexBison | |
| with: | |
| retry-times: 5 | |
| url: https://sourceforge.net/projects/winflexbison/files/win_flex_bison-${{env.WINFLEXBISON_VERSION}}.zip | |
| filename: win_flex_bison.zip | |
| - name: Extract winflexbison | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cacheWinFlexBison.outputs.cache-hit != 'true' | |
| shell: cmd | |
| run: | | |
| mkdir "C:\OTHERBIN\winflexbison" | |
| 7z x win_flex_bison.zip -o"C:\OTHERBIN\winflexbison" | |
| - name: Add winflexbison to PATH | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| shell: cmd | |
| run: printf "C:\OTHERBIN\\winflexbison" >> %GITHUB_PATH% | |
| - name: Cache pkgconfiglite | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| uses: actions/cache@v4 | |
| id: cachePkgConfigLite | |
| with: | |
| path: C:\OTHERBIN\pkgconfiglite | |
| key: pkg-config-lite-dworkspace-${{env.PKGCONFIGLITE_VERSION}}-win32 | |
| env: | |
| SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 | |
| - name: Download pkgconfiglite | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cachePkgConfigLite.outputs.cache-hit != 'true' | |
| uses: suisei-cn/actions-download-file@v1.6.0 | |
| id: downloadPkgConfigLite | |
| with: | |
| retry-times: 5 | |
| url: http://downloads.sourceforge.net/project/pkgconfiglite/${{env.PKGCONFIGLITE_VERSION}}/pkg-config-lite-${{env.PKGCONFIGLITE_VERSION}}_bin-win32.zip | |
| filename: pkg-config-lite_bin-win32.zip | |
| - name: Extract pkgconfiglite | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cachePkgConfigLite.outputs.cache-hit != 'true' | |
| shell: cmd | |
| run: | | |
| mkdir "C:\OTHERBIN\pkgconfiglite" | |
| 7z x pkg-config-lite_bin-win32.zip -o"C:\OTHERBIN\pkgconfiglite" | |
| - name: Add pkgconfiglite to PATH | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| shell: cmd | |
| run: printf "C:\\OTHERBIN\\pkgconfiglite\\pkg-config-lite-%PKGCONFIGLITE_VERSION%\\bin" >> %GITHUB_PATH% | |
| # ----------------------------------------------------------------- | |
| # OpenSSL (required for release installers) | |
| # ----------------------------------------------------------------- | |
| - name: Cache Win32 OpenSSL | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| uses: actions/cache@v4 | |
| id: cacheWin32OpenSSL | |
| with: | |
| path: C:\OTHERBIN\openssl32 | |
| key: Win32OpenSSL-${{env.OPENSSL_VERSION}} | |
| - name: Download Win32 OpenSSL | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cacheWin32OpenSSL.outputs.cache-hit != 'true' | |
| uses: suisei-cn/actions-download-file@v1.6.0 | |
| id: downloadWin32OpenSSL | |
| with: | |
| retry-times: 5 | |
| url: https://slproweb.com/download/Win32OpenSSL-${{env.OPENSSL_VERSION}}.exe | |
| filename: Win32OpenSSL.exe | |
| - name: Install Win32 OpenSSL | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cacheWin32OpenSSL.outputs.cache-hit != 'true' | |
| shell: cmd | |
| run: Win32OpenSSL.exe /sp /silent /dir=c:\OTHERBIN\openssl32 | |
| - name: Cache Win64 OpenSSL | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| uses: actions/cache@v4 | |
| id: cacheWin64OpenSSL | |
| with: | |
| path: C:\OTHERBIN\openssl64 | |
| key: Win64OpenSSL-${{env.OPENSSL_VERSION}} | |
| - name: Download Win64 OpenSSL | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cacheWin64OpenSSL.outputs.cache-hit != 'true' | |
| uses: suisei-cn/actions-download-file@v1.6.0 | |
| id: downloadWin64OpenSSL | |
| with: | |
| retry-times: 5 | |
| url: https://slproweb.com/download/Win64OpenSSL-${{env.OPENSSL_VERSION}}.exe | |
| filename: Win64OpenSSL.exe | |
| - name: Install Win64 OpenSSL | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cacheWin64OpenSSL.outputs.cache-hit != 'true' | |
| shell: cmd | |
| run: Win64OpenSSL.exe /sp /silent /dir=c:\OTHERBIN\openssl64 | |
| # ----------------------------------------------------------------- | |
| # Build PostgreSQL x64 (full server with SSL) | |
| # ----------------------------------------------------------------- | |
| - name: Setup MSVC x64 | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| uses: TheMrMilchmann/setup-msvc-dev@v3 | |
| with: | |
| arch: x64 | |
| - name: Build PostgreSQL x64 | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| working-directory: postgres | |
| run: | | |
| meson setup build -Dssl=openssl -Dextra_lib_dirs=c:\OTHERBIN\openssl64\lib\VC\x64\MT -Dextra_include_dirs=c:\OTHERBIN\openssl64\include --prefix=d:\postgresql | |
| cd build | |
| ninja | |
| ninja install | |
| cp c:\OTHERBIN\openssl64\*.dll d:\postgresql\bin | |
| # ----------------------------------------------------------------- | |
| # Build PostgreSQL x86 (libpq client library only, with SSL) | |
| # | |
| # Only the libpq client library is needed to compile the x86 ODBC | |
| # driver. The test server is always x64. Building only libpq is | |
| # much faster than building the full PostgreSQL server. | |
| # ----------------------------------------------------------------- | |
| - name: Setup MSVC x86 | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| uses: TheMrMilchmann/setup-msvc-dev@v3 | |
| with: | |
| arch: x86 | |
| - name: Build PostgreSQL x86 client library | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| working-directory: postgres | |
| shell: pwsh | |
| run: | | |
| # Headers are architecture-independent; reuse from the x64 build. | |
| New-Item -ItemType Directory -Path d:\postgresql86 -Force | |
| Copy-Item -Recurse d:\postgresql\include d:\postgresql86\include | |
| # Configure with SSL support (required for release installers). | |
| meson setup buildx86 -Dssl=openssl -Dextra_lib_dirs=c:\OTHERBIN\openssl32\lib\VC\x86\MT -Dextra_include_dirs=c:\OTHERBIN\openssl32\include --prefix=d:\postgresql86 | |
| # Build only the libpq client library (and its dependencies). | |
| # This is much faster than building the full PostgreSQL server. | |
| meson compile -C buildx86 src/interfaces/libpq/libpq:shared_library | |
| # Install only the files needed for compiling and linking the x86 ODBC driver. | |
| New-Item -ItemType Directory -Path d:\postgresql86\lib, d:\postgresql86\bin -Force | |
| Get-ChildItem buildx86 -Recurse -Filter "libpq.lib" | Copy-Item -Destination d:\postgresql86\lib\ | |
| Get-ChildItem buildx86 -Recurse -Filter "libpq.dll" | Copy-Item -Destination d:\postgresql86\bin\ | |
| # Copy OpenSSL DLLs (needed by the installer). | |
| Copy-Item c:\OTHERBIN\openssl32\*.dll d:\postgresql86\bin\ | |
| # ===================================================================== | |
| # Build and test psqlodbc (standard and mimalloc, in parallel) | |
| # ===================================================================== | |
| build-and-test: | |
| needs: build-postgres | |
| runs-on: windows-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| variant: [standard, mimalloc] | |
| steps: | |
| # ----------------------------------------------------------------- | |
| # Restore PostgreSQL build from cache | |
| # ----------------------------------------------------------------- | |
| - name: Restore PostgreSQL build from cache | |
| uses: actions/cache/restore@v4 | |
| with: | |
| path: | | |
| d:\postgresql | |
| d:\postgresql86 | |
| key: postgresql-${{env.POSTGRESQL_SOURCE_TAG}}_openssl-${{env.OPENSSL_VERSION}}_pkgconfiglite-${{env.PKGCONFIGLITE_VERSION}}_winflexbison-${{env.WINFLEXBISON_VERSION}}_workflow-${{env.WORKFLOW_VERSION_POSTGRESQL}} | |
| fail-on-cache-miss: true | |
| # ----------------------------------------------------------------- | |
| # Test dependencies | |
| # ----------------------------------------------------------------- | |
| - name: Cache GNU diffutils | |
| uses: actions/cache@v4 | |
| id: cacheDiffutils | |
| with: | |
| path: C:\OTHERBIN\diffutils | |
| key: diffutils-dworkspace-${{env.DIFFUTILS_VERSION}} | |
| env: | |
| SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 | |
| - name: Download GNU diffutils | |
| if: steps.cacheDiffutils.outputs.cache-hit != 'true' | |
| uses: suisei-cn/actions-download-file@v1.6.0 | |
| id: downloadDiffutils | |
| with: | |
| retry-times: 5 | |
| url: https://zenlayer.dl.sourceforge.net/project/gnuwin32/diffutils/${{env.DIFFUTILS_VERSION}}/diffutils-${{env.DIFFUTILS_VERSION}}-bin.zip | |
| filename: diffutils-bin.zip | |
| - name: Extract GNU diffutils | |
| if: steps.cacheDiffutils.outputs.cache-hit != 'true' | |
| shell: cmd | |
| run: | | |
| mkdir "C:\OTHERBIN\diffutils" | |
| 7z x diffutils-bin.zip -o"C:\OTHERBIN\diffutils" | |
| - name: Add diffutils to PATH | |
| shell: cmd | |
| run: printf "C:\\OTHERBIN\\diffutils\\bin" >> %GITHUB_PATH% | |
| # ----------------------------------------------------------------- | |
| # PostgreSQL x64 test server | |
| # ----------------------------------------------------------------- | |
| - name: Cache PostgreSQL installer | |
| uses: actions/cache@v4 | |
| id: cacheInstaller | |
| with: | |
| path: C:\OTHERBIN\postgresql_install.exe | |
| key: pg-installer-dworkspace-${{env.POSTGRESQL_PACKAGE_FILEID}} | |
| - name: Download PostgreSQL installer | |
| if: steps.cacheInstaller.outputs.cache-hit != 'true' | |
| uses: suisei-cn/actions-download-file@v1.6.0 | |
| id: downloadInstaller | |
| with: | |
| retry-times: 5 | |
| url: https://sbp.enterprisedb.com/getfile.jsp?fileid=${{env.POSTGRESQL_PACKAGE_FILEID}} | |
| target: c:\OTHERBIN | |
| filename: postgresql_install.exe | |
| - name: Install and start PostgreSQL server | |
| shell: cmd | |
| run: | | |
| echo on | |
| C:\OTHERBIN\postgresql_install.exe --mode unattended --unattendedmodeui none --superpassword password --enable-components server | |
| sc config "postgresql-x64-17" start= auto | |
| sc start "postgresql-x64-17" | |
| ping -n 6 127.0.0.1 >nul | |
| # ----------------------------------------------------------------- | |
| # Build and test psqlodbc | |
| # ----------------------------------------------------------------- | |
| - name: Checkout psqlodbc | |
| uses: actions/checkout@v4 | |
| with: | |
| path: psqlodbc | |
| submodules: true | |
| - name: Setup MSVC for psqlodbc | |
| uses: TheMrMilchmann/setup-msvc-dev@v3 | |
| with: | |
| arch: x86 | |
| - name: Install WiX | |
| shell: cmd | |
| run: | | |
| dotnet tool install --global wix --version "6.*" | |
| wix extension add --global WixToolset.UI.wixext/6.0.0 | |
| - name: Build psqlodbc ${{matrix.variant}} | |
| shell: powershell | |
| working-directory: psqlodbc | |
| run: | | |
| copy .github\workflows\configuration.xml winbuild | |
| if ('${{matrix.variant}}' -eq 'mimalloc') { | |
| winbuild\BuildAll.ps1 -UseMimalloc | |
| } else { | |
| winbuild\BuildAll.ps1 | |
| } | |
| installer\buildInstallers.ps1 | |
| env: | |
| PSQLODBC_OBJBASE: ${{ github.workspace }}\psqlodbc\winbuild\${{matrix.variant}} | |
| - name: Test psqlodbc ${{matrix.variant}} | |
| shell: powershell | |
| working-directory: psqlodbc | |
| run: | | |
| if ('${{matrix.variant}}' -eq 'mimalloc') { | |
| winbuild\regress.ps1 -DsnInfo "SERVER=localhost|DATABASE=contrib_regression|PORT=5432|UID=postgres|PWD=password" -ExpectMimalloc | |
| } else { | |
| winbuild\regress.ps1 -DsnInfo "SERVER=localhost|DATABASE=contrib_regression|PORT=5432|UID=postgres|PWD=password" | |
| } | |
| ${{matrix.variant}}\test_x86\RegisterRegdsn.exe uninstall_driver postgres_devw | |
| ${{matrix.variant}}\test_x64\RegisterRegdsn.exe uninstall_driver postgres_devw | |
| env: | |
| PSQLODBC_OBJBASE: ${{ github.workspace }}\psqlodbc\winbuild\${{matrix.variant}} | |
| # ----------------------------------------------------------------- | |
| # Upload artifacts | |
| # ----------------------------------------------------------------- | |
| - name: Upload ${{matrix.variant}} x64 merge module | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: psqlODBC ${{matrix.variant}} x64 Merge Module | |
| path: psqlodbc/winbuild/${{matrix.variant}}/installer/x64/*.msm | |
| retention-days: 5 | |
| if-no-files-found: error | |
| - name: Upload ${{matrix.variant}} x64 installer package | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: psqlODBC ${{matrix.variant}} x64 Installer | |
| path: psqlodbc/winbuild/${{matrix.variant}}/installer/x64/*.msi | |
| retention-days: 5 | |
| if-no-files-found: error | |
| - name: Upload ${{matrix.variant}} x86 merge module | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: psqlODBC ${{matrix.variant}} x86 Merge Module | |
| path: psqlodbc/winbuild/${{matrix.variant}}/installer/x86/*.msm | |
| retention-days: 5 | |
| if-no-files-found: error | |
| - name: Upload ${{matrix.variant}} x86 installer package | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: psqlODBC ${{matrix.variant}} x86 Installer | |
| path: psqlodbc/winbuild/${{matrix.variant}}/installer/x86/*.msi | |
| retention-days: 5 | |
| if-no-files-found: error | |
| - name: Upload ${{matrix.variant}} x64 setup | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: psqlODBC ${{matrix.variant}} x64 Setup | |
| path: psqlodbc/winbuild/${{matrix.variant}}/installer/psqlodbc-setup/bin/Release/psqlodbc-setup.exe | |
| retention-days: 5 | |
| if-no-files-found: error | |
| # ===================================================================== | |
| # Build PostgreSQL arm64 (libpq only, from source) for Windows on Arm | |
| # | |
| # The windows-11-arm image has no prebuilt arm64 PostgreSQL, so libpq is | |
| # built from source natively (OpenSSL comes from the slproweb prebuilt | |
| # arm64 installer, same as the x86/x64 jobs). Only libpq is built: | |
| # the full server does not build for aarch64 (PostgreSQL's msvc_gendef.pl | |
| # rejects the arch when generating postgres.def), and the driver only needs | |
| # libpq. The regression test server is a separate x64 EDB install (run under | |
| # emulation) in the build-and-test job. windows-11-arm has no D: drive, so | |
| # outputs live under C:. Results are cached so subsequent runs skip this job. | |
| # ===================================================================== | |
| build-postgres-arm: | |
| runs-on: windows-11-arm | |
| steps: | |
| - name: Cache libpq arm64 build output | |
| uses: actions/cache@v4 | |
| id: cachePostgres | |
| with: | |
| path: C:\postgresql_arm64 | |
| key: postgresql-arm64-${{env.POSTGRESQL_SOURCE_TAG}}_openssl-${{env.OPENSSL_VERSION}}_pkgconfiglite-${{env.PKGCONFIGLITE_VERSION}}_winflexbison-${{env.WINFLEXBISON_VERSION}}_workflow-${{env.WORKFLOW_VERSION_POSTGRESQL_ARM64}} | |
| # ----------------------------------------------------------------- | |
| # Source code | |
| # ----------------------------------------------------------------- | |
| - name: Cache PostgreSQL source | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| uses: actions/cache@v4 | |
| id: cachePgSource | |
| with: | |
| path: postgres | |
| # Distinct from the x64 job's pg-source key: that cache contains an | |
| # x64-configured meson build/ dir with absolute D: paths, which breaks | |
| # a C:-based arm64 reconfigure. | |
| key: pg-source-arm64-${{env.POSTGRESQL_SOURCE_TAG}} | |
| - name: Get PostgreSQL source | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cachePgSource.outputs.cache-hit != 'true' | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: "postgres/postgres.git" | |
| ref: ${{env.POSTGRESQL_SOURCE_TAG}} | |
| path: postgres | |
| # ----------------------------------------------------------------- | |
| # Build tools | |
| # ----------------------------------------------------------------- | |
| - name: Install meson and ninja | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| run: python -m pip install meson ninja | |
| - name: Cache winflexbison | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| uses: actions/cache@v4 | |
| id: cacheWinFlexBison | |
| with: | |
| path: C:\OTHERBIN\winflexbison | |
| key: winflexbison-cworkspace-${{env.WINFLEXBISON_VERSION}} | |
| env: | |
| SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 | |
| - name: Download winflexbison | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cacheWinFlexBison.outputs.cache-hit != 'true' | |
| uses: suisei-cn/actions-download-file@v1.6.0 | |
| id: downloadWinFlexBison | |
| with: | |
| retry-times: 5 | |
| url: https://sourceforge.net/projects/winflexbison/files/win_flex_bison-${{env.WINFLEXBISON_VERSION}}.zip | |
| filename: win_flex_bison.zip | |
| - name: Extract winflexbison | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cacheWinFlexBison.outputs.cache-hit != 'true' | |
| shell: cmd | |
| run: | | |
| mkdir "C:\OTHERBIN\winflexbison" | |
| 7z x win_flex_bison.zip -o"C:\OTHERBIN\winflexbison" | |
| - name: Add winflexbison to PATH | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| shell: cmd | |
| run: printf "C:\OTHERBIN\\winflexbison" >> %GITHUB_PATH% | |
| - name: Cache pkgconfiglite | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| uses: actions/cache@v4 | |
| id: cachePkgConfigLite | |
| with: | |
| path: C:\OTHERBIN\pkgconfiglite | |
| key: pkg-config-lite-cworkspace-${{env.PKGCONFIGLITE_VERSION}}-win32 | |
| env: | |
| SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 | |
| - name: Download pkgconfiglite | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cachePkgConfigLite.outputs.cache-hit != 'true' | |
| uses: suisei-cn/actions-download-file@v1.6.0 | |
| id: downloadPkgConfigLite | |
| with: | |
| retry-times: 5 | |
| url: http://downloads.sourceforge.net/project/pkgconfiglite/${{env.PKGCONFIGLITE_VERSION}}/pkg-config-lite-${{env.PKGCONFIGLITE_VERSION}}_bin-win32.zip | |
| filename: pkg-config-lite_bin-win32.zip | |
| - name: Extract pkgconfiglite | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cachePkgConfigLite.outputs.cache-hit != 'true' | |
| shell: cmd | |
| run: | | |
| mkdir "C:\OTHERBIN\pkgconfiglite" | |
| 7z x pkg-config-lite_bin-win32.zip -o"C:\OTHERBIN\pkgconfiglite" | |
| - name: Add pkgconfiglite to PATH | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| shell: cmd | |
| run: printf "C:\\OTHERBIN\\pkgconfiglite\\pkg-config-lite-%PKGCONFIGLITE_VERSION%\\bin" >> %GITHUB_PATH% | |
| # ----------------------------------------------------------------- | |
| # OpenSSL arm64 (prebuilt slproweb installer; required for release | |
| # installers). Mirrors the x86/x64 jobs: download the silent Inno | |
| # Setup installer and install it. Cached so a libpq-cache miss does | |
| # not force a re-download. | |
| # ----------------------------------------------------------------- | |
| - name: Cache Win64ARM OpenSSL | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| uses: actions/cache@v4 | |
| id: cacheWin64ARMOpenSSL | |
| with: | |
| path: C:\OTHERBIN\openssl_arm64 | |
| key: Win64ARMOpenSSL-${{env.OPENSSL_VERSION}} | |
| - name: Download Win64ARM OpenSSL | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cacheWin64ARMOpenSSL.outputs.cache-hit != 'true' | |
| uses: suisei-cn/actions-download-file@v1.6.0 | |
| id: downloadWin64ARMOpenSSL | |
| with: | |
| retry-times: 5 | |
| url: https://slproweb.com/download/Win64ARMOpenSSL-${{env.OPENSSL_VERSION}}.exe | |
| filename: Win64ARMOpenSSL.exe | |
| - name: Install Win64ARM OpenSSL | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' && steps.cacheWin64ARMOpenSSL.outputs.cache-hit != 'true' | |
| shell: cmd | |
| run: Win64ARMOpenSSL.exe /sp /silent /dir=c:\OTHERBIN\openssl_arm64 | |
| # ----------------------------------------------------------------- | |
| # Build libpq arm64 only (with SSL). | |
| # | |
| # Building only the libpq client library avoids the full-server build, | |
| # which fails for aarch64 (postgres.def generation). This mirrors the | |
| # x86 libpq-only build in the x64 job. A minimal libpq SDK (lib + dll + | |
| # the client headers psqlodbc needs) is assembled under C:\postgresql_arm64. | |
| # ----------------------------------------------------------------- | |
| - name: Setup MSVC arm64 | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| uses: TheMrMilchmann/setup-msvc-dev@v3 | |
| with: | |
| arch: arm64 | |
| - name: Build libpq arm64 | |
| if: steps.cachePostgres.outputs.cache-hit != 'true' | |
| working-directory: postgres | |
| shell: pwsh | |
| run: | | |
| # Always configure a clean arm64 build dir (never reuse a stale or | |
| # cross-arch meson configuration). | |
| if (Test-Path build) { Remove-Item -Recurse -Force build } | |
| meson setup build -Dssl=openssl -Dextra_lib_dirs=c:\OTHERBIN\openssl_arm64\lib\VC\arm64\MT -Dextra_include_dirs=c:\OTHERBIN\openssl_arm64\include --prefix=C:\postgresql_arm64 | |
| # Build only the libpq client library (and its dependencies). | |
| meson compile -C build src/interfaces/libpq/libpq:shared_library | |
| # Assemble a minimal libpq SDK layout at C:\postgresql_arm64. | |
| New-Item -ItemType Directory -Force -Path C:\postgresql_arm64\lib, C:\postgresql_arm64\bin, C:\postgresql_arm64\include | Out-Null | |
| Get-ChildItem build -Recurse -Filter "libpq.lib" | Copy-Item -Destination C:\postgresql_arm64\lib\ | |
| Get-ChildItem build -Recurse -Filter "libpq.dll" | Copy-Item -Destination C:\postgresql_arm64\bin\ | |
| # Headers: reproduce a PostgreSQL install-style include layout so the | |
| # driver builds. psqlodbc includes <libpq-fe.h>, "pqexpbuffer.h" and | |
| # "postgres_fe.h"; the last pulls in the full server header tree | |
| # (c.h, pg_config*.h, ...). Client headers go in include\, server | |
| # headers in include\server\ (on psqlodbc's PG_INC/server include path). | |
| $inc = "C:\postgresql_arm64\include" | |
| New-Item -ItemType Directory -Force -Path "$inc\server" | Out-Null | |
| Copy-Item src\interfaces\libpq\libpq-fe.h, src\interfaces\libpq\libpq-events.h, src\interfaces\libpq\pqexpbuffer.h $inc | |
| Copy-Item src\include\postgres_ext.h $inc | |
| # Full server header tree: static source headers plus the meson-generated | |
| # pg_config.h / pg_config_os.h (emitted together in build\src\include). | |
| # (PostgreSQL 18 has no pg_config_ext.h.) | |
| Copy-Item -Recurse -Force src\include\* "$inc\server" | |
| $gen = (Get-ChildItem build -Recurse -Filter pg_config.h | Select-Object -First 1).Directory.FullName | |
| Copy-Item -Recurse -Force "$gen\*" "$inc\server" | |
| # OpenSSL runtime DLLs alongside libpq (needed at load time and by the installer). | |
| # The slproweb installer places the DLLs at the install root (like x86/x64). | |
| Copy-Item c:\OTHERBIN\openssl_arm64\*.dll C:\postgresql_arm64\bin\ | |
| # ===================================================================== | |
| # Build and test psqlodbc arm64 (standard and mimalloc, in parallel) | |
| # | |
| # Runs natively on windows-11-arm. The regression tests run against a | |
| # from-source arm64 PostgreSQL server started below. | |
| # ===================================================================== | |
| build-and-test-arm: | |
| needs: build-postgres-arm | |
| runs-on: windows-11-arm | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| # mimalloc is omitted on arm64: the vendored mimalloc submodule's VS | |
| # project (libs/mimalloc/ide/vs2022/mimalloc.vcxproj) declares no ARM64 | |
| # configuration, so mimalloc-static.lib can't be built for arm64. Left | |
| # as a follow-up (submodule bump or CMake build); mimalloc remains | |
| # enabled for x86/x64. | |
| variant: [standard] | |
| steps: | |
| - name: Restore libpq arm64 build from cache | |
| uses: actions/cache/restore@v4 | |
| with: | |
| path: C:\postgresql_arm64 | |
| key: postgresql-arm64-${{env.POSTGRESQL_SOURCE_TAG}}_openssl-${{env.OPENSSL_VERSION}}_pkgconfiglite-${{env.PKGCONFIGLITE_VERSION}}_winflexbison-${{env.WINFLEXBISON_VERSION}}_workflow-${{env.WORKFLOW_VERSION_POSTGRESQL_ARM64}} | |
| fail-on-cache-miss: true | |
| # ----------------------------------------------------------------- | |
| # Test dependencies | |
| # ----------------------------------------------------------------- | |
| - name: Cache GNU diffutils | |
| uses: actions/cache@v4 | |
| id: cacheDiffutilsArm | |
| with: | |
| path: C:\OTHERBIN\diffutils | |
| key: diffutils-cworkspace-${{env.DIFFUTILS_VERSION}} | |
| env: | |
| SEGMENT_DOWNLOAD_TIMEOUT_MINS: 1 | |
| - name: Download GNU diffutils | |
| if: steps.cacheDiffutilsArm.outputs.cache-hit != 'true' | |
| uses: suisei-cn/actions-download-file@v1.6.0 | |
| with: | |
| retry-times: 5 | |
| url: https://zenlayer.dl.sourceforge.net/project/gnuwin32/diffutils/${{env.DIFFUTILS_VERSION}}/diffutils-${{env.DIFFUTILS_VERSION}}-bin.zip | |
| filename: diffutils-bin.zip | |
| - name: Extract GNU diffutils | |
| if: steps.cacheDiffutilsArm.outputs.cache-hit != 'true' | |
| shell: cmd | |
| run: | | |
| mkdir "C:\OTHERBIN\diffutils" | |
| 7z x diffutils-bin.zip -o"C:\OTHERBIN\diffutils" | |
| - name: Add diffutils to PATH | |
| shell: cmd | |
| run: printf "C:\\OTHERBIN\\diffutils\\bin" >> %GITHUB_PATH% | |
| # ----------------------------------------------------------------- | |
| # PostgreSQL test server: the x64 EDB installer, run under Windows-on-Arm | |
| # x64 emulation. The driver connects over localhost TCP, so the server's | |
| # architecture is irrelevant. The regression harness (reset-db) creates | |
| # the contrib_regression database itself, so no createdb here. | |
| # ----------------------------------------------------------------- | |
| - name: Cache PostgreSQL installer | |
| uses: actions/cache@v4 | |
| id: cacheInstallerArm | |
| with: | |
| path: C:\OTHERBIN\postgresql_install.exe | |
| key: pg-installer-cworkspace-${{env.POSTGRESQL_PACKAGE_FILEID}} | |
| - name: Download PostgreSQL installer | |
| if: steps.cacheInstallerArm.outputs.cache-hit != 'true' | |
| uses: suisei-cn/actions-download-file@v1.6.0 | |
| with: | |
| retry-times: 5 | |
| url: https://sbp.enterprisedb.com/getfile.jsp?fileid=${{env.POSTGRESQL_PACKAGE_FILEID}} | |
| target: c:\OTHERBIN | |
| filename: postgresql_install.exe | |
| - name: Install and start PostgreSQL server | |
| shell: cmd | |
| run: | | |
| echo on | |
| C:\OTHERBIN\postgresql_install.exe --mode unattended --unattendedmodeui none --superpassword password --enable-components server | |
| sc config "postgresql-x64-17" start= auto | |
| sc start "postgresql-x64-17" | |
| ping -n 6 127.0.0.1 >nul | |
| # Put the arm64 libpq (and its OpenSSL DLLs) ahead of the emulated x64 | |
| # server's bin so the arm64 driver loads the matching arm64 libpq at runtime. | |
| - name: Add arm64 libpq to PATH | |
| shell: cmd | |
| run: echo C:\postgresql_arm64\bin>> %GITHUB_PATH% | |
| # ----------------------------------------------------------------- | |
| # Build and test psqlodbc | |
| # ----------------------------------------------------------------- | |
| - name: Checkout psqlodbc | |
| uses: actions/checkout@v4 | |
| with: | |
| path: psqlodbc | |
| submodules: true | |
| - name: Setup MSVC arm64 for psqlodbc | |
| uses: TheMrMilchmann/setup-msvc-dev@v3 | |
| with: | |
| arch: arm64 | |
| - name: Install WiX | |
| shell: cmd | |
| run: | | |
| dotnet tool install --global wix --version "6.*" | |
| wix extension add --global WixToolset.UI.wixext/6.0.0 | |
| - name: Build psqlodbc ${{matrix.variant}} | |
| shell: powershell | |
| working-directory: psqlodbc | |
| run: | | |
| copy .github\workflows\configuration.xml winbuild | |
| if ('${{matrix.variant}}' -eq 'mimalloc') { | |
| winbuild\BuildAll.ps1 -Platform ARM64 -UseMimalloc | |
| } else { | |
| winbuild\BuildAll.ps1 -Platform ARM64 | |
| } | |
| installer\buildInstallers.ps1 -cpu arm64 | |
| env: | |
| PSQLODBC_OBJBASE: ${{ github.workspace }}\psqlodbc\winbuild\${{matrix.variant}} | |
| - name: Test psqlodbc ${{matrix.variant}} | |
| shell: powershell | |
| working-directory: psqlodbc | |
| run: | | |
| if ('${{matrix.variant}}' -eq 'mimalloc') { | |
| winbuild\regress.ps1 -Platform ARM64 -DsnInfo "SERVER=localhost|DATABASE=contrib_regression|PORT=5432|UID=postgres|PWD=password" -ExpectMimalloc | |
| } else { | |
| winbuild\regress.ps1 -Platform ARM64 -DsnInfo "SERVER=localhost|DATABASE=contrib_regression|PORT=5432|UID=postgres|PWD=password" | |
| } | |
| ${{matrix.variant}}\test_arm64\RegisterRegdsn.exe uninstall_driver postgres_devw | |
| env: | |
| PSQLODBC_OBJBASE: ${{ github.workspace }}\psqlodbc\winbuild\${{matrix.variant}} | |
| # ----------------------------------------------------------------- | |
| # Upload artifacts (named to match the release job's glob patterns) | |
| # ----------------------------------------------------------------- | |
| - name: Upload ${{matrix.variant}} arm64 merge module | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: psqlODBC ${{matrix.variant}} arm64 Merge Module | |
| path: psqlodbc/winbuild/${{matrix.variant}}/installer/arm64/*.msm | |
| retention-days: 5 | |
| if-no-files-found: error | |
| - name: Upload ${{matrix.variant}} arm64 installer package | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: psqlODBC ${{matrix.variant}} arm64 Installer | |
| path: psqlodbc/winbuild/${{matrix.variant}}/installer/arm64/*.msi | |
| retention-days: 5 | |
| if-no-files-found: error | |
| # ===================================================================== | |
| # Release (only on version tags) | |
| # ===================================================================== | |
| release: | |
| needs: [build-and-test, build-and-test-arm] | |
| if: startsWith(github.ref, 'refs/tags/REL-') | |
| runs-on: windows-latest | |
| steps: | |
| - name: Download all artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: artifacts | |
| - name: Create mimalloc Release | |
| uses: ncipollo/release-action@v1.14.0 | |
| id: create_mimalloc_release | |
| with: | |
| tag: ${{github.ref_name}}-mimalloc | |
| commit: ${{github.sha}} | |
| body: A build of ${{github.ref_name}} that uses the mimalloc allocator for improved performance. | |
| makeLatest: false | |
| draft: false | |
| prerelease: false | |
| token: ${{secrets.RELEASE_TOKEN}} | |
| artifacts: "artifacts/psqlODBC mimalloc*/**/*" | |
| - name: Create Standard Release | |
| uses: ncipollo/release-action@v1.14.0 | |
| id: create_standard_release | |
| with: | |
| makeLatest: true | |
| draft: false | |
| prerelease: false | |
| token: ${{secrets.RELEASE_TOKEN}} | |
| artifacts: "artifacts/psqlODBC standard*/**/*" |