You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ni...@apache.org on 2020/11/21 09:06:53 UTC

[lucenenet] 04/05: Added Generate-TestWorkflows.ps1 script to generate GitHub Actions workflow files based on project dependencies

This is an automated email from the ASF dual-hosted git repository.

nightowl888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucenenet.git

commit 744ff1c86114c152e2bcc387bc1a03f5f56dff12
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Fri Nov 20 18:05:01 2020 +0700

    Added Generate-TestWorkflows.ps1 script to generate GitHub Actions workflow files based on project dependencies
---
 .github/workflows/Generate-TestWorkflows.ps1 | 312 +++++++++++++++++++++++++++
 1 file changed, 312 insertions(+)

diff --git a/.github/workflows/Generate-TestWorkflows.ps1 b/.github/workflows/Generate-TestWorkflows.ps1
new file mode 100644
index 0000000..14cb928
--- /dev/null
+++ b/.github/workflows/Generate-TestWorkflows.ps1
@@ -0,0 +1,312 @@
+# -----------------------------------------------------------------------------------
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the ""License""); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an ""AS IS"" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# -----------------------------------------------------------------------------------
+
+<#
+ .SYNOPSIS
+    Generates GitHub Actions workflows for running tests upon a pull request action (either a
+    new pull request or a push to an existing one).
+
+ .DESCRIPTION
+    Generates 1 GitHub Actions workflow file for each project containing the string ".Tests"
+    in the name. The current project, ProjectReference dependencies, and common files
+    Directory.Build.*, TestTargetFraemworks.*, TestReferences.Common.* and Dependencies.props
+    are all used to build filter paths to determine when the workflow will run.
+
+ .PARAMETER OutputDirectory
+    The directory to output the files. This should be in a directory named /.github/workflows
+    in the root of the repository. The default is the directory of this script file.
+
+ .PARAMETER RepoRoot
+    The directory of the repository root. Defaults to two levels above the directory
+    of this script file.
+
+ .PARAMETER TestFrameworks
+    A string array of Dotnet target framework monikers to run the tests on. The default is
+    @('net5.0','netcoreapp2.1','net48').
+
+ .PARAMETER OperatingSystems
+    A string array of Github Actions operating system monikers to run the tests on.
+    The default is @('windows-latest', 'ubuntu-latest').
+
+ .PARAMETER TestPlatforms
+    A string array of platforms to run the tests on. Valid values are x64 and x86.
+    The default is @('x64').
+
+ .PARAMETER Configurations
+    A string array of build configurations to run the tests on. The default is @('Release').
+
+ .PARAMETER DotNet5SDKVersion
+    The SDK version of .NET 5.x to install on the build agent to be used for building and
+    testing. This SDK is always installed on the build agent. The default is 5.0.100.
+
+ .PARAMETER DotNetCore3SDKVersion
+    The SDK version of .NET Core 3.x to install on the build agent to be used for building and
+    testing. This SDK is only installed on the build agent when targeting .NET Core 3.x.
+    The default is 3.1.404.
+
+ .PARAMETER DotNetCore2SDKVersion
+    The SDK version of .NET Core 2.x to install on the build agent to be used for building and
+    testing. This SDK is only installed on the build agent when targeting .NET Core 2.x.
+    The default is 2.1.811.
+#>
+param(
+    [string]$OutputDirectory =  $PSScriptRoot,
+
+    [string]$RepoRoot = (Split-Path (Split-Path $PSScriptRoot)),
+
+    [string[]]$TestFrameworks = @('net5.0','netcoreapp2.1','net48'),
+
+    [string[]]$OperatingSystems = @('windows-latest', 'ubuntu-latest'),
+
+    [string[]]$TestPlatforms = @('x64'),
+
+    [string[]]$Configurations = @('Release'),
+
+    [string]$DotNet5SDKVersion = '5.0.100',
+
+    [string]$DotNetCore3SDKVersion = '3.1.404',
+
+    [string]$DotNetCore2SDKVersion = '2.1.811'
+)
+
+
+function Resolve-RelativePath([string]$RelativeRoot, [string]$Path) {
+    Push-Location -Path $RelativeRoot
+    try {
+        return Resolve-Path $Path -Relative
+    } finally {
+        Pop-Location
+    }
+}
+
+function Get-ProjectDependencies([string]$ProjectPath, [string]$RelativeRoot, [System.Collections.Generic.HashSet[string]]$Result) {
+    $resolvedProjectPath = $ProjectPath
+    $rootPath = [System.IO.Path]::GetDirectoryName($resolvedProjectPath)
+    [xml]$project = Get-Content $resolvedProjectPath
+    foreach ($name in $project.SelectNodes("//Project/ItemGroup/ProjectReference") | ForEach-Object { $_.Include -split ';'}) {
+        $dependencyFullPath = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($rootPath, $name))
+        Get-ProjectDependencies $dependencyFullPath $RelativeRoot $Result
+        $dependency = Resolve-RelativePath $RelativeRoot $dependencyFullPath
+        $result.Add($dependency) | Out-Null
+    }
+}
+
+function Get-ProjectPathDirectories([string]$ProjectPath, [string]$RelativeRoot, [System.Collections.Generic.HashSet[string]]$Result) {
+    $currentPath = New-Object System.IO.DirectoryInfo([System.IO.Path]::GetDirectoryName($ProjectPath))
+    $currentRelativePath = Resolve-RelativePath $RelativeRoot $currentPath.FullName
+    $Result.Add($currentRelativePath) | Out-Null
+    while ($true) {
+        $prevDirectory = New-Object System.IO.DirectoryInfo($currentPath.FullName)
+        $currentPath = $prevDirectory.Parent
+        if ($currentPath -eq $null) {
+            break
+        }
+        if ($currentPath.FullName -eq $RelativeRoot) {
+            $Result.Add(".") | Out-Null
+            break
+        }
+        $currentRelativePath = Resolve-RelativePath $RelativeRoot $currentPath.FullName
+        $Result.Add($currentRelativePath) | Out-Null
+    }
+}
+
+function Ensure-Directory-Exists([string] $path) {
+    if (!(Test-Path $path)) {
+        New-Item $path -ItemType Directory
+    }
+}
+
+function Write-TestWorkflow(
+    [string]$OutputDirectory = $PSScriptRoot, #optional
+    [string]$RelativeRoot,
+    [string]$ProjectPath,
+    [string[]]$Configurations = @('Release'),
+    [string[]]$TestFrameworks = @('net5.0', 'net48'),
+    [string[]]$TestPlatforms = @('x64'),
+    [string[]]$OperatingSystems = @('windows-latest', 'ubuntu-latest', 'macos-latest'),
+    [string]$DotNet5SDKVersion = $DotNet5SDKVersion,
+    [string]$DotNetCore3SDKVersion = $DotNetCore3SDKVersion,
+    [string]$DotNetCore2SDKVersion = $DotNetCore2SDKVersion) {
+
+    $dependencies = New-Object System.Collections.Generic.HashSet[string]
+    Get-ProjectDependencies $ProjectPath $RelativeRoot $dependencies
+    $dependencyPaths = [System.Environment]::NewLine
+    foreach ($dependency in $dependencies) {
+        $dependencyRelativeDirectory = ([System.IO.Path]::GetDirectoryName($dependency) -replace '\\', '/').TrimStart('./')
+        $dependencyPaths += "    - '$dependencyRelativeDirectory/**/*'" + [System.Environment]::NewLine
+    }
+
+    $projectRelativePath = $(Resolve-RelativePath $RelativeRoot $ProjectPath) -replace '\\', '/'
+    $projectRelativeDirectory = ([System.IO.Path]::GetDirectoryName($projectRelativePath) -replace '\\', '/').TrimStart('./')
+    $projectName = [System.IO.Path]::GetFileNameWithoutExtension($ProjectPath)
+
+    [string]$frameworks = '[' + $($TestFrameworks -join ', ') + ']'
+    [string]$platforms = '[' + $($TestPlatforms -join ', ') + ']'
+    [string]$oses = '[' + $($OperatingSystems -join ', ') + ']'
+    [string]$configurations = '[' + $($Configurations -join ', ') + ']'
+
+    $directories = New-Object System.Collections.Generic.HashSet[string]
+    Get-ProjectPathDirectories $projectPath $RepoRoot $directories
+
+    $directoryBuildPaths = [System.Environment]::NewLine
+    foreach ($directory in $directories) {
+        $relativeDirectory = ([System.IO.Path]::Combine($directory, 'Directory.Build.*') -replace '\\', '/').TrimStart('./')
+        $directoryBuildPaths += "    - '$relativeDirectory'" + [System.Environment]::NewLine
+    }
+
+    $fileText = "####################################################################################
+# DO NOT EDIT: This file was automatically generated by Generate-TestWorkflows.ps1
+####################################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# `"License`"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+# 
+#   http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# `"AS IS`" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+name: '$projectName'
+
+on:
+  workflow_dispatch:
+  pull_request:
+    paths:
+    - '$projectRelativeDirectory/**/*'
+    - 'build/Dependencies.props'
+    - 'build/TestReferences.Common.*'
+    - 'TestTargetFrameworks.*'
+    - '*.sln'$directoryBuildPaths
+    # Dependencies$dependencyPaths
+    - '!**/*.md'
+
+jobs:
+
+  Test:
+    runs-on: `${{ matrix.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        os: $oses
+        framework: $frameworks
+        platform: $platforms
+        configuration: $configurations
+        exclude:
+          - os: ubuntu-latest
+            framework: net48
+          - os: macos-latest
+            framework: net48
+    env:
+      project_path: '$projectRelativePath'
+      trx_file_name: 'TestResults.trx'
+      md_file_name: 'TestResults.md' # Report file name for LiquidTestReports.Markdown
+
+    steps:
+      - uses: actions/checkout@v2
+
+      - name: Setup .NET 3.1 SDK
+        uses: actions/setup-dotnet@v1
+        with:
+          dotnet-version: '$DotNetCore3SDKVersion'
+        if: `${{ startswith(matrix.framework, 'netcoreapp3.') }}
+
+      - name: Setup .NET 2.1 SDK
+        uses: actions/setup-dotnet@v1
+        with:
+          dotnet-version: '$DotNetCore2SDKVersion'
+        if: `${{ startswith(matrix.framework, 'netcoreapp2.') }}
+
+      - name: Setup .NET 5 SDK
+        uses: actions/setup-dotnet@v1
+        with:
+          dotnet-version: '$DotNet5SDKVersion'
+
+      - run: |
+          `$project_name = [System.IO.Path]::GetFileNameWithoutExtension(`$env:project_path)
+          `$test_results_artifact_name = `"testresults_`${{matrix.os}}_`${{matrix.framework}}_`${{matrix.platform}}_`${{matrix.configuration}}`"
+          Write-Host `"Project Name: `$project_name`"
+          Write-Host `"Results Artifact Name: `$test_results_artifact_name`"
+          echo `"project_name=`$project_name`" | Out-File -FilePath  `$env:GITHUB_ENV -Encoding utf8 -Append
+          echo `"test_results_artifact_name=`$test_results_artifact_name`" | Out-File -FilePath  `$env:GITHUB_ENV -Encoding utf8 -Append
+          # Title for LiquidTestReports.Markdown
+          echo `"title=Test Run for `$project_name - `${{matrix.framework}} - `${{matrix.platform}} - `${{matrix.os}}`" | Out-File -FilePath  `$env:GITHUB_ENV -Encoding utf8 -Append
+        shell: pwsh
+      - run: dotnet build `${{env.project_path}} --configuration `${{matrix.configuration}} --framework `${{matrix.framework}} /p:TestFrameworks=true
+      - run: dotnet test `${{env.project_path}} --configuration `${{matrix.configuration}} --framework `${{matrix.framework}} --no-build --no-restore --logger:`"console;verbosity=normal`" --logger:`"trx;LogFileName=`${{env.trx_file_name}}`" --logger:`"liquid.md;LogFileName=`${{env.md_file_name}};Title=`${{env.title}};`" --results-directory:`"`${{github.workspace}}/`${{env.test_results_artifact_name}}/`${{env.project_name}}`" -- RunConfiguration.TargetPlatform=`${{matrix.platform}}
+      # upload reports as build artifacts
+      - name: Upload a Build Artifact
+        uses: actions/upload-artifact@v2
+        if: `${{always()}}
+        with:
+          name: '`${{env.test_results_artifact_name}}'
+          path: '`${{github.workspace}}/`${{env.test_results_artifact_name}}'
+"
+
+    # GitHub Actions does not support filenames with "." in them, so replace
+    # with "-"
+    $projectFileName = $projectName -replace '\.', '-'
+    $FilePath = "$OutputDirectory/$projectFileName.yml"
+
+    #$dir = [System.IO.Path]::GetDirectoryName($File)
+    Ensure-Directory-Exists $OutputDirectory
+
+    Write-Host "Generating workflow file: $FilePath"
+    Out-File -filePath $FilePath -encoding UTF8 -inputObject $fileText
+
+    #Write-Host $fileText
+}
+
+
+Push-Location $RelativeRoot
+try {
+    [string[]]$TestProjects = Get-ChildItem -Path "$RepoRoot/**/*.csproj" -Recurse | where { $_.Directory.Name.Contains(".Tests") -and !($_.Directory.FullName.Contains('svn-')) } | Select-Object -ExpandProperty FullName
+} finally {
+    Pop-Location
+}
+
+
+#Write-TestWorkflow -OutputDirectory $OutputDirectory -ProjectPath $projectPath -RelativeRoot $repoRoot -TestFrameworks @('net5.0','netcoreapp3.1') -TestPlatforms $TestPlatforms
+
+#Write-Host $TestProjects
+
+foreach ($testProject in $TestProjects) {
+    $projectName = [System.IO.Path]::GetFileNameWithoutExtension($testProject)
+    [string[]]$frameworks = $TestFrameworks
+
+    # Special case - our CLI tool only supports .NET Core 3.1
+    if ($projectName.Contains("Tests.Cli")) {
+        $frameworks = @('netcoreapp3.1')
+    }
+
+    # Special case - OpenNLP.NET only supports .NET Framework
+    if ($projectName.Contains("Tests.Analysis.OpenNLP")) {
+        $frameworks = @('net48')
+    }
+
+    #Write-Host "Project: $projectName"
+    Write-TestWorkflow -OutputDirectory $OutputDirectory -ProjectPath $testProject -RelativeRoot $RepoRoot -TestFrameworks $frameworks -OperatingSystems $OperatingSystems -TestPlatforms $TestPlatforms -Configurations $Configurations -DotNet5SDKVersion $DotNet5SDKVersion -DotNetCore3SDKVersion $DotNetCore3SDKVersion -DotNetCore2SDKVersion $DotNetCore2SDKVersion
+}
\ No newline at end of file