-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix and update GitHub action workflow.
- Loading branch information
Showing
4 changed files
with
285 additions
and
288 deletions.
There are no files selected for viewing
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,283 @@ | ||
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: false | ||
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.31-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 | ||
$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 }}\${{ env.databaseServerType }} | ||
key: database-windows-${{ env.databaseServerType }}-${{ env.databaseServerVersion }}-v2 | ||
- 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\mysql\current\bin' | ||
$mySqlIniPath = 'C:\tools\mysql\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' | ||
echo "Chocolatey command: choco install '${{ env.databaseServerType }}' '--version=${{ env.databaseServerVersion }}' --params `"/serviceName:$mySqlServiceName`"" | ||
choco install '${{ env.databaseServerType }}' '--version=${{ env.databaseServerVersion }}' --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 |
Oops, something went wrong.