/
dev-npgsql
/
npgsql
Обзор
Документация
Войти
/
dev-npgsql
/
npgsql
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
test-logs
.github/workflows/build.yml
402 строки
19 KB
Brian Pursley
Enable Npgsql.Specification.Tests in the build pipeline (#6504)
19 мар 2026, 09:46
Не верифицирован
19 мар 2026, 09:46
ba83963
Код
Авторство
О чём код?
name: Build on: push: branches: - main - 'hotfix/**' tags: - '*' pull_request: permissions: contents: read # Cancel previous PR branch commits (head_ref is only defined on PRs) concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true env: postgis_version: 3 DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true # Windows comes with PG pre-installed, and defines the PGPASSWORD environment variable. Remove it as it interferes # with some of our tests PGPASSWORD: "" jobs: build: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-24.04] pg_major: [18, 17, 16, 15, 14] config: [Release] test_tfm: [net10.0] include: - os: ubuntu-24.04 pg_major: 18 config: Debug test_tfm: net10.0 - os: macos-26 pg_major: 16 config: Release test_tfm: net10.0 - os: windows-2025 pg_major: 18 config: Release test_tfm: net10.0 # Minimal support TFM build # - os: ubuntu-24.04 # pg_major: 18 # config: Release # test_tfm: net8.0 # PG prerelease build # - os: ubuntu-24.04 # pg_major: 19 # config: Release # test_tfm: net10.0 # pg_prerelease: 'PG Prerelease' outputs: is_release: ${{ steps.analyze_tag.outputs.is_release }} is_prerelease: ${{ steps.analyze_tag.outputs.is_prerelease }} # Installing PostGIS on Windows/macOS is complicated/unreliable, so we don't test on it. # The NPGSQL_TEST_POSTGIS environment variable ensures that if PostGIS isn't installed, # the PostGIS tests fail and therefore fail the build. env: NPGSQL_TEST_POSTGIS: ${{ !startsWith(matrix.os, 'windows') && !startsWith(matrix.os, 'macos') && matrix.pg_prerelease == '' }} steps: - name: Checkout uses: actions/checkout@v6 - name: NuGet Cache uses: actions/cache@v5 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Build.targets') }} restore-keys: | ${{ runner.os }}-nuget- - name: Setup .NET Core SDK uses: actions/setup-dotnet@v5.2.0 - name: Build run: dotnet build -c ${{ matrix.config }} shell: bash - name: Start PostgreSQL ${{ matrix.pg_major }} (Linux) if: startsWith(matrix.os, 'ubuntu') run: | # First uninstall any PostgreSQL installed on the image dpkg-query -W --showformat='${Package}\n' 'postgresql-*' | xargs sudo dpkg -P postgresql # Automated repository configuration sudo apt install -y postgresql-common sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -v ${{ matrix.pg_major }} -y sudo apt-get update -qq sudo apt-get install -qq postgresql-${{ matrix.pg_major }} export PGDATA=/etc/postgresql/${{ matrix.pg_major }}/main sudo cp $GITHUB_WORKSPACE/.build/{server.crt,server.key,ca.crt} $PGDATA sudo chmod 600 $PGDATA/{server.crt,server.key,ca.crt} sudo chown postgres $PGDATA/{server.crt,server.key,ca.crt} # Create the npgsql_tests database sudo -u postgres psql -c "CREATE DATABASE npgsql_tests" # Create npgsql_tests user with md5 password 'npgsql_tests' sudo -u postgres psql -c "CREATE USER npgsql_tests SUPERUSER PASSWORD 'md5adf74603a5772843f53e812f03dacb02'" sudo -u postgres psql -c "CREATE USER npgsql_tests_ssl SUPERUSER PASSWORD 'npgsql_tests_ssl'" sudo -u postgres psql -c "CREATE USER npgsql_tests_nossl SUPERUSER PASSWORD 'npgsql_tests_nossl'" # Install PostGIS if required if [[ $NPGSQL_TEST_POSTGIS == 'true' ]]; then sudo apt-get install -qq postgresql-${{ matrix.pg_major }}-postgis-${{ env.postgis_version }} fi if [ ${{ matrix.pg_major }} -ge 14 ]; then sudo sed -i "s|unix_socket_directories = '/var/run/postgresql'|unix_socket_directories = '/var/run/postgresql, @/npgsql_unix'|" $PGDATA/postgresql.conf fi sudo sed -i 's/max_connections = 100/max_connections = 500/' $PGDATA/postgresql.conf sudo sed -i 's/#ssl = off/ssl = on/' $PGDATA/postgresql.conf sudo sed -i "s|ssl_ca_file =|ssl_ca_file = '$PGDATA/ca.crt' #|" $PGDATA/postgresql.conf sudo sed -i "s|ssl_cert_file =|ssl_cert_file = '$PGDATA/server.crt' #|" $PGDATA/postgresql.conf sudo sed -i "s|ssl_key_file =|ssl_key_file = '$PGDATA/server.key' #|" $PGDATA/postgresql.conf sudo sed -i 's/#password_encryption = md5/password_encryption = scram-sha-256/' $PGDATA/postgresql.conf sudo sed -i 's/#wal_level =/wal_level = logical #/' $PGDATA/postgresql.conf sudo sed -i 's/#max_wal_senders =/max_wal_senders = 50 #/' $PGDATA/postgresql.conf sudo sed -i 's/#logical_decoding_work_mem =/logical_decoding_work_mem = 64kB #/' $PGDATA/postgresql.conf sudo sed -i 's/#wal_sender_timeout =/wal_sender_timeout = 3s #/' $PGDATA/postgresql.conf sudo sed -i "s/#synchronous_standby_names =/synchronous_standby_names = 'npgsql_test_sync_standby' #/" $PGDATA/postgresql.conf sudo sed -i "s/#synchronous_commit =/synchronous_commit = local #/" $PGDATA/postgresql.conf sudo sed -i "s/#max_prepared_transactions = 0/max_prepared_transactions = 100/" $PGDATA/postgresql.conf # Disable trust authentication, requiring MD5 passwords - some tests must fail if a password isn't provided. sudo sh -c "echo 'local all all trust' > $PGDATA/pg_hba.conf" sudo sh -c "echo 'host all npgsql_tests_scram all scram-sha-256' >> $PGDATA/pg_hba.conf" sudo sh -c "echo 'hostssl all npgsql_tests_ssl all md5' >> $PGDATA/pg_hba.conf" sudo sh -c "echo 'hostnossl all npgsql_tests_ssl all reject' >> $PGDATA/pg_hba.conf" sudo sh -c "echo 'hostnossl all npgsql_tests_nossl all md5' >> $PGDATA/pg_hba.conf" sudo sh -c "echo 'hostssl all npgsql_tests_nossl all reject' >> $PGDATA/pg_hba.conf" sudo sh -c "echo 'host all all all md5' >> $PGDATA/pg_hba.conf" sudo sh -c "echo 'host replication all all md5' >> $PGDATA/pg_hba.conf" sudo pg_ctlcluster ${{ matrix.pg_major }} main restart # user 'npgsql_tests_scram' must be created with password encrypted as scram-sha-256 (which only applies after restart) sudo -u postgres psql -c "CREATE USER npgsql_tests_scram SUPERUSER PASSWORD 'npgsql_tests_scram'" # Uncomment the following to SSH into the agent running the build (https://github.com/mxschmitt/action-tmate) #- uses: actions/checkout@v6 #- name: Setup tmate session # uses: mxschmitt/action-tmate@v3 - name: Start PostgreSQL ${{ matrix.pg_major }} (Windows) if: startsWith(matrix.os, 'windows') shell: bash run: | # Find EnterpriseDB version number EDB_VERSION=$(pwsh -c " \$global:progressPreference='silentlyContinue'; Invoke-WebRequest -URI https://www.postgresql.org/applications-v2.xml | Select-Object -ExpandProperty Content | Select-Xml -XPath '/applications/application[id=\"postgresql_${{ matrix.pg_major }}\" and platform=\"windows-x64\"]/version/text()' | Select-Object -First 1 -ExpandProperty Node | Select-Object -ExpandProperty Value") # Install PostgreSQL echo "Installing PostgreSQL (version: ${EDB_VERSION})" curl -o pgsql.zip -L https://get.enterprisedb.com/postgresql/postgresql-${EDB_VERSION}-windows-x64-binaries.zip unzip pgsql.zip -x 'pgsql/include/**' 'pgsql/doc/**' 'pgsql/pgAdmin 4/**' 'pgsql/StackBuilder/**' # Match Npgsql CI Docker image and stash one level up cp $GITHUB_WORKSPACE/.build/{server.crt,server.key,ca.crt} pgsql # Start PostgreSQL pgsql/bin/initdb -D pgsql/PGDATA -E UTF8 -U postgres SOCKET_DIR=$(echo "$LOCALAPPDATA\Temp" | sed 's|\\|/|g') sed -i "s|max_connections = 100|max_connections = 500|" pgsql/PGDATA/postgresql.conf sed -i "s|#unix_socket_directories = ''|unix_socket_directories = '$SOCKET_DIR'|" pgsql/PGDATA/postgresql.conf sed -i "s|#wal_level =|wal_level = logical #|" pgsql/PGDATA/postgresql.conf sed -i "s|#max_wal_senders =|max_wal_senders = 50 #|" pgsql/PGDATA/postgresql.conf sed -i "s|#logical_decoding_work_mem =|logical_decoding_work_mem = 64kB #|" pgsql/PGDATA/postgresql.conf sed -i "s|#wal_sender_timeout =|wal_sender_timeout = 3s #|" pgsql/PGDATA/postgresql.conf sed -i "s|#synchronous_standby_names =|synchronous_standby_names = 'npgsql_test_sync_standby' #|" pgsql/PGDATA/postgresql.conf sed -i "s|#synchronous_commit =|synchronous_commit = local #|" pgsql/PGDATA/postgresql.conf sed -i "s|#max_prepared_transactions = 0|max_prepared_transactions = 100|" pgsql/PGDATA/postgresql.conf pgsql/bin/pg_ctl -D pgsql/PGDATA -l logfile -o '-c ssl=true -c ssl_cert_file=../server.crt -c ssl_key_file=../server.key -c ssl_ca_file=../ca.crt' start # Create npgsql_tests database pgsql/bin/psql -U postgres -c "CREATE DATABASE npgsql_tests" # Create npgsql_tests user with md5 password 'npgsql_tests' pgsql/bin/psql -U postgres -c "CREATE ROLE npgsql_tests SUPERUSER LOGIN PASSWORD 'md5adf74603a5772843f53e812f03dacb02'" pgsql/bin/psql -U postgres -c "CREATE ROLE npgsql_tests_ssl SUPERUSER LOGIN PASSWORD 'npgsql_tests_ssl'" pgsql/bin/psql -U postgres -c "CREATE ROLE npgsql_tests_nossl SUPERUSER LOGIN PASSWORD 'npgsql_tests_nossl'" # user 'npgsql_tests_scram' must be created with password encrypted as scram-sha-256 (which only applies after restart) if [ ${{ matrix.pg_major }} -ge 14 ]; then sed -i "s|password_encryption = md5|password_encryption = scram-sha-256|" pgsql/PGDATA/postgresql.conf else sed -i "s|#password_encryption = md5|password_encryption = scram-sha-256|" pgsql/PGDATA/postgresql.conf fi pgsql/bin/pg_ctl -D pgsql/PGDATA -l logfile -o '-c ssl=true -c ssl_cert_file=../server.crt -c ssl_key_file=../server.key -c ssl_ca_file=../ca.crt' restart pgsql/bin/psql -U postgres -c "CREATE ROLE npgsql_tests_scram SUPERUSER LOGIN PASSWORD 'npgsql_tests_scram'" # Disable trust authentication except for unix domain sockets, requiring MD5 # passwords - some tests must fail if a password isn't provided. if [ ${{ matrix.pg_major }} -ge 13 ]; then echo "local all all trust" > pgsql/PGDATA/pg_hba.conf echo "host all npgsql_tests_scram all scram-sha-256" >> pgsql/PGDATA/pg_hba.conf else echo "host all npgsql_tests_scram all scram-sha-256" > pgsql/PGDATA/pg_hba.conf fi echo "hostssl all npgsql_tests_ssl all md5" >> pgsql/PGDATA/pg_hba.conf echo "hostnossl all npgsql_tests_ssl all reject" >> pgsql/PGDATA/pg_hba.conf echo "hostnossl all npgsql_tests_nossl all md5" >> pgsql/PGDATA/pg_hba.conf echo "hostssl all npgsql_tests_nossl all reject" >> pgsql/PGDATA/pg_hba.conf echo "host all all all md5" >> pgsql/PGDATA/pg_hba.conf echo "host replication all all md5" >> pgsql/PGDATA/pg_hba.conf - name: Start PostgreSQL ${{ matrix.pg_major }} (MacOS) if: startsWith(matrix.os, 'macos') run: | brew update brew install postgresql@${{ matrix.pg_major }} PGDATA=/opt/homebrew/var/postgresql@${{ matrix.pg_major }} sudo sed -i '' 's/#ssl = off/ssl = on/' $PGDATA/postgresql.conf sudo sed -i '' "s/#ssl_ca_file =/ssl_ca_file = 'ca.crt' #/" $PGDATA/postgresql.conf cp $GITHUB_WORKSPACE/.build/{server.crt,server.key,ca.crt} $PGDATA chmod 600 $PGDATA/{server.crt,server.key,ca.crt} postgreService=$(brew services list | grep -oe "postgresql@${{ matrix.pg_major }}\S*") brew services start $postgreService export PATH="/opt/homebrew/opt/postgresql@${{ matrix.pg_major }}/bin:$PATH" echo "Check PostgreSQL service is running" i=5 COMMAND='pg_isready' while [ $i -gt 0 ]; do echo "Check PostgreSQL service status" eval $COMMAND && break ((i--)) if [ $i == 0 ]; then echo "PostgreSQL service not ready, all attempts exhausted" exit 1 fi echo "PostgreSQL service not ready, wait 5 more sec, attempts left: $i" sleep 5 done # Create the npgsql_tests database psql -c "CREATE DATABASE npgsql_tests" postgres # Create npgsql_tests user with md5 password 'npgsql_tests' psql -c "CREATE USER npgsql_tests SUPERUSER PASSWORD 'md5adf74603a5772843f53e812f03dacb02'" postgres psql -c "CREATE USER npgsql_tests_ssl SUPERUSER PASSWORD 'npgsql_tests_ssl'" postgres psql -c "CREATE USER npgsql_tests_nossl SUPERUSER PASSWORD 'npgsql_tests_nossl'" postgres sudo sed -i '' 's/max_connections = 100/max_connections = 500/' $PGDATA/postgresql.conf sudo sed -i '' 's/#password_encryption = md5/password_encryption = scram-sha-256/' $PGDATA/postgresql.conf sudo sed -i '' 's/#wal_level =/wal_level = logical #/' $PGDATA/postgresql.conf sudo sed -i '' 's/#max_wal_senders =/max_wal_senders = 50 #/' $PGDATA/postgresql.conf sudo sed -i '' 's/#logical_decoding_work_mem =/logical_decoding_work_mem = 64kB #/' $PGDATA/postgresql.conf sudo sed -i '' 's/#wal_sender_timeout =/wal_sender_timeout = 3s #/' $PGDATA/postgresql.conf sudo sed -i '' "s/#synchronous_standby_names =/synchronous_standby_names = 'npgsql_test_sync_standby' #/" $PGDATA/postgresql.conf sudo sed -i '' "s/#synchronous_commit =/synchronous_commit = local #/" $PGDATA/postgresql.conf sudo sed -i '' "s/#max_prepared_transactions = 0/max_prepared_transactions = 100/" $PGDATA/postgresql.conf # Disable trust authentication, requiring MD5 passwords - some tests must fail if a password isn't provided. sudo sh -c "echo 'local all all trust' > $PGDATA/pg_hba.conf" sudo sh -c "echo 'hostssl all npgsql_tests_ssl all md5' >> $PGDATA/pg_hba.conf" sudo sh -c "echo 'hostnossl all npgsql_tests_ssl all reject' >> $PGDATA/pg_hba.conf" sudo sh -c "echo 'hostnossl all npgsql_tests_nossl all md5' >> $PGDATA/pg_hba.conf" sudo sh -c "echo 'hostssl all npgsql_tests_nossl all reject' >> $PGDATA/pg_hba.conf" sudo sh -c "echo 'host all npgsql_tests_scram all scram-sha-256' >> $PGDATA/pg_hba.conf" sudo sh -c "echo 'host all all all md5' >> $PGDATA/pg_hba.conf" sudo sh -c "echo 'host replication all all md5' >> $PGDATA/pg_hba.conf" brew services restart $postgreService echo "Check PostgreSQL service is running" i=5 COMMAND='pg_isready' while [ $i -gt 0 ]; do echo "Check PostgreSQL service status" eval $COMMAND && break ((i--)) if [ $i == 0 ]; then echo "PostgreSQL service not ready, all attempts exhausted" exit 1 fi echo "PostgreSQL service not ready, wait 5 more sec, attempts left: $i" sleep 5 done psql -c "CREATE USER npgsql_tests_scram SUPERUSER PASSWORD 'npgsql_tests_scram'" postgres - name: Test run: dotnet test -c ${{ matrix.config }} -f ${{ matrix.test_tfm }} --logger "GitHubActions;report-warnings=false" --blame-crash --blame-hang-timeout 30s shell: bash - name: Upload Test Hang Dumps uses: actions/upload-artifact@v7 if: failure() with: name: test-hang-dumps path: | **/*.dmp **/*_Sequence.xml - id: analyze_tag name: Analyze tag shell: bash run: | if [[ ${{ github.ref }} =~ ^refs/tags/v[0-9]+\.[0-9]+\.[0-9]+ ]]; then echo "Release tag detected" echo "::set-output name=is_release::true" if [[ ${{ github.ref }} =~ ^refs/tags/v[0-9]+\.[0-9]+\.[0-9]+.*- ]]; then echo "Prerelease tag detected" echo "::set-output name=is_prerelease::true" fi fi publish-ci: needs: build runs-on: ubuntu-24.04 if: github.event_name == 'push' && github.repository == 'npgsql/npgsql' environment: myget steps: - name: Checkout uses: actions/checkout@v6 - name: NuGet Cache uses: actions/cache@v5 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Build.targets') }} restore-keys: | ${{ runner.os }}-nuget- - name: Setup .NET Core SDK uses: actions/setup-dotnet@v5.2.0 - name: Pack run: dotnet pack --configuration Release --property:PackageOutputPath="$PWD/nupkgs" --version-suffix "ci.$(date -u +%Y%m%dT%H%M%S)+sha.${GITHUB_SHA:0:9}" -p:ContinuousIntegrationBuild=true - name: Upload artifacts (nupkg) uses: actions/upload-artifact@v7 with: name: Npgsql.CI path: nupkgs - name: Publish packages to MyGet (vnext) if: startsWith(github.ref, 'refs/heads/') && startsWith(github.ref, 'refs/heads/hotfix/') == false run: dotnet nuget push "*.nupkg" --api-key ${{ secrets.MYGET_FEED_TOKEN }} --source https://www.myget.org/F/npgsql-vnext/api/v3/index.json working-directory: nupkgs - name: Publish packages to MyGet (patch) if: startsWith(github.ref, 'refs/heads/hotfix/') run: dotnet nuget push "*.nupkg" --api-key ${{ secrets.MYGET_FEED_TOKEN }} --source https://www.myget.org/F/npgsql/api/v3/index.json working-directory: nupkgs release: needs: build runs-on: ubuntu-24.04 if: github.event_name == 'push' && startsWith(github.repository, 'npgsql/') && needs.build.outputs.is_release == 'true' environment: nuget.org steps: - name: Checkout uses: actions/checkout@v6 - name: Setup .NET Core SDK uses: actions/setup-dotnet@v5.2.0 - name: Pack run: dotnet pack --configuration Release --property:PackageOutputPath="$PWD/nupkgs" -p:ContinuousIntegrationBuild=true - name: Upload artifacts uses: actions/upload-artifact@v7 with: name: Npgsql.Release path: nupkgs # TODO: Create a release - name: Publish to nuget.org run: dotnet nuget push "*.nupkg" --api-key ${{ secrets.NUGET_ORG_API_KEY }} --source https://api.nuget.org/v3/index.json working-directory: nupkgs