Как заставить Hudson CI выполнить скрипт Powershell?

Я использую Hudson версии 1.324 для CI, и у меня есть пара проблем:

Окружающая обстановка:

  • Windows Server 2008
  • Powershell v1.0
  • Hudson 1.324 работает как служба
  • Плагин Hudson Powershell установлен
  • Psake (также известный как Powershell Make / Rake, доступный на Github) 0.23 (все текущие / последние версии на момент этой первоначальной публикации)

У меня есть сценарий Powershell (PS), который работает для компиляции, запуска тестов NUnit и, в случае успеха, создания выходного файла 7z. Сценарий PS работает из командной строки как в моем локальном окне разработки, так и на сервере CI, на котором установлен Hudson.

1) Политика выполнения в Powershell.

Сначала я запустил консоль PS на сервере, запустил Set-ExecutionPolicy Unrestricted, что позволяет запускать любой сценарий. (Да, я понимаю проблемы безопасности здесь, я пытаюсь заставить что-то работать, и Unrestricted должен устранить проблемы безопасности, чтобы я мог сосредоточиться на других проблемах.)

[Это сработало и позволило мне вчера запустить сценарий сборки PS из Hudson. Затем я столкнулся с другой проблемой, но мы обсудим ее подробнее в пункте №2.]

Как только Хадсон смог запустить сценарий PS, он пожаловался на следующую ошибку:

"C: \ Windows \ system32 \ WindowsPowerShell \ v1.0 \ powershell" & 'OzSystems.Tools \ psake \ psake.ps1' '. \ Oz-build.ps1' "Термин 'OzSystems.Tools \ psake \ psake.ps1 'не распознается как командлет, функция, действующая программа или файл сценария. Проверьте термин и попробуйте еще раз. В строке: 1 символ: 2 + & ‹------------------------------------' OzSystems.Tools \ psake \ psake.ps1 '' . \ oz-build.ps1 '"

Используя ту же командную строку, я могу вручную успешно выполнить сценарий PS из командной строки. Однако Хадсон не может заставить PS сделать то же самое. Посмотрев дополнительную документацию PS, я также попробовал это:

"& 'OzSystems.Tools\psake\psake.ps1' '.\oz-build.ps1'"

и получил аналогичную ошибку. Похоже, что документации для плагина Powershell для Hudson нет. Я просмотрел все файлы плагинов Powershell и не нашел ничего, что можно было бы настроить. Я не могу найти файл журнала для Хадсона, чтобы получить дополнительную информацию.

Может ли кто-нибудь помочь мне пройти через это?

2) Вчера я боролся с №1. Я пришел в это AM и попытался снова копаться после перезапуска сервера / службы Hudson, и теперь кажется, что ExecutionPolicy был сброшен на Restricted. Я сделал то, что вчера сработало, открыл консоль PS и Set-ExecutionPolicy на Unrestricted. В консоли PS отображается Unrestricted, но Хадсон говорит, что у него нет прав на выполнение сценариев PS. Я снова открыл новую консоль PS и подтвердил, что ExecutionPolicy все еще Unrestriced - это так. Но Хадсон, очевидно, не знает об этом изменении. Повторный перезапуск службы Hudson не меняет взгляда Hudson на политику.

Кто-нибудь знает, что здесь происходит?

Спасибо, Дерек


person user178557    schedule 24.09.2009    source источник
comment
Я столкнулся с той же проблемой. Честно говоря, я не понимаю, как эта Powershell может быть сопоставима с bash. Слишком много безопасности!   -  person stimms    schedule 25.09.2009
comment
Прохождение болезненного процесса подписания сценария (hanselman.com/blog/SigningPowerShellScripts.aspx) не помогло. К вашему сведению.   -  person stimms    schedule 25.09.2009
comment
Убедитесь, что вы каким-то образом не установили политику выполнения для -Scope CurrentUser вместо -Scope LocalMachine ... и убедитесь, что Хадсон не пытается запускать ваши сборки на другом клиенте;)   -  person Jaykul    schedule 14.12.2009


Ответы (5)


Я только что столкнулся с проблемой запуска сценариев PowerShell в Hudson. Дело в том, что вы запускаете 32-битный процесс Java, и вы настроили Hudson для 64-битной версии, но не для 32-битной. См. Следующий поток, который мы создали в Microsoft.

http://social.technet.microsoft.com/Forums/en/winserverpowershell/thread/a9c08f7e-c557-46eb-b8a6-a19ba457e26d.

Если вам лень. 1. Запустите powershell (x86) из меню «Пуск» от имени администратора. 2. Установите для политики выполнения удаленную подписку.

Запустите это один раз, и ваш дом бесплатно.

person Morten    schedule 07.02.2011
comment
Спасибо! У меня была немного другая проблема, чем у исходного плаката, но установка политики выполнения в x86 также устранила мою проблему. - person David Hogue; 16.12.2011

При запуске PowerShell из запланированной задачи или Hudson вы хотите:

  1. Укажите параметр -ExecutionPolicy (в вашем случае: -Ex Unrestricted)
  2. Укажите эту команду, используя либо -Command { ... }, либо -File НЕ ОБА, и не без указания того, что вы имеете в виду.

