首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >即使成功执行PS脚本,Jenkins作业也会失败

即使成功执行PS脚本,Jenkins作业也会失败
EN

Stack Overflow用户
提问于 2017-02-15 18:35:58
回答 2查看 1.7K关注 0票数 1

我有以下脚本,这将

停止WebService

删除WebService

将项目从Jenkins工作区复制到服务器路径

创建WebService

启动WebService

我在Jenkins作业中运行此PS脚本,在执行此脚本后,我收到一封电子邮件,因为构建失败。

代码语言:javascript
复制
val STOPPED
[SC] DeleteService SUCCESS
val DELETED
Remove-Item : Cannot remove item \\Location.dll: Access to the 
path '\\Location.dll' is denied.
At C:\Users\Administrator\AppData\Local\Temp\hudson7587011077362516847.ps1:33 char:5
+     Remove-Item "$val\*" -Force -Recurse
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (\\10.0.1.190\d$...h\Grpc.Core.dll:FileInfo) [Remove-Item], Unauthoriz 
   edAccessException
    + FullyQualifiedErrorId : RemoveFileSystemItemUnAuthorizedAccess,Microsoft.PowerShell.Commands.RemoveItemCommand

我的PS脚本

代码语言:javascript
复制
# force strict - so any variable used before being assigned causes an error
Set-PsDebug -Strict

# force PowerShell to exit with a non-zero code on teh first error
$ErrorActionPreference = 'Stop'

# set $LASTEXITCODE to zero, so the script doesn't fail if no exit code returned
$LASTEXITCODE = 0

# set directories here once, so we can reuse
$MystiflySearchDir = "\\Location"
$ReleaseDir   = "C:\Location"

# get directory contents (are you expecting these to return to Jenkins?)
Get-ChildItem "$ReleaseDir\*"

# create the search directory if it doesn't exist
if (-not (Test-Path -Path $val -PathType Container)) { New-Item -Path $val-type directory -Force }

# get the service, but fail gracefully if it doesn't exist
$service = Get-Service -Name val -Computername $env:SERVER -ErrorAction SilentlyContinue

# if we have a service, stop and delete it
if($service.Status)
{
    sc.exe \\$env:SERVER stop val 
    if ($LASTEXITCODE -ne 0) { throw "error stopping the service: $LASTEXITCODE" }
    Write-Host "val STOPPED"
    Start-Sleep -s 10
    sc.exe \\$env:SERVER delete val
    if ($LASTEXITCODE -ne 0) { throw "error deleting the service: $LASTEXITCODE" }
    Write-Host "val DELETED"
    Start-Sleep -s 25
    Remove-Item "$val\*" -Force -Recurse
}

# copy release to search
xcopy "$ReleaseDir\*" $val/k/e/d/Y

# (re)create the service
sc.exe \\$env:SERVER create val start=auto DisplayName= "value"  binPath= D:\Location.exe
if ($LASTEXITCODE -ne 0) { throw "error creating the service: $LASTEXITCODE" }
sc.exe \\$env:SERVER description val "val"
if ($LASTEXITCODE -ne 0) { throw "error adding description to service: $LASTEXITCODE" }
sc.exe \\$env:SERVER start val
if ($LASTEXITCODE -ne 0) { throw "error starting the service: $LASTEXITCODE" }
Write-Host "val STARTED"

我有什么遗漏的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-15 19:12:37

您的代码需要稍微整理一下,因为您有两个重复的部分,无论服务是否存在,都会执行这些部分。也颠倒了if的逻辑。

在代码的开头添加了一些步骤,以使PowerShell更加严格,并在包含非零代码的任何错误中退出。

这还没有经过测试,因此可能需要进行一些微调。然而,它应该有95%,希望!

代码语言:javascript
复制
# force strict - so any variable used before being assigned causes an error
Set-PsDebug -Strict
# force PowerShell to exit with a non-zero code on the first error
$ErrorActionPreference = 'Stop'

# set $LASTEXITCODE to zero, so the script doesn't fail if no exit code returned
$LASTEXITCODE = 0

# se directories her once, so we can reuse
$AirSearchDir = "\\Location"
$ReleaseDir   = "C:\Location"

# get directory contents (are you expecting these to return to Jenkins?)
Get-ChildItem "$ReleaseDir\*"

# create the search directory if it doesn't exist
if (-not (Test-Path -Path $AirSearchDir -PathType Container)) { New-Item -Path $AirSearchDir -type directory -Force }

# get the service, but fail gracefully if it doesn't exist
$service = Get-Service -Name val -Computername $env:SERVER -ErrorAction SilentlyContinue
# if we have a service, stop and delete it
if($service.Status)
{
    sc.exe \\$env:SERVER stop val 
    if ($LASTEXITCODE -ne 0) { throw "error stopping the service: $LASTEXITCODE" }
    Write-Host "val STOPPED"
    sc.exe \\$env:SERVER delete val 
    if ($LASTEXITCODE -ne 0) { throw "error deleting the service: $LASTEXITCODE" }
    Write-Host "val DELETED"
}

# copy release to search
Copy-Item "$ReleaseDir\*" $AirSearchDir -Force -Recurse

# (re)create the service
sc.exe \\$env:SERVER create val start=auto DisplayName="val"  binPath= D:\Location.exe
if ($LASTEXITCODE -ne 0) { throw "error creating the service: $LASTEXITCODE" }
sc.exe \\$env:SERVER description val "val"
if ($LASTEXITCODE -ne 0) { throw "error adding description to service: $LASTEXITCODE" }
sc.exe \\$env:SERVER start val
if ($LASTEXITCODE -ne 0) { throw "error starting the service: $LASTEXITCODE" }
Write-Host "val STARTED"
票数 3
EN

Stack Overflow用户

发布于 2017-08-28 16:31:04

尝试使用管理员帐户运行Jenkins,出现此错误的原因是您的jenkins用户无法与服务交互。

使用管理员帐户运行它将为其提供与其他服务交互的足够权限。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42246915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档