psql ODBC CI - prepare for release 17_00_0009 (#163) #312
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_3_6' | |
| 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-${{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-${{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-${{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-${{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 | |
| # ----------------------------------------------------------------- | |
| # 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 | |
| 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 | |
| # ===================================================================== | |
| # Release (only on version tags) | |
| # ===================================================================== | |
| release: | |
| needs: build-and-test | |
| 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*/**/*" |