-
Notifications
You must be signed in to change notification settings - Fork 35
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix auto commit for pull requests by using multiple workflows.
- Loading branch information
Showing
2 changed files
with
337 additions
and
43 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,288 @@ | ||
name: PullRequest | ||
on: | ||
pull_request: | ||
branches: | ||
- '**' | ||
paths-ignore: | ||
- '**.md' | ||
env: | ||
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true | ||
DOTNET_CLI_TELEMETRY_OPTOUT: true | ||
DOTNET_NOLOGO: true | ||
buildConfiguration: 'Debug' | ||
skipTests: false | ||
deterministicTests: true | ||
autoCommitGreenTests: true | ||
uploadTestResults: false | ||
jobs: | ||
Preconditions: | ||
runs-on: ubuntu-latest | ||
outputs: | ||
lastCommitIsAutoCommit: ${{ steps.GetHeadCommitInfo.outputs.lastCommitIsAutoCommit }} | ||
lastCommitCreatedBeforeSeconds: ${{ steps.GetHeadCommitInfo.outputs.lastCommitCreatedBeforeSeconds }} | ||
steps: | ||
- name: 'General Information' | ||
shell: pwsh | ||
run: | | ||
echo 'EventName: ${{ github.event_name }}' | ||
# - name: 'Log Event Context' | ||
# shell: pwsh | ||
# run: | | ||
# echo '${{ toJson(github.event) }}' | ||
- name: Checkout | ||
uses: actions/checkout@v3 | ||
with: | ||
fetch-depth: 2 | ||
- name: 'Get Head Commit Info' | ||
id: GetHeadCommitInfo | ||
shell: pwsh | ||
run: | | ||
git log -2 --pretty=%B | ||
$headCommitMessage = git log -1 --skip 1 --pretty=%B | ||
echo "headCommitMessage: = $headCommitMessage" | ||
$headCommitAuthorName = git log -1 --skip 1 --pretty=%an | ||
echo "headCommitAuthorName: = $headCommitAuthorName" | ||
$headCommitAuthorEmail = git log -1 --skip 1 --pretty=%ae | ||
echo "headCommitAuthorEmail: = $headCommitAuthorEmail" | ||
$headCommitDateTime = Get-Date (git log -1 --skip 1 --pretty=%ci) | ||
echo "headCommitDateTime: = $headCommitDateTime" | ||
$lastCommitIsAutoCommit = $headCommitAuthorEmail -eq 'github-actions@github.com' -and $headCommitMessage -eq '[GitHub Actions] Update green tests.' | ||
echo "lastCommitIsAutoCommit=$lastCommitIsAutoCommit" >> $env:GITHUB_OUTPUT | ||
echo "lastCommitIsAutoCommit: = $lastCommitIsAutoCommit" | ||
$lastCommitCreatedBeforeSeconds = [int]((Get-Date) - $headCommitDateTime).TotalSeconds | ||
echo "lastCommitCreatedBeforeSeconds=$lastCommitCreatedBeforeSeconds" >> $env:GITHUB_OUTPUT | ||
echo "lastCommitCreatedBeforeSeconds: = $lastCommitCreatedBeforeSeconds" | ||
BuildAndTest: | ||
needs: Preconditions | ||
if: needs.Preconditions.outputs.lastCommitIsAutoCommit != 'true' || needs.Preconditions.outputs.lastCommitCreatedBeforeSeconds > 300 | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
aceVersion: | ||
- 2010 | ||
- 2016 | ||
aceArchitecture: | ||
- x64 | ||
- x86 | ||
dataAccessProviderType: | ||
- ODBC | ||
- OLE DB | ||
os: | ||
- windows-latest | ||
runs-on: ${{ matrix.os }} | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v3 | ||
- name: Set additional variables | ||
shell: pwsh | ||
run: | | ||
$os = '${{ matrix.os }}'.Split('-')[0] | ||
echo "os=$os" >> $env:GITHUB_ENV | ||
$dotnetInstallDirectory = '.\.dotnet_${{ matrix.aceArchitecture }}' | ||
echo "dotnetInstallDirectory=$dotnetInstallDirectory" >> $env:GITHUB_ENV | ||
$dotnetExecutable = Join-Path $dotnetInstallDirectory 'dotnet.exe' | ||
echo "dotnetExecutable=$dotnetExecutable" >> $env:GITHUB_ENV | ||
$aceUrls = @{ | ||
'2010' = @{ | ||
'x64' = 'https://download.microsoft.com/download/2/4/3/24375141-E08D-4803-AB0E-10F2E3A07AAA/AccessDatabaseEngine_X64.exe' | ||
'x86' = 'https://download.microsoft.com/download/2/4/3/24375141-E08D-4803-AB0E-10F2E3A07AAA/AccessDatabaseEngine.exe' | ||
'silent' = '/passive /quiet /norestart REBOOT=ReallySuppress' | ||
} | ||
'2016' = @{ | ||
'x64' = 'https://download.microsoft.com/download/3/5/C/35C84C36-661A-44E6-9324-8786B8DBE231/AccessDatabaseEngine_X64.exe' | ||
'x86' = 'https://download.microsoft.com/download/3/5/C/35C84C36-661A-44E6-9324-8786B8DBE231/AccessDatabaseEngine.exe' | ||
'silent' = '/passive /quiet /norestart REBOOT=ReallySuppress' | ||
} | ||
} | ||
$aceUrl = $aceUrls['${{ matrix.aceVersion }}']['${{ matrix.aceArchitecture }}'] | ||
echo "aceUrl=$aceUrl" >> $env:GITHUB_ENV | ||
$aceSilentInstallArgument = $aceUrls['${{ matrix.aceVersion }}']['silent'] | ||
echo "aceSilentInstallArgument=$aceSilentInstallArgument" >> $env:GITHUB_ENV | ||
$defaultConnection = '${{ matrix.dataAccessProviderType }}' -eq 'ODBC' ? 'DBQ=Jet.accdb' : 'Data Source=Jet.accdb;Persist Security Info=False;' | ||
echo "defaultConnection=$defaultConnection" >> $env:GITHUB_ENV | ||
- name: Output Variables | ||
shell: pwsh | ||
run: | | ||
echo "os: ${{ env.os }}" | ||
echo "buildConfiguration: ${{ env.buildConfiguration }}" | ||
echo "aceVersion: ${{ matrix.aceVersion }}" | ||
echo "aceArchitecture: ${{ matrix.aceArchitecture }}" | ||
echo "aceUrl: ${{ env.aceUrl }}" | ||
echo "aceSilentInstallArgument: ${{ env.aceSilentInstallArgument }}" | ||
echo "dataAccessProviderType: ${{ matrix.dataAccessProviderType }}" | ||
echo "defaultConnection: ${{ env.defaultConnection }}" | ||
echo "skipTests: ${{ env.skipTests }}" | ||
echo "dotnetInstallDirectory: ${{ env.dotnetInstallDirectory }}" | ||
echo "dotnetExecutable: ${{ env.dotnetExecutable }}" | ||
echo "github.event_name: ${{ github.event_name }}" | ||
echo "github.repository: ${{ github.repository }}" | ||
- name: .NET Information Before SDK Install | ||
shell: pwsh | ||
run: try { & '${{ env.dotnetExecutable }}' --info } catch { echo 'No ${{ matrix.aceArchitecture }} .NET SDK installed.' } | ||
- name: Install .NET SDK | ||
shell: pwsh | ||
run: | | ||
&([scriptblock]::Create((Invoke-WebRequest -UseBasicParsing 'https://dot.net/v1/dotnet-install.ps1'))) -JSonFile global.json -Architecture '${{ matrix.aceArchitecture }}' -InstallDir '${{ env.dotnetInstallDirectory }}' -Verbose | ||
- name: .NET Information After SDK Install | ||
shell: pwsh | ||
run: try { & '${{ env.dotnetExecutable }}' --info } catch { echo 'No ${{ matrix.aceArchitecture }} .NET SDK installed.' } | ||
- name: ACE Information Before ACE Install | ||
shell: pwsh | ||
run: | | ||
'DAO:' | ||
Get-ChildItem 'HKLM:\SOFTWARE\Classes\DAO.DBEngine*' | Select-Object | ||
'OLE DB:' | ||
foreach ($provider in [System.Data.OleDb.OleDbEnumerator]::GetRootEnumerator()) | ||
{ | ||
$v = New-Object PSObject | ||
for ($i = 0; $i -lt $provider.FieldCount; $i++) | ||
{ | ||
Add-Member -in $v NoteProperty $provider.GetName($i) $provider.GetValue($i) | ||
} | ||
$v | ||
} | ||
- name: Install Access Database Engine | ||
shell: pwsh | ||
run: | | ||
$setupFileName = 'AccessDatabaseEngine_${{ matrix.aceVersion }}_${{ matrix.aceArchitecture }}.exe' | ||
Invoke-WebRequest '${{ env.aceUrl }}' -OutFile $setupFileName | ||
& ".\$setupFileName" ${{ env.aceSilentInstallArgument }} | Out-Default | ||
- name: ACE Information After ACE Install | ||
shell: pwsh | ||
run: | | ||
'DAO:' | ||
Get-ChildItem 'HKLM:\SOFTWARE\Classes\DAO.DBEngine*' | Select-Object | ||
'OLE DB:' | ||
foreach ($provider in [System.Data.OleDb.OleDbEnumerator]::GetRootEnumerator()) | ||
{ | ||
$v = New-Object PSObject | ||
for ($i = 0; $i -lt $provider.FieldCount; $i++) | ||
{ | ||
Add-Member -in $v NoteProperty $provider.GetName($i) $provider.GetValue($i) | ||
} | ||
$v | ||
} | ||
- name: Build Solution | ||
shell: pwsh | ||
run: | | ||
& '${{ env.dotnetExecutable }}' build --configuration '${{ env.buildConfiguration }}' | ||
- name: 'Run Tests: EFCore.Jet.Data.Tests' | ||
if: env.skipTests != 'true' | ||
shell: pwsh | ||
run: | | ||
$env:EFCoreJet_DefaultConnection = '${{ env.defaultConnection }}' | ||
& '${{ env.dotnetExecutable }}' test .\test\EFCore.Jet.Data.Tests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --logger trx --verbosity detailed --blame-hang-timeout 3m | ||
- name: 'Run Tests: EFCore.Jet.FunctionalTests' | ||
if: env.skipTests != 'true' | ||
shell: pwsh | ||
run: | | ||
$env:EFCoreJet_DefaultConnection = '${{ env.defaultConnection }}' | ||
& '${{ env.dotnetExecutable }}' test .\test\EFCore.Jet.FunctionalTests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --logger trx --verbosity detailed --blame-hang-timeout 3m | ||
exit 0 | ||
- name: 'Run Tests: EFCore.Jet.Tests' | ||
if: env.skipTests != 'true' | ||
shell: pwsh | ||
run: | | ||
$env:EFCoreJet_DefaultConnection = '${{ env.defaultConnection }}' | ||
& '${{ env.dotnetExecutable }}' test .\test\EFCore.Jet.Tests --configuration '${{ env.buildConfiguration }}' -p:FixedTestOrder=${{ env.deterministicTests }} --logger trx --verbosity detailed --blame-hang-timeout 3m | ||
- name: 'Upload Test Results' | ||
if: env.skipTests != 'true' && env.uploadTestResults == 'true' | ||
uses: actions/upload-artifact@v3 | ||
with: | ||
name: test-results | ||
path: | | ||
test\EFCore.Jet.Data.Tests\TestResults | ||
test\EFCore.Jet.FunctionalTests\TestResults | ||
test\EFCore.Jet.Tests\TestResults | ||
- name: 'Check Tests: EFCore.Jet.FunctionalTests' | ||
if: env.skipTests != 'true' | ||
shell: pwsh | ||
run: | | ||
# Create text file with all tests that passed. | ||
$testResultsDir = '.\test\EFCore.Jet.FunctionalTests\TestResults' | ||
$currentTestRunTrx = Get-ChildItem $testResultsDir -Filter '*.trx' | Sort-Object LastWriteTime | Select-Object -Last 1 | ||
if ($null -eq $currentTestRunTrx) { | ||
echo "Test runner crashed." | ||
exit 2 | ||
} | ||
$allTestsFilePath = Join-Path $currentTestRunTrx.DirectoryName ($currentTestRunTrx.BaseName + '_All.txt') | ||
(Select-Xml -Path $currentTestRunTrx.FullName -XPath "//ns:UnitTestResult" -Namespace @{"ns"="http://microsoft.com/schemas/VisualStudio/TeamTest/2010"}).Node | Sort-Object -Property testName -CaseSensitive | ForEach-Object { "$($_.outcome -eq 'Passed' ? 'P' : $_.outcome -eq 'NotExecuted' ? 'N' : $_.outcome -eq 'Failed' ? 'F' : 'U') $($_.testName)" } | Add-Content $allTestsFilePath | ||
$greenTestsFilePath = Join-Path $currentTestRunTrx.DirectoryName ($currentTestRunTrx.BaseName + '_Passed.txt') | ||
Get-Content $allTestsFilePath | Where-Object { $_.StartsWith('P ') } | ForEach-Object { $_.Substring(2) } | Add-Content $greenTestsFilePath | ||
# Compare test file against previously committed file. | ||
$establishedGreenTestsFilePath = ".\test\EFCore.Jet.FunctionalTests\GreenTests\ace_${{ matrix.aceVersion }}_$('${{ matrix.dataAccessProviderType }}'.Replace(' ', '').ToLowerInvariant())_${{ matrix.aceArchitecture }}.txt" | ||
if (Test-Path $establishedGreenTestsFilePath) { | ||
$notGreenAnymore = Compare-Object (Get-Content $establishedGreenTestsFilePath) (Get-Content $greenTestsFilePath) | Where-Object { $_.SideIndicator -eq '<=' } | Select-Object -ExpandProperty InputObject | ||
if ($null -ne $notGreenAnymore) { | ||
echo "`nThe following $(@($notGreenAnymore).Length) tests passed in previous runs, but didn't pass in this run:`n" | ||
$notGreenAnymore | ||
exit 1 | ||
} | ||
echo 'All tests that passed in previous runs still passed in this run.' | ||
Copy-Item $greenTestsFilePath $establishedGreenTestsFilePath -Force -Verbose | ||
$commitGreenTestsFile = $establishedGreenTestsFilePath | ||
echo "commitGreenTestsFile=$commitGreenTestsFile" >> $env:GITHUB_ENV | ||
} | ||
echo 'Check succeeded.' | ||
- name: 'Upload Green Tests' | ||
if: env.commitGreenTestsFile != '' | ||
uses: actions/upload-artifact@v3 | ||
with: | ||
name: green-tests | ||
path: ${{ env.commitGreenTestsFile }} | ||
CheckArtifacts: | ||
needs: BuildAndTest | ||
runs-on: ubuntu-latest | ||
outputs: | ||
hasGreenTestsArtifacts: ${{ steps.CheckGreenTestsArtifacts.outputs.hasGreenTestsArtifacts }} | ||
steps: | ||
- name: 'Download Green Tests' | ||
uses: actions/download-artifact@v3 | ||
continue-on-error: true | ||
with: | ||
name: green-tests | ||
path: green-tests | ||
- name: 'Check Green Tests Artifacts' | ||
id: CheckGreenTestsArtifacts | ||
shell: pwsh | ||
run: | | ||
dir -Recurse | Select-Object -ExpandProperty FullName | ||
$hasGreenTestsArtifacts = (Test-Path 'green-tests') -and (Get-ChildItem 'green-tests').Length -gt 0 | ||
echo "hasGreenTestsArtifacts=$hasGreenTestsArtifacts" >> $env:GITHUB_OUTPUT | ||
echo "hasGreenTestsArtifacts: $hasGreenTestsArtifacts" | ||
Status: | ||
needs: CheckArtifacts | ||
if: needs.CheckArtifacts.outputs.hasGreenTestsArtifacts != 'true' | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: 'Final Status' | ||
shell: pwsh | ||
run: | | ||
echo '${{ toJson(needs) }}' | ||
echo 'needs.CheckArtifacts.outputs.hasGreenTestsArtifacts: ${{ needs.CheckArtifacts.outputs.hasGreenTestsArtifacts }}' | ||
echo 'All workflows succeeded.' | ||
exit 0 |
Oops, something went wrong.