gpt4 book ai didi

powershell - TFS Build vNext-成功构建后开始流程

转载 作者:行者123 更新时间:2023-12-03 01:11:31 25 4
gpt4 key购买 nike

在构建服务器上,我们有一个正在运行的进程,除其他外,这是运行集成测试所必需的,以获得对数据库的访问。

可以在我们的存储库中更改此软件,因此我创建了一个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构建会在构建结束后将其全部杀死。

其他解决方案

我剩下2个我认为可以解决的解决方案,但是这两个解决方案都太复杂了,因为我向构建过程介绍了相当复杂的内容,然后可能会出错,但是这里有:
  • 将构建服务器设置为有效的部署目标。然后,我猜我可以使用“目标计算机上的PowerShell”步骤,即使我自己定位也是如此。我假设它将充当单独的过程。但这需要各种配置才能实现,再加上为该任务编写远程PowerShell脚本。
  • 编写一个小型Windows服务,例如REST,然后可以启动该过程,因此新的Windows服务成为拥有线程。 -只是引入了一个新层,可能也需要对其进行更新。然后可以手动更新而不是自动更新。

  • 同样,如果存在更好的解决方案,我宁愿不使用这两种解决方案中的任何一种。 :)

    最佳答案

    此刻,我最终通过安装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'
    }

    同样,此解决方案为服务器增加了另一种复杂性,因此我将问题待了几天,以查看是否有更简单的解决方案。 :)

    关于powershell - TFS Build vNext-成功构建后开始流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38891178/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com