Skip to content

Build

Build #2296

Workflow file for this run

name: Build
on:
push:
branches:
- main
- 'hotfix/**'
- 'release/**'
tags:
- v*
pull_request:
env:
dotnet_sdk_version: '6.0.x'
postgis_version: 3
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
# Temporarily disable Windows because of PG installation issues
# os: [ ubuntu-20.04, windows-2019 ]
os: [ ubuntu-20.04 ]
pg_major: [ 16, 15, 14, 13, 12 ]
config: [Release]
include:
- os: ubuntu-20.04
pg_major: 16
config: Debug
# - os: ubuntu-20.04
# pg_major: 17
# config: Release
# pg_prerelease: 'PG Prerelease'
outputs:
is_release: ${{ steps.analyze_tag.outputs.is_release }}
is_prerelease: ${{ steps.analyze_tag.outputs.is_prerelease }}
steps:
- name: Checkout
uses: actions/checkout@v2.4.0
- name: Setup .NET Core SDK
uses: actions/setup-dotnet@v1.8.2
with:
dotnet-version: ${{ env.dotnet_sdk_version }}
- name: Build
run: dotnet build --configuration Debug
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
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main 14" >> /etc/apt/sources.list.d/pgdg.list'
sudo apt-get update -qq
sudo apt-get install -qq postgresql-${{ matrix.pg_major }}
# To disable PostGIS for prereleases (because it usually isn't available until late), surround with the following:
if [ -z "${{ matrix.pg_prerelease }}" ]; then
sudo apt-get install -qq postgresql-${{ matrix.pg_major }}-postgis-${{ env.postgis_version }}
fi
sudo sed -i 's/max_connections = 100/max_connections = 200/g' /etc/postgresql/${{ matrix.pg_major }}/main/postgresql.conf
sudo systemctl restart postgresql
sudo -u postgres psql -c "CREATE USER npgsql_tests SUPERUSER PASSWORD 'npgsql_tests'"
- name: Start PostgreSQL ${{ matrix.pg_major }} (Windows)
if: startsWith(matrix.os, 'windows')
run: |
# Find EnterpriseDB version number
EDB_VERSION=$(\
curl -Ls 'http://sbp.enterprisedb.com/applications.xml' |
sed -n '\#<id>postgresql_${{ matrix.pg_major }}</id>#{n;p;n;p;}' |
sed -n '\#<platform>windows-x64</platform>#{n;p;}' |
sed -E 's#.*<version>([^<]+)</version>#\1#')
# 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,pgsql}/server.crt
cp {$GITHUB_WORKSPACE/.build,pgsql}/server.key
# Find OSGEO version number
OSGEO_VERSION=$(\
curl -Ls https://download.osgeo.org/postgis/windows/pg${{ matrix.pg_major }} |
sed -n 's/.*>postgis-bundle-pg${{ matrix.pg_major }}-\(${{ env.postgis_version }}.[0-9]*.[0-9]*\)x64.zip<.*/\1/p')
# Install PostGIS
echo "Installing PostGIS (version: ${OSGEO_VERSION})"
POSTGIS_FILE="postgis-bundle-pg${{ matrix.pg_major }}-${OSGEO_VERSION}x64"
curl -o postgis.zip -L https://download.osgeo.org/postgis/windows/pg${{ matrix.pg_major }}/${POSTGIS_FILE}.zip
unzip postgis.zip -d postgis
cp -a postgis/$POSTGIS_FILE/. pgsql/
# Start PostgreSQL
pgsql/bin/initdb -D pgsql/PGDATA -E UTF8 -U postgres
pgsql/bin/pg_ctl -D pgsql/PGDATA -l logfile -o '-c max_connections=200 -c max_prepared_transactions=10 -c ssl=true -c ssl_cert_file=../server.crt -c ssl_key_file=../server.key' start
# Configure test account
pgsql/bin/psql -U postgres -c "CREATE ROLE npgsql_tests SUPERUSER LOGIN PASSWORD 'npgsql_tests'"
pgsql/bin/psql -U postgres -c "CREATE DATABASE npgsql_tests OWNER npgsql_tests"
shell: bash
- name: Test
run: dotnet test -c ${{ matrix.config }} --logger "GitHubActions;report-warnings=false"
shell: bash
- 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-20.04
if: github.event_name == 'push' && startsWith(github.repository, 'npgsql/')
environment: myget
steps:
- name: Checkout
uses: actions/checkout@v2.4.0
- name: Setup .NET Core SDK
uses: actions/setup-dotnet@v1.8.2
with:
dotnet-version: ${{ env.dotnet_sdk_version }}
- name: Pack
run: dotnet pack --configuration Release --output nupkgs --version-suffix "ci.$(date -u +%Y%m%dT%H%M%S)+sha.${GITHUB_SHA:0:9}" -p:ContinuousIntegrationBuild=true
- name: Upload artifacts
uses: actions/upload-artifact@v2.2.4
with:
name: EFCore.PG.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-unstable/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-20.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@v2.4.0
- name: Setup .NET Core SDK
uses: actions/setup-dotnet@v1.8.2
with:
dotnet-version: ${{ env.dotnet_sdk_version }}
- name: Pack
run: dotnet pack --configuration Release --output nupkgs -p:ContinuousIntegrationBuild=true
- name: Upload artifacts
uses: actions/upload-artifact@v2.2.4
with:
name: EFCore.PG.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