Skip to content

Test custom chocolatey packages. #22

Test custom chocolatey packages.

Test custom chocolatey packages. #22

Workflow file for this run

name: Build
on:
push:
branches:
- '**'
paths-ignore:
- '**.md'
pull_request:
branches:
- '**'
paths-ignore:
- '**.md'
env:
isPullRequest: ${{ github.event_name == 'pull_request' }}
pullRequestSourceBranch: ${{ github.ref }}
mysqlCurrentSqlMode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
mysqlLegacySqlMode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# Currently no ONLY_FULL_GROUP_BY, see #1167:
mariadbSqlMode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
maxConnections: 512
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: 1
skipAllTests: true
skipWindowsTests: false
jobs:
BuildAndTest:
strategy:
fail-fast: false
matrix:
dbVersion:
- 8.0.34-mysql
- 5.7.43-mysql
- 11.1.2-mariadb
- 11.0.3-mariadb
- 10.11.5-mariadb
- 10.10.6-mariadb
- 10.6.15-mariadb
- 10.5.22-mariadb
- 10.4.31-mariadb
os:
- ubuntu-latest
include:
- os: windows-latest
dbVersion: 8.0.34-mysql
- os: windows-latest
dbVersion: 5.7.43-mysql
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- name: Set additional variables
shell: pwsh
run: |
$os = '${{ matrix.os }}'.Split('-')[0] -eq 'windows' ? 'windows' : 'linux'
echo "os=$os" >> $env:GITHUB_ENV
$dbVersionParts = '${{ matrix.dbVersion }}'.Split('-')
$databaseServerType = $dbVersionParts[1]
echo "databaseServerType=$databaseServerType" >> $env:GITHUB_ENV
$databaseServerVersion = $dbVersionParts[0]
echo "databaseServerVersion=$databaseServerVersion" >> $env:GITHUB_ENV
# The parenthesis around the second OR argument is mandatory for the expression to work correctly, because in PowerShell, AND and OR
# operators have the SAME precedence.
$skipTests = '${{ env.skipAllTests }}' -eq 'true' -or ($os -eq 'windows' -and '${{ env.skipWindowsTests }}' -eq 'true')
echo "skipTests=$skipTests" >> $env:GITHUB_ENV
$sqlMode = $databaseServerType -eq 'mariadb' ? '${{ env.mariadbSqlMode }}' : $databaseServerType -eq 'mysql' -and $databaseServerVersion.Split('.')[0] -lt 8 ? '${{ env.mysqlLegacySqlMode }}' : '${{ env.mysqlCurrentSqlMode }}'
echo "sqlMode=$sqlMode" >> $env:GITHUB_ENV
$clientExecutable = $databaseServerType -eq 'mariadb' -and $databaseServerVersion.Split('.')[0] -ge 11 ? 'mariadb' : 'mysql'
echo "clientExecutable=$clientExecutable" >> $env:GITHUB_ENV
$clientCommandPrefix = $os -eq 'windows' ? $clientExecutable : "docker exec '$databaseServerType' $clientExecutable"
echo "clientCommandPrefix=$clientCommandPrefix" >> $env:GITHUB_ENV
$windowsUserTempLocation = $os -eq 'windows' ? (Get-Item $env:Temp).FullName : ''
echo "windowsUserTempLocation=$windowsUserTempLocation" >> $env:GITHUB_ENV
- name: Output Variables
shell: pwsh
run: |
echo "pullRequestSourceBranch: ${{ env.pullRequestSourceBranch }}"
echo "isPullRequest: ${{ env.isPullRequest }}"
echo "os: ${{ env.os }}"
echo "databaseServerType: ${{ env.databaseServerType }}"
echo "databaseServerVersion: ${{ env.databaseServerVersion }}"
echo "sqlMode: ${{ env.sqlMode }}"
echo "skipTests: ${{ env.skipTests }}"
echo "skipAllTests: ${{ env.skipAllTests }}"
echo "skipWindowsTests: ${{ env.skipWindowsTests }}"
echo "clientExecutable: ${{ env.clientExecutable }}"
echo "clientCommandPrefix: ${{ env.clientCommandPrefix }}"
echo "windowsUserTempLocation: ${{ env.windowsUserTempLocation }}"
- name: Setup .NET SDK
uses: actions/setup-dotnet@v3
with:
global-json-file: global.json
- name: .NET Information
shell: pwsh
run: |
dotnet --info
- name: Install EF Core Tools
shell: pwsh
run: |
dotnet tool restore
dotnet ef --version
- name: Cache - Database Image - Linux
id: cache-databaseImage-linux
uses: actions/cache@v3
if: ${{ env.os == 'linux' }}
with:
path: cache/database
key: database-linux-${{ env.databaseServerType }}-${{ env.databaseServerVersion }}-v2
- name: Cache - Database Image - Windows
id: cache-databaseImage-windows
uses: actions/cache@v3
if: ${{ env.os == 'windows' }}
with:
path: ${{ env.windowsUserTempLocation }}\Pomelo.Chocolatey.${{ env.databaseServerType }}.Server
key: database-windows-${{ env.databaseServerType }}-${{ env.databaseServerVersion }}-v3
- name: Install Database Server - Linux
if: ${{ env.os == 'linux' }}
shell: pwsh
run: |
sudo systemctl stop mysql
$waitMinutes = 5
$pollingIntervalSeconds = 1
$started = $false
dir './cache/database' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName
if (Test-Path -PathType Leaf './cache/database/${{ env.databaseServerType }}_${{ env.databaseServerVersion }}.tar')
{
docker load --input './cache/database/${{ env.databaseServerType }}_${{ env.databaseServerVersion }}.tar'
}
else
{
if (-not (Test-Path -PathType Container './cache/database'))
{
New-Item -ItemType Directory './cache/database'
}
docker pull '${{ env.databaseServerType }}:${{ env.databaseServerVersion }}'
docker save -o './cache/database/${{ env.databaseServerType }}_${{ env.databaseServerVersion }}.tar' '${{ env.databaseServerType }}:${{ env.databaseServerVersion }}'
dir './cache/database' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName
}
docker run --name '${{ env.databaseServerType }}' -e MYSQL_ROOT_PASSWORD=Password12! -p 127.0.0.1:3306:3306 -d '${{ env.databaseServerType }}:${{ env.databaseServerVersion }}'
$startTime = Get-Date
while (!($started = ${{ env.clientCommandPrefix }} --protocol=tcp -h localhost -P 3306 -u root -pPassword12! -e 'select 1;') -and ((Get-Date) - $startTime).TotalMinutes -lt $waitMinutes)
{
Start-Sleep -Seconds $pollingIntervalSeconds
}
if (!$started)
{
throw "${{ env.databaseServerType }}:${{ env.databaseServerVersion }} docker container failed to start in ${waitMinutes} minutes"
exit 1
}
- name: Install Database Server - Windows
if: ${{ env.os == 'windows' }}
shell: pwsh
run: |
$mySqlServiceName = '${{ env.databaseServerType }}_${{ env.databaseServerVersion }}'
$lowerCaseTableNames = 2
$mySqlBinPath = 'C:\tools\Pomelo.Chocolatey.${{ env.databaseServerType }}.Server\current\bin'
$mySqlIniPath = 'C:\tools\Pomelo.Chocolatey.${{ env.databaseServerType }}.Server\current\my.ini'
$mySqlDataPath = 'C:\ProgramData\MySQL\data'
dir "$env:Temp\${{ env.databaseServerType }}\${{ env.databaseServerVersion }}" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName
$service = Get-Service '*${{ env.databaseServerType }}*' -ErrorAction SilentlyContinue
if ($service -ne $null)
{
throw "A service for ${{ env.databaseServerType }} appears to already exist."
exit 1
}
# choco config set cacheLocation '$(Pipeline.Workspace)/cache/database'
choco install 'Pomelo.Chocolatey.${{ env.databaseServerType }}.Server' '--version=${{ env.databaseServerVersion }}' --source 'https://www.myget.org/F/pomelo/api/v2;https://community.chocolatey.org/api/v2' --params "/serviceName:$mySqlServiceName"
Get-Service '*${{ env.databaseServerType }}*' -ErrorAction SilentlyContinue
Stop-Service $mySqlServiceName -Verbose
echo "Update PATH environment variable"
$env:PATH = "$mySqlBinPath;$env:PATH"
echo "Update configuration file"
"lower_case_table_names=$lowerCaseTableNames" >> $mySqlIniPath
Remove-Item $mySqlDataPath/* -Recurse -Force -Verbose
echo "Reinitialize database server"
mysqld --defaults-file="$mySqlIniPath" --initialize-insecure
Start-Service $mySqlServiceName -Verbose
echo "Setup credentials"
${{ env.clientCommandPrefix }} -h localhost -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'Password12!';"
${{ env.clientCommandPrefix }} -h localhost -u root -pPassword12! -e "SELECT @@version;"
dir "$env:Temp\${{ env.databaseServerType }}\${{ env.databaseServerVersion }}" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName
- name: Setup Database
shell: pwsh
run: ${{ env.clientCommandPrefix }} -u root -pPassword12! -e "SET GLOBAL sql_mode = '${{ env.sqlMode }}'; SET GLOBAL max_connections = ${{ env.maxConnections }};"
- name: Database Information
shell: pwsh
run: ${{ env.clientCommandPrefix }} -u root -pPassword12! -e 'SHOW VARIABLES;'
- name: Restore dependencies
shell: pwsh
run: dotnet restore
- name: Setup Solution
shell: pwsh
run: |
Copy-Item test/EFCore.MySql.FunctionalTests/config.json.example test/EFCore.MySql.FunctionalTests/config.json
Copy-Item test/EFCore.MySql.IntegrationTests/appsettings.ci.json test/EFCore.MySql.IntegrationTests/appsettings.json
Copy-Item test/EFCore.MySql.IntegrationTests/config.json.example test/EFCore.MySql.IntegrationTests/config.json
- name: Setup Integration Tests
shell: pwsh
run: |
./test/EFCore.MySql.IntegrationTests/scripts/rebuild.ps1
- name: Build Solution
shell: pwsh
run: |
dotnet build -c Debug
dotnet build -c Release
- name: Functional Tests
if: ${{ env.skipTests != 'true' }}
shell: pwsh
run: dotnet test test/EFCore.MySql.FunctionalTests -c Debug --no-build --logger "GitHubActions;report-warnings=false" --verbosity detailed
- name: Tests
if: ${{ env.skipTests != 'true' }}
shell: pwsh
run: dotnet test --logger "GitHubActions;report-warnings=false" test/EFCore.MySql.Tests
- name: Integration Tests - Applying migrations
if: ${{ env.skipTests != 'true' }}
shell: pwsh
run: dotnet run --project test/EFCore.MySql.IntegrationTests -c Release testMigrate
- name: Integration Tests - Scaffolding
if: ${{ env.skipTests != 'true' }}
shell: pwsh
run: ./test/EFCore.MySql.IntegrationTests/scripts/scaffold.ps1
- name: Integration Tests - With EF_BATCH_SIZE = 1
if: ${{ env.skipTests != 'true' }}
shell: pwsh
run: |
$env:EF_BATCH_SIZE = "1"
dotnet test -c Release --no-build --logger "GitHubActions;report-warnings=false" test/EFCore.MySql.IntegrationTests
- name: Integration Tests - With EF_BATCH_SIZE = 10
if: ${{ env.skipTests != 'true' }}
shell: pwsh
run: |
$env:EF_BATCH_SIZE = "10"
dotnet test -c Release --no-build --logger "GitHubActions;report-warnings=false" test/EFCore.MySql.IntegrationTests
- name: Integration Tests - With EF_BATCH_SIZE = 1
if: ${{ env.skipTests != 'true' }}
shell: pwsh
run: |
$env:EF_RETRY_ON_FAILURE = "3"
dotnet test -c Release --no-build --logger "GitHubActions;report-warnings=false" test/EFCore.MySql.IntegrationTests
- name: Integration Tests - Legacy migrations
if: ${{ env.skipTests != 'true' }}
shell: pwsh
run: ./test/EFCore.MySql.IntegrationTests/scripts/legacy.ps1
- name: Integration Tests - Building migrations with EF_DATABASE = pomelo_test2
if: ${{ env.skipTests != 'true' }}
shell: pwsh
run: |
$env:EF_DATABASE = "pomelo_test2"
dotnet build ./test/EFCore.MySql.IntegrationTests -c Release
- name: Integration Tests - Setup migrations with EF_DATABASE = pomelo_test2
if: ${{ env.skipTests != 'true' }}
shell: pwsh
run: |
$env:EF_DATABASE = "pomelo_test2"
./test/EFCore.MySql.IntegrationTests/scripts/rebuild.ps1
- name: Integration Tests - With EF_DATABASE = pomelo_test2
if: ${{ env.skipTests != 'true' }}
shell: pwsh
run: |
$env:EF_DATABASE = "pomelo_test2"
dotnet test -c Release --no-build --logger "GitHubActions;report-warnings=false" test/EFCore.MySql.IntegrationTests