2017-02-24 41 views
7

Czy można wywołać polecenie PowerShell bezpośrednio w skryptach groovy rurociągów? Podczas używania niestandardowych zadań w Jenkinsach mogę wywołać polecenie za pomocą wtyczki PowerShell. Ale nie ma w tym miejscu fragmentu, który mógłby posłużyć się tym scenariuszem.Wykonywanie polecenia powłoki Powerhell bezpośrednio w jenkinsie potoku

Próbowałem również sh(), ale wydaje się, że to polecenie nie pozwala na wiele linii i komentarzy wewnątrz polecenia.

Odpowiedz

13

Aby połączyć się PowerScript z Groovy-Script:

  • trzeba użyć komendy bat.
  • Po tym należy upewnić się, że zmienna błędu (errorlevel) zostanie poprawnie zwrócona (EXIT 1 powinna skutkować zadaniem FAILED).
  • Wreszcie, aby być zgodnym z wtyczką PowerShell, musisz być pewny, że zostanie rozważona $LastExitCode.
  • Zauważyłem, że "powershell" jest teraz dostępny w potoku, ale ponieważ ma kilka problemów, wolę ten wariant. Nadal czekam, że działa stabilnie.

Z tego porpuse Pisałem trochę groovy metodę, która może być zintegrowanie w dowolnym rurociągu skryptu:

def PowerShell(psCmd) { 
    psCmd=psCmd.replaceAll("%", "%%") 
    bat "powershell.exe -NonInteractive -ExecutionPolicy Bypass -Command \"\$ErrorActionPreference='Stop';[Console]::OutputEncoding=[System.Text.Encoding]::UTF8;$psCmd;EXIT \$global:LastExitCode\"" 
} 

[EDIT] Dodałem QWVRWVGPEQFKPI UTF8: świetnie współpracuje z Server 2016 i Win10 [/ EDIT] [EDIT] dodałem '%' Maska [/ EDIT]

W swojej Pipeline-Script można następnie połączyć swój skrypt tak:.

stage ('Call Powershell Script') 
{ 
    node ('MyWindowsSlave') { 
     PowerShell(". '.\\disk-usage.ps1'") 
    } 
} 

Najlepszą rzeczą w tej metodzie jest to, że możesz zadzwonić pod numer CmdLet bez konieczności wykonywania tej czynności w Skrypcie, co jest najlepszą praktyką. PS1

Zaproszenie do zdefiniowania CmdLet An następnie wywołać CmdLet

PowerShell(". '.\\disk-usage.ps1'; du -Verbose") 
  • Nie zapomnij użyć withEnv() wtedy są lepsze niż w pełni kompatybilne z wtyczką PowerShell.
  • odroczyć skrypt z ., aby upewnić się, że krok nie powiodło się, gdy skrypt zwraca kod błędu (należy preferować), należy użyć &, jeśli nie przejmujesz się tym.
-2

Można użyć komendy sh tak:

sh """ 
    echo 'foo' 
    # bar 
    echo 'hello' 
""" 

Komentarze są obsługiwane tutaj.

+0

, który działa na jednym z moich węzłów systemu Windows, ale nie na drugim. Czy jest coś, co musisz zrobić z systemem operacyjnym, aby go włączyć? –

+0

Polecenie sh uruchomi sesję bash, również z Window Slave, która nie jest środowiskiem PowerShell. Możesz wypróbować 'sh ', gdzie ps.exe'' lub' sh' echo $ SHELL'' w twoim Pipeline. Zobacz: [link] (https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#code-sh-code-shell-script) Pamiętaj, że 'ps.exe'nie musi być zainstalować na niewolniku systemu Windows. – elou

6

Wywoływanie skryptów PowerShell jest teraz wspierane krokiem powershell podanym na Jenkins blog.

Wspomnieć, że obsługuje on wiele skryptów linii.

+0

Witam, nie jestem pewien, czy jestem trochę spóźniony w tym wydaniu, zauważyłem, że domyślnie obsługa powłoki Shell używa wtyczki -NoProfile, czy wiesz, czy istnieje sposób obejścia tego problemu? Nie mogę uruchomić mojego potoku, ponieważ potrzebuję dostępu do profilu powershell. – jacmurphy50