actions / actions/runner

On Windows, explicit pwsh does not fall back to Powershell Desktop

Open
#3,415 8 comments 4 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug Stale
Dominant language
C#
Stars
6.3k
Forks
1.4k
Avg merge
1d 16h
Merged PRs (30d)
24

Description

Describe the bug
The docs say that if shell: pwsh is specified on a Windows self-hosted runner, and Powershell Core is not installed on the runner, then Powershell Desktop will be used instead. I have not found this to be true.

To Reproduce

jobs:
  pwsh_test:
    runs-on: [self-hosted, windows]
    steps:
      - shell: pwsh
        run: Get-ChildItem

Expected behavior
I should see a directory listing

Runner Version and Platform

Version of your runner? 2.317.0

OS of the machine running the runner? Windows

What's not working?

I get Error: pwsh: command not found

Job Log Output

2024-08-03T14:46:01.5498934Z ##[debug]Evaluating condition for step: 'Run Get-ChildItem'
2024-08-03T14:46:01.5732322Z ##[debug]Evaluating: success()
2024-08-03T14:46:01.5741534Z ##[debug]Evaluating success:
2024-08-03T14:46:01.5786071Z ##[debug]=> true
2024-08-03T14:46:01.5797753Z ##[debug]Result: true
2024-08-03T14:46:01.5857543Z ##[debug]Starting: Run Get-ChildItem
2024-08-03T14:46:01.6984079Z ##[debug]Loading inputs
2024-08-03T14:46:01.7056280Z ##[debug]Loading env
2024-08-03T14:46:01.7246604Z ##[group]Run Get-ChildItem
2024-08-03T14:46:01.7247734Z Get-ChildItem
2024-08-03T14:46:01.7543572Z ##[error]pwsh: command not found
2024-08-03T14:46:01.7562102Z ##[debug]System.IO.FileNotFoundException: pwsh: command not found
2024-08-03T14:46:01.7563794Z ##[debug]File name: 'pwsh'
2024-08-03T14:46:01.7566153Z ##[debug]   at GitHub.Runner.Sdk.WhichUtil.Which(String command, Boolean require, ITraceWriter trace, String prependPath)
2024-08-03T14:46:01.7570036Z ##[debug]   at GitHub.Runner.Worker.Handlers.ScriptHandler.PrintActionDetails(ActionRunStage stage)
2024-08-03T14:46:01.7573443Z ##[debug]   at GitHub.Runner.Worker.Handlers.Handler.PrepareExecution(ActionRunStage stage)
2024-08-03T14:46:01.7575978Z ##[debug]   at GitHub.Runner.Worker.ActionRunner.RunAsync()
2024-08-03T14:46:01.7578997Z ##[debug]   at GitHub.Runner.Worker.StepsRunner.RunStepAsync(IStep step, CancellationToken jobCancellationToken)
2024-08-03T14:46:01.7595221Z ##[debug]Finishing: Run Get-ChildItem

Diagnosis

I think the issue is in this block of code. If there is no shell specified on Windows, then the if block will look for pwsh and fall back to powershell. But if pwsh is specified as the shell, the else block does not have a fallback provision.

It looks like the same issue with bash on non-Windows hosts, which the docs say is supposed to fall back to sh if bash is not available.

If this is the intended behavior, then the docs should be updated accordingly. But I would submit that the behavior described in the docs is desirable, and the code should be fixed to provide a fallback when pwsh or bash is specified.

My use case is a job which can run on Windows or Linux. My Linux self-hosted runner has pwsh installed, but my Windows runner does not. (I don't control the configuration of the runners.) I'd like to be able to specify shell: pwsh for a step and provide a script that works on both runners, using pwsh on Linux and powershell on Windows; the docs imply that this should work.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in src/Runner.Worker/Handlers/ScriptHandler.cs, especially the shell-selection block linked in the issue, and compare explicit pwsh handling with the default Windows path. Reproduce the workflow on a Windows runner without PowerShell Core and check the corresponding bash behavior on non-Windows hosts. Done means the documented fallback behavior is implemented or the documentation is corrected consistently.

Written by the indexing model from the issue text.

Assessment

Tech stack
csharp, github-actions, powershell
Domain
ci-cd, devops
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
68/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.