TFS Build vNext - 成功构建后启动流程

时间:2016-08-11 08:31:01

标签: powershell tfs tfsbuild

在我们的构建服务器上,我们有一个正在运行的进程,除运行集成测试外,还需要访问数据库。

这个软件可以在我们的存储库中更改,因此我创建了一个构建更改的CI构建。我想做的是在成功构建时使用新编译的版本重新启动该过程,但是这部分我似乎无法开始工作。

我没有杀死正在运行的进程,并将结果部署到构建服务器上的特定位置的问题,但似乎无论我尝试什么,一旦运行的构建结束,我生成的进程就会被终止。

我尝试了以下内容:

使用PowerShell

Start-Process <path to file>

使用CMD

使用'cmd'作为工具和以下参数:

<path to file>
start <path to file>
/c start <path to file>
cmd <path to file>
cmd start <path to file>
cmd /c start <path to file>

我也试过简单地提供.exe路径作为工具名称,没有参数,也没有运气。

效果如何?

好吧,对于上述大多数方法,使用PS命令Get-Process <exe name>*的额外步骤我得到了进程正在运行的结果。在停止该过程的步骤之后,同一步骤没有产生任何结果,因此可以启动新的更新的步骤。所以我很肯定它有效,vNext构建只是在构建结束后将其全部杀掉。

其他解决方案

我有两个解决方案,我认为应该可以工作,但是这两个解决方案都太复杂了,因为我在构建过程中引入了很多复杂性,然后可能出错了,但是这里有:< / p>

  1. 将构建服务器设置为部署的有效目标。然后我猜我可以使用“目标计算机上的PowerShell”步骤,即使我自己定位。我认为它将作为单独的进程。这需要各种配置来实现这一点,并为该任务编写远程PowerShell脚本。
  2. 编写一个可以调用的小型Windows服务,例如: REST,然后可以启动进程,因此新的Windows服务成为拥有的线程。 - 这只是引入了一个也可能需要更新的新层。然后可以手动更新,而不是自动更新。
  3. 同样,如果存在更好的解决方案,我宁愿不使用任何2种解决方案。 :)

2 个答案:

答案 0 :(得分:2)

目前我通过安装AutoIt来修复它,并将这个简单的脚本添加到“deploy”文件夹中:

While 1 ; Opens up a WHILE loop, with 1 as a constant, so it is infinite
If Not ProcessExists("DelphiDebug.exe") Then Run("DelphiDebug.exe") ; if the process of DelphiDebug.exe doesn't exist, it starts it
Sleep (10) ; Puts the script to sleep for 10 milliseconds so it doesn't chew CPU power
WEnd ; Closes the loop, tells it to go back to the beginning

Credit goes to this forum entry其中有一个记事本示例

然后我创建了一个PowerShell脚本,它重命名当前版本,将新构建的版本复制到“deploy”文件夹,停止正在运行的实例,并删除重命名的版本:

# CONSTANTS AND CALCULATED VARIABLES
[string]$deploymentFolder = 'C:\Deployment-folder-on-local-machine'
[string]$deploymentPath = "$deploymentFolder\my-program.exe"
[string]$searchPathExistingVersion = $deploymentPath + '*' # The star is important so Get-Item does not throw an error
[string]$toDeleteExeName = 'please-delete.exe'
[string]$newCompiledVersionFullPath = "$env:BUILD_SOURCESDIRECTORY\sub-path-to-bin-folder\my-program.exe"
[string]$processName = 'my-program'
[string]$searchPathToDeleteVersion = "$deploymentFolder\$toDeleteExeName*" # The star is important so Get-Item does not throw an error

# EXECUTION
Write-Verbose "Search path: $searchPathExistingVersion"
$existingVersion = Get-Item $searchPathExistingVersion;
if ($existingVersion) {
    Write-Debug "Match found: $existingVersion"
    Rename-Item $existingVersion.FullName $toDeleteExeName
} else {
    Write-Debug 'No existing file found'
}
Write-Verbose "Copy new version from path: $newCompiledVersionFullPath"
Copy-Item $newCompiledVersionFullPath $deploymentPath
Write-Verbose 'Stopping running processes'
Get-Process ($processName + '*') | Stop-Process # The new version is auto started with a running AutoIt script in the deployment folder.
Write-Verbose "Deleting old versions with search path: $searchPathToDeleteVersion"
$toDeleteVersion = Get-Item $searchPathToDeleteVersion
if ($toDeleteVersion) {
  Write-Debug "Match found: $toDeleteVersion"
  Remove-Item $toDeleteVersion -ErrorAction SilentlyContinue # Deletion is not critical. Next time the build runs, it will attempt another cleanup.
} else {
  Write-Debug 'No file found to delete'
}

同样,这个解决方案为服务器增加了另一个复杂性,所以我将问题保持开放几天,看看是否有更简单的解决方案。 :)

答案 1 :(得分:1)

我认为您不需要在构建期间启动进程,而是需要将该进程安装为Windows服务并启动它。有意义的是,您在构建环境中启动的任何进程都将在构建完成时停止。您可以使用命令行安装/更新/启动Windows服务:

sc create [service name] [binPath= ] 

https://ozansafi.wordpress.com/2009/01/14/create-delete-start-stop-a-service-from-command-line/