Попробуйте это (за исключением того, что я не рекомендую использовать относительные пути):

PowerShell.exe -Ex Unrestricted -Command "C:\Path\To\OzSystems.Tools\psake\psake.ps1" ".\oz-build.ps1"

Чтобы было понятно, это тоже сработает:

PowerShell.exe -Ex Unrestricted -Command "&{&'OzSystems.Tools\psake\psake.ps1' '.\oz-build.ps1'}"

Первая строка после -Command интерпретируется как НАЗВАНИЕ КОМАНДЫ, и каждый параметр после этого просто передается этой команде в качестве параметра. Строка НЕ ​​является сценарием, это имя команды (в данном случае файла сценария) ... вы не можете указать "&'OzSystems.Tools\psake\psake.ps1'", но можете указать "OzSystems.Tools\psake\psake.ps1", даже если в нем есть пробелы.

Процитирую из справки (запустите PowerShell -?) мой акцент:

-Command

Выполняет указанные команды (и любые параметры), как если бы они были введены в командной строке Windows PowerShell, а затем завершает работу, если не указан NoExit. Значение Command может быть "-" в виде строки. или блок скрипта.

Если значение Command равно «-», текст команды считывается из стандартного ввода.

Если значением Command является блок сценария, блок сценария должен быть заключен в фигурные скобки ({}). Вы можете указать блок сценария только при запуске PowerShell.exe в Windows PowerShell. Результаты блока сценария возвращаются родительской оболочке как десериализованные объекты XML, а не живые объекты.

Если значение Command является строкой, Command должна быть последним параметром в команде, потому что любые символы, введенные после команды, интерпретируются как аргументы команды.

person Jaykul    schedule 14.12.2009

У меня были те же проблемы, что и у вас (как вы видели из моих комментариев). Я отказался от средства запуска PowerShell и перешел к запуску с помощью средства запуска пакетных файлов. Несмотря на то, что я установил для системы неограниченный доступ, эта настройка, похоже, не имела значения для лаунчера Hudson. Я не знаю, работает ли он в каком-то другом контексте или что-то в этом роде, даже добавление вещей в глобальный profile.ps1, похоже, не помогло. То, что я закончил, было бегом

powershell " set-executionpolicy Unrestricted; & 'somefile.ps1'" 

который делает то, что мне нужно, хотя и не идеально. Я написал об этом автору плагина по электронной почте и буду обновлять.

person stimms    schedule 25.09.2009

Для вопроса №1 попробуйте следующее (при условии, что вы используете PowerShell 2.0):

"C: \ Windows \ system32 \ WindowsPowerShell \ v1.0 \ powershell -executionPolicy Unrestricted -file OzSystems.Tools \ psake \ psake.ps1 C: \ {path} \ oz-build.ps1"

Ты используешь "." для пути к oz-build.ps1. Я подозреваю, что вам нужно будет указать полный путь к вашему файлу oz-build.ps1, чтобы это сработало. Если только в инфраструктуре, которая выполняет указанную выше команду, текущий каталог не установлен правильно. И даже если он установлен правильно для «процесса», это имеет значение только для вызовов API .NET / Win32, а не для командлетов PowerShell. Текущий каталог в PowerShell отслеживается иначе, чем текущий каталог процесса, потому что PowerShell может иметь несколько рабочих пространств, работающих одновременно. Такое глобальное изменяемое значение не работает в этом параллельном сценарии.

Что касается вопроса №2, под какой учетной записью работает служба Hudson? Убедитесь, что учетная запись выполнила Set-ExecutionPolicy RemoteSigned (или без ограничений).

person Keith Hill    schedule 24.09.2009
comment
Кейт, я попробовал предложения для №1. Те же проблемы. Для № 2: да, я убедился, что ExecutionPolicy установлена ​​для учетной записи, под которой работает Хадсон. Когда я вхожу в систему вручную, чтобы проверить ExecutionPolicy. Хадсон все еще говорит, что скрипты отключены. Мы собираемся заняться Powershell и попробовать Rake с Хадсоном. Похоже, что PS не совсем готов к прайм-тайму или, по крайней мере, ведет себя недостаточно стабильно, чтобы мы могли полагаться на него. Спасибо за вклад, Кит! - person user178557; 25.09.2009
comment
Прежде чем сдаваться, попробуйте использовать параметр -ExecutionPolicy Unrestricted. Я изменил приведенный выше пример, чтобы показать это. - person Keith Hill; 26.09.2009

Я только что справился с этой проблемой. Какая боль!

Если вы используете 32-битную JVM в 64-битной Windows, убедитесь, что вы установили политику выполнения для 32-битного интерфейса Powershell. Я нашел здесь свой 32-битный исполняемый файл:

C:\Windows\syswow64\Windowspowershell\v1.0\powerhsell.exe

32- и 64-разрядные среды Powershell полностью различны, поэтому установка политики выполнения в одной не влияет на другую.

person roufamatic    schedule 25.01.2011