diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml
new file mode 100644
index 00000000..1c99a5c7
--- /dev/null
+++ b/.github/workflows/ci-test.yml
@@ -0,0 +1,50 @@
+name: CI Tests
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+
+jobs:
+ ci:
+ name: dotnet
+ strategy:
+ matrix:
+ os: [ windows-latest, macos-latest, ubuntu-latest ]
+ runs-on: ${{ matrix.os }}
+ env:
+ DOTNET_NOLOGO: true
+ DOTNET_GENERATE_ASPNET_CERTIFICATE: false
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Install dotnet
+ uses: actions/setup-dotnet@v4
+ with:
+ cache: true
+ cache-dependency-path: '**/*.csproj'
+ global-json-file: ./global.json
+
+ - name: Install PSResources
+ shell: pwsh
+ run: ./tools/installPSResources.ps1
+
+ - name: Build, test, and package
+ shell: pwsh
+ run: Invoke-Build -Configuration Release -TestFramework net8.0 RunTests, ZipRelease
+
+ - name: Upload build artifacts
+ if: always()
+ uses: actions/upload-artifact@v4
+ with:
+ name: PSReadLine-module-${{ matrix.os }}
+ path: bin/Release/PSReadLine.zip
+
+ - name: Upload test results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: PSReadLine-test-results-${{ matrix.os }}
+ path: test/TestResults/xUnitTestResults.en-US.xml
diff --git a/MockPSConsole/MockPSConsole.csproj b/MockPSConsole/MockPSConsole.csproj
index cebd3941..351d5ed2 100644
--- a/MockPSConsole/MockPSConsole.csproj
+++ b/MockPSConsole/MockPSConsole.csproj
@@ -4,7 +4,7 @@
Exe
MockPSConsole
MockPSConsole
- net472;net6.0
+ net472;net8.0
512
Program.manifest
true
@@ -14,8 +14,8 @@
-
-
+
+
diff --git a/PSReadLine.build.ps1 b/PSReadLine.build.ps1
index e245dfae..ba917946 100644
--- a/PSReadLine.build.ps1
+++ b/PSReadLine.build.ps1
@@ -19,7 +19,7 @@ param(
[ValidateSet("Debug", "Release")]
[string]$Configuration = (property Configuration Release),
- [ValidateSet("net472", "net6.0")]
+ [ValidateSet("net472", "net8.0")]
[string]$TestFramework,
[switch]$CheckHelpContent
@@ -31,7 +31,7 @@ Import-Module "$PSScriptRoot/tools/helper.psm1"
$targetDir = "bin/$Configuration/PSReadLine"
if (-not $TestFramework) {
- $TestFramework = $IsWindows ? "net472" : "net6.0"
+ $TestFramework = $IsWindows ? "net472" : "net8.0"
}
function ConvertTo-CRLF([string] $text) {
@@ -58,7 +58,7 @@ Synopsis: Build the Polyfiller assembly
#>
task BuildPolyfiller @polyFillerParams {
exec { dotnet publish -c $Configuration -f 'netstandard2.0' Polyfill }
- exec { dotnet publish -c $Configuration -f 'net6.0' Polyfill }
+ exec { dotnet publish -c $Configuration -f 'net8.0' Polyfill }
}
<#
@@ -123,7 +123,7 @@ task LayoutModule BuildPolyfiller, BuildMainModule, {
}
Copy-Item "Polyfill/bin/$Configuration/netstandard2.0/Microsoft.PowerShell.PSReadLine.Polyfiller.dll" "$targetDir/netstd" -Force
- Copy-Item "Polyfill/bin/$Configuration/net6.0/Microsoft.PowerShell.PSReadLine.Polyfiller.dll" "$targetDir/net6plus" -Force
+ Copy-Item "Polyfill/bin/$Configuration/net8.0/Microsoft.PowerShell.PSReadLine.Polyfiller.dll" "$targetDir/net6plus" -Force
$binPath = "PSReadLine/bin/$Configuration/netstandard2.0/publish"
Copy-Item $binPath/Microsoft.PowerShell.PSReadLine.dll $targetDir
diff --git a/Polyfill/Polyfill.csproj b/Polyfill/Polyfill.csproj
index 2cdccfbb..ea5103ca 100644
--- a/Polyfill/Polyfill.csproj
+++ b/Polyfill/Polyfill.csproj
@@ -3,7 +3,7 @@
Microsoft.PowerShell.PSReadLine.Polyfiller
1.0.0.0
- netstandard2.0;net6.0
+ netstandard2.0;net8.0
true
@@ -11,8 +11,8 @@
-
-
+
+
diff --git a/README.md b/README.md
index d1ab3d11..0b256ca3 100644
--- a/README.md
+++ b/README.md
@@ -160,7 +160,7 @@ The build script `build.ps1` can be used to bootstrap, build and test the projec
* Build: `./build.ps1 -Configuration Debug`
* Test:
* Targeting .NET 4.7.2 (Windows only): `./build.ps1 -Test -Configuration Debug -Framework net472`
- * Targeting .NET 6.0: `./build.ps1 -Test -Configuration Debug -Framework net6.0`
+ * Targeting .NET 6.0: `./build.ps1 -Test -Configuration Debug -Framework net8.0`
After build, the produced artifacts can be found at `/bin/Debug`.
diff --git a/appveyor.yml b/appveyor.yml
deleted file mode 100644
index e989afe0..00000000
--- a/appveyor.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-image: Visual Studio 2022
-
-environment:
- POWERSHELL_TELEMETRY_OPTOUT: 1
- # Avoid expensive initialization of dotnet cli, see: http://donovanbrown.com/post/Stop-wasting-time-during-NET-Core-builds
- DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
- PSREADLINE_TESTRUN: 1
-
-cache:
- - '%HOMEDRIVE%%HOMEPATH%\.nuget\packages -> tools\helper.psm1'
-
-install:
- - pwsh: |
- Write-Host "PS Version: $($PSVersionTable.PSVersion)"
- ./build.ps1 -Bootstrap
-
-build_script:
- - pwsh: |
- ./build.ps1 -Configuration Release
-
-test_script:
- - pwsh: ./build.ps1 -Test -Configuration Release -Framework net472
-
-artifacts:
- - path: .\bin\Release\PSReadLine.zip
diff --git a/build.ps1 b/build.ps1
index 481f2a27..fc462364 100644
--- a/build.ps1
+++ b/build.ps1
@@ -16,7 +16,7 @@
Build the main module with the default configuration (Debug) targeting 'netstandard2.0'.
.EXAMPLE
PS > .\build.ps1 -Test
- Run xUnit tests with the default configuration (Debug) and the default target framework (net472 on Windows or net6.0 otherwise).
+ Run xUnit tests with the default configuration (Debug) and the default target framework (net472 on Windows or net8.0 otherwise).
.PARAMETER Clean
Clean the local repo, but keep untracked files.
.PARAMETER Bootstrap
@@ -28,10 +28,10 @@
.PARAMETER Framework
The target framework when testing:
- net472: run tests with .NET Framework
- - net6.0: run tests with .NET 6.0
+ - net8.0: run tests with .NET 6.0
When not specified, the target framework is determined by the current OS platform:
- use 'net472' on Windows
- - use 'net6.0' on Unix platforms
+ - use 'net8.0' on Unix platforms
#>
[CmdletBinding(DefaultParameterSetName = 'default')]
param(
@@ -48,7 +48,7 @@ param(
[switch] $CheckHelpContent,
[Parameter(ParameterSetName = 'test')]
- [ValidateSet("net472", "net6.0")]
+ [ValidateSet("net472", "net8.0")]
[string] $Framework,
[Parameter(ParameterSetName = 'default')]
diff --git a/global.json b/global.json
new file mode 100644
index 00000000..4141e196
--- /dev/null
+++ b/global.json
@@ -0,0 +1,7 @@
+{
+ "sdk": {
+ "version": "8.0.405",
+ "rollForward": "latestFeature",
+ "allowPrerelease": false
+ }
+}
diff --git a/nuget.config b/nuget.config
index a10ce9b3..f003b0fb 100644
--- a/nuget.config
+++ b/nuget.config
@@ -2,9 +2,6 @@
-
+
-
-
-
diff --git a/test/ConsoleFixture.cs b/test/ConsoleFixture.cs
index 47544dc2..d9ff5925 100644
--- a/test/ConsoleFixture.cs
+++ b/test/ConsoleFixture.cs
@@ -52,6 +52,15 @@ public static IEnumerable GetKeyboardLayoutList()
public static string GetKeyboardLayout()
{
+ // In CI environments like GitHub Actions, keyboard layout detection can fail
+ // or return incorrect results. Default to en-US in these cases.
+ if (Environment.GetEnvironmentVariable("GITHUB_ACTIONS") == "true" ||
+ Environment.GetEnvironmentVariable("TF_BUILD") == "true" ||
+ !RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ {
+ return "en-US";
+ }
+
var layout = GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), out var processId));
return GetLayoutNameFromHKL(layout);
}
@@ -100,4 +109,3 @@ public override string ToString()
}
}
}
-
diff --git a/test/PSReadLine.Tests.csproj b/test/PSReadLine.Tests.csproj
index 34598cbe..70d0b9fe 100644
--- a/test/PSReadLine.Tests.csproj
+++ b/test/PSReadLine.Tests.csproj
@@ -5,7 +5,7 @@
library
UnitTestPSReadLine
PSReadLine.Tests
- net472;net6.0
+ net472;net8.0
512
{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
False
@@ -19,8 +19,8 @@
-
-
+
+
diff --git a/tools/helper.psm1 b/tools/helper.psm1
index a3ee18a8..9ffddaeb 100644
--- a/tools/helper.psm1
+++ b/tools/helper.psm1
@@ -215,7 +215,7 @@ function Start-TestRun
$testResultFile = Join-Path $testResultFolder $testResultFile
$stdOutput, $stdError = @(New-TemporaryFile; New-TemporaryFile)
- $arguments = 'test', '--no-build', '-c', $Configuration, '-f', $Framework, '--filter', $filter, '--logger', "xunit;LogFilePath=$testResultFile"
+ $arguments = 'test', '--no-build', '-c', $Configuration, '-f', $Framework, '--filter', $filter, '--logger', "xunit;LogFilePath=$testResultFile", '--logger', 'console;verbosity=normal'
Start-Process -FilePath dotnet -Wait -RedirectStandardOutput $stdOutput -RedirectStandardError $stdError -ArgumentList $arguments
Get-Content $stdOutput, $stdError
@@ -224,15 +224,14 @@ function Start-TestRun
try
{
- $env:PSREADLINE_TESTRUN = 1
Push-Location "$RepoRoot/test"
$xUnitTestExecuted = $true
if ($IsWindowsEnv)
{
- if ($env:APPVEYOR -or $env:TF_BUILD)
+ if ($env:GITHUB_ACTIONS -or $env:TF_BUILD)
{
- # AppVeyor CI builder only has en-US keyboard layout installed.
+ # GitHub Actions CI builder only has en-US keyboard layout installed.
# We have to run tests from a new process because `GetCurrentKeyboardLayout` simply fails when called from
# the `pwsh` process started by AppVeyor. Our xUnit tests depends on `GetCurrentKeyboardLayout` to tell if
# a test case should run.
@@ -298,7 +297,6 @@ function Start-TestRun
finally
{
Pop-Location
- Remove-Item env:PSREADLINE_TESTRUN
}
}
diff --git a/tools/installPSResources.ps1 b/tools/installPSResources.ps1
new file mode 100644
index 00000000..05a1138f
--- /dev/null
+++ b/tools/installPSResources.ps1
@@ -0,0 +1,20 @@
+# Copyright (c) Microsoft Corporation.
+# Licensed under the MIT License.
+param(
+ [ValidateSet("PSGallery", "CFS")]
+ [string]$PSRepository = "PSGallery"
+)
+
+if ($PSRepository -eq "CFS" -and -not (Get-PSResourceRepository -Name CFS -ErrorAction SilentlyContinue)) {
+ Register-PSResourceRepository -Name CFS -Uri "https://pkgs.dev.azure.com/powershell/PowerShell/_packaging/PowerShellGalleryMirror/nuget/v3/index.json"
+}
+
+# NOTE: Due to a bug in Install-PSResource with upstream feeds, we have to
+# request an exact version. Otherwise, if a newer version is available in the
+# upstream feed, it will fail to install any version at all.
+Install-PSResource -Verbose -TrustRepository -RequiredResource @{
+ InvokeBuild = @{
+ version = "5.12.1"
+ repository = $PSRepository
+ }
+}