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.

Answers


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.


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 ;-)


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

Need Your Help

From owin middleware, how to know the controller name/type?

asp.net asp.net-mvc web owin katana

I am creating an owin middleware. From IOwinContext, is it possible to know what controller is it going to hit or has hit ?

WPF UIElement refresh bug?

c# .net wpf wpf-controls uielement

I have a custom panel, which is used to draw selection effect; but sometimes it does't clear the previous rectangles, if the mouse is moved back and forth when the screen is big enough´╝łacross two