djangofan
djangofan

Reputation: 29689

Why can't I get the Jenkins Powershell plugin to work?

Why can't I get the Jenkins "Powershell plugin" to work?

I can run a powershell script on Jenkins using a "Execute windows batch command" build step with the following command:

powershell -ExecutionPolicy ByPass -File script.ps1

But I am unable to run a powershell script with the Jenkins "Powershell plugin" using the "Windows Powershell" build step and this command, because of a Windows Execution policy not set error disallowing it to run:

script.ps1

Does anyone know the proper arg to give the Jenkins "Powershell Plugin" for it to succesfully run a script? Otherwise, I will just use the batch script work-around.

Upvotes: 4

Views: 11225

Answers (3)

AutoGeo
AutoGeo

Reputation: 31

For a reboot-proof solution, put this single line

powershell Set-ExecutionPolicy -Scope CurrentUser RemoteSigned -Force

in a batch file in the All Users Startup folder, which on Windows 7 is C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

(or you can get there by clicking Start -> All Programs, right-click Startup and click Open All Users)

This is how I got Jenkins executing PS scripts on a domain machine subject to Group Policy, without having to involve the sys admin guys ;-)

Upvotes: 3

Joshua McKinnon
Joshua McKinnon

Reputation: 24719

The correct thing to do is to set an execution policy on your machine (a one-time action), at which point you won't need to bypass it every time, and the Jenkins plugin should "just work". Are you unable to?

A reasonable starting setting would be RemoteSigned, which will allow you to execute local scripts fine but would still disallow scripts downloaded from the internet.

From an elevated PowerShell prompt, you would run:

Set-ExecutionPolicy RemoteSigned

See also: http://technet.microsoft.com/library/hh849812.aspx

UPDATE: excerpt from Help on applying policy and how it's supposed to behave:

If you set the execution policy for the local computer (the default) or the current user, the change is saved in the registry and remains effective until you change it again.

Of course, if your machine is on a Domain, then Group Policy could revert this.

Upvotes: 4

djangofan
djangofan

Reputation: 29689

After experimentation, I realized that since Jenkins is running as a service as the System user, then the powershell scope is different than the scope used by my terminal services login session.

This script works for me and seems to properly set the registry keys so that the setting is persistent across reboots and new logins.

# SetExecutionPolicyToRemoteSigned.ps1
# Need to run this after every server reboot.
Write-Output "Setting local Powershell policy to RemoteSigned"
Write-Output ""

Set-ExecutionPolicy -scope CurrentUser Undefined -Force
#Set-ExecutionPolicy -scope Process Undefined -Force
Set-ExecutionPolicy -scope LocalMachine Undefined -Force

Set-ExecutionPolicy -scope CurrentUser RemoteSigned -Force
#Set-ExecutionPolicy -scope Process RemoteSigned -Force
Set-ExecutionPolicy -scope LocalMachine RemoteSigned -Force

Write-Output "Finished."

Get-ExecutionPolicy -list
Start-Sleep -s 10

Upvotes: 2

Related Questions