TFS - Тайм-аут Powershell при вызове функции распаковки при выпуске

Я пытаюсь выполнить автоматическое развертывание с моего Team Foundation Server (Windows Server 2012R2 с PowerShell 4) на другой сервер (в основном Windows2008R2 с PowerShell 2).

Я написал файл ps1 с именем "TFS_deploy.ps1", который будет выполнять какой-то шаг развертывания, и он будет работать, как ожидается, как при вызове в TFS, так и при запуске его самостоятельно (войдите на сервер и запустите).

Шаги выпуска

  1. Копировать файлы на сервер

  2. Запустите PowerShell на целевых машинах

Проблемы

  1. Поскольку существует много небольших файлов, учитывая производительность, я делаю zip из необработанных файлов на этапе Build, затем вставляю команды unzip в мой "TFS_deploy.ps1", команды:

    function Expand-ZIPFile($file, $destination){ #Function for unzip 
        $shell = new-object -com shell.application
        $zip = $shell.NameSpace($file)
        foreach($item in $zip.items())
        {
            $shell.Namespace($destination).copyhere($item,0x14)
        }
    }
    
    Expand-ZIPFile $zipFile $unzipTo      #call unzip
    

    Но до сих пор шаг "Запуск PowerShell на целевых машинах" застревает до истечения времени ожидания и ничего не возвращает, журнал выглядит так:

    2018-04-19T01:39:15.2320923Z Executing the powershell script: D:\agent\_work\_tasks\PowerShellOnTargetMachines_xxxxxxxxx\1.0.46\PowerShellOnTargetMachines.ps1
    2018-04-19T01:39:16.4302496Z Deployment started for machine: 'xxxxxxxxx:5985'
    2018-04-19T01:44:29.9661778Z ##[error]Timeout。
    

    Он показывает только тайм-аут после 5 минут.

    НО, если я захожу на сервер и запускаю TFS_deploy.ps1 Msgstr "Все будет хорошо, а PowerShell всего за 1 минуту или меньше.


  1. Я даже попытался использовать оболочку Python для распаковки:

    import zipfile
    path_to_zip_file = ".\\BuildSource.zip"
    directory_to_extract_to = ".\\"
    zip_ref = zipfile.ZipFile(path_to_zip_file, 'r')
    zip_ref.extractall(directory_to_extract_to)
    zip_ref.close()
    

    Когда произошло что-то другое, журнал наконец-то показал:

    2018-04-19T08:18:52.5834107Z Deployment status for machine 'XXXXXXXXX:5985' : 'Failed'
    2018-04-19T08:18:52.6174186Z ##[error] Failed to execute script unzip"}};]
    2018-04-19T08:18:52.6174186Z 
    2018-04-19T08:18:52.6174186Z 
    2018-04-19T08:18:52.6744240Z ## [error] System.Management.Automation.RuntimeException: Command execution stopped because the preference variable "ErrorActionPreference" or common parameter is set to Stop: [3448] Failed to execute script unzip ---> System.Management.Automation.RuntimeException: Command execution stopped because the preference variable "ErrorActionPreference" or common parameter is set to Stop: [3448] Failed to execute script unzip
    2018-04-19T08:18:52.6744240Z    --- End of inner exception stack trace ---
    2018-04-19T08:18:52.6744240Z    at System.Management.Automation.Runspaces.PipelineBase.Invoke(IEnumerable input)
    2018-04-19T08:18:52.6744240Z    at System.Management.Automation.PowerShell.Worker.ConstructPipelineAndDoWork(Runspace rs, Boolean performSyncInvoke)
    2018-04-19T08:18:52.6744240Z    at System.Management.Automation.PowerShell.Worker.CreateRunspaceIfNeededAndDoWork(Runspace rsToUse, Boolean isSync)
    2018-04-19T08:18:52.6754297Z    at System.Management.Automation.PowerShell.CoreInvokeHelper[TInput,TOutput](PSDataCollection`1 input, PSDataCollection`1 output, PSInvocationSettings settings)
    2018-04-19T08:18:52.6754297Z    at System.Management.Automation.PowerShell.CoreInvoke[TInput,TOutput](PSDataCollection`1 input, PSDataCollection`1 output, PSInvocationSettings settings)
    2018-04-19T08:18:52.6754297Z    at Microsoft.TeamFoundation.DistributedTask.Handlers.LegacyVSTSPowerShellHost.VSTSPowerShellHost.Main(String[] args)
    2018-04-19T08:18:52.6944268Z ##[error]LegacyVSTSPowerShellHost.exe :return -1。
    

Резюме

У меня проблемы с использованием Powershell для распаковки, и это происходит только тогда, когда TFS вызывает файл ps1, но при запуске этого же файла ps1 вручную ошибка не возникает.

Любое предложение по zip/unzip с TFS?

Обновление 2018/04/23

Я пытался использовать командлет invoke-command для вызова файла.ps1 с моего TFS-сервера на целевой сервер . Распаковка прошла успешно, но когда какой-либо файл ps1 вызывает TFS, он застревает, не показывая никакого результата снова.

Вот мой командлет:

Invoke-Command -ComputerName XXXXXXXXX -FilePath D:\TFSDeployShareFolder\unzip.ps1 -Credential XXXXXXXXX\autodeploy

и unzip.ps1:

$zipfile = "D:\TFSDeployShareFolder\Officialwebsite.zip"
$unzipDestination = "D:\TFSDeployShareFolder\"

function Expand-ZIPFile($file, $destination){
    $shell = new-object -com shell.application
    $zip = $shell.NameSpace($file)
        foreach($item in $zip.items())
    {
        $shell.Namespace($destination).copyhere($item,0x14)
    }
}
Expand-ZIPFile  $zipfile $unzipDestination

Обновление 2018/5/3 (решение)

Я решаю использовать 7z, чтобы сделать работу, Простой Google:"расстегнуть PowerShell с 7z", чтобы найти код, теперь он работает как положено.

1 ответ

Попробуйте команду Expand-Archive:

$zipfile = "C:\File.zip"
$destination = "C:\Outputpath"
Expand-Archive -LiteralPath $zipfile -DestinationPath $destination -Force
Другие вопросы по тегам