Sitecore docker сборка. Invoke-RemoteScript.ps1 истекло - PullRequest
0 голосов
/ 15 апреля 2020

Работаю над этим более 2 недель, и у меня заканчиваются идеи. Надеюсь, что некоторые из них имеют опыт работы с докерским Sitecore. У меня есть Sitecore Docker (windows контейнер), и я пытаюсь запустить скрипт на нем. Sitecore построен с помощью этого учебного пособия: http://rockpapersitecore.com/2019/10/yet-another-sitecore-docker-series/

Сценарий:

Write-Host "Preparing for DB upgrade"

Import-Module C:\automation\SPE
$session = New-ScriptSession -Username admin -Password b -ConnectionUri http://localhost

$jobId = Invoke-RemoteScript -Session $session -ScriptBlock {
    Install-Package -Path C:\automation\CT_DB_upgrade.zip -InstallMode Merge -MergeMode Merge
} -AsJob

Start-Sleep -s 5
Wait-RemoteScriptSession -Session $session -Id $jobId -Delay 5 -Verbose
Write-Host "CT_DB_upgrade.zip installed"
Stop-ScriptSession -Session $session

Более того, сценарий предполагает обновление чистой базы данных таблицами для нашего коннектора Sitecore. Скрипт работает нормально, таблицы добавляются, а Sitecore работает, но ... время ожидания скрипта истекло. После установки "CT_DB_upgrade.zip" он работает около 2 минут и время ожидания истекает. Обычно на виртуальной машине скрипт работает примерно 0,5 / 1 se c и не обрабатывает sh.

PS C:\automation> .\install-ct-db.ps1
Preparing for DB upgrade
VERBOSE: Checking the Runspace for the variable id.
VERBOSE: Preparing to invoke the script against the service at url
http://localhost/-/script/script/?sessionId=2ca051be-195d-4f0a-90b7-d084b9246ca3&rawOutput=False&persistentSession=F alse
VERBOSE: Transferring script to server
VERBOSE: Script transfer complete.
VERBOSE: Polling job 55ed096e-16ae-49cd-8d20-4d6a4ec219d1. Status : Available.
VERBOSE: Finished polling job 55ed096e-16ae-49cd-8d20-4d6a4ec219d1.
VERBOSE: Checking the Runspace for the variable id.
VERBOSE: Preparing to invoke the script against the service at url
http://localhost/-/script/script/?sessionId=2ca051be-195d-4f0a-90b7-d084b9246ca3&rawOutput=False&persistentSession=F alse
VERBOSE: Transferring script to server
VERBOSE: Script transfer complete.
CT_DB_upgrade.zip installed
Exception calling "Invoke" with "1" argument(s): "The operation has timed out"
At C:\automation\SPE\ConvertFrom-CliXml.ps1:24 char:9
+         $deserializer = $ctor.Invoke($xr)
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WebException

Exception calling "InvokeMember" with "5" argument(s): "Non-static method requires a target."
At C:\automation\SPE\ConvertFrom-CliXml.ps1:26 char:16
+ ...      while (!$type.InvokeMember("Done", "InvokeMethod,NonPublic,Insta ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : TargetException

Как я понимаю, он падает при: Stop-ScriptSession -Session $ session. Я пытался изменить различные настройки web.config, например, тайм-ауты, но даже если я установлю тайм-аут после 10 минут, он все равно будет остановлен примерно через 2 минуты.

Вот ConvertFrom-Cli Xml .ps1:

function ConvertFrom-CliXml {
    param(
        [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
        [ValidateNotNullOrEmpty()]
        [String[]]$InputObject
    )
    begin
    {
        $OFS = "`n"
        [String]$xmlString = ""
    }
    process
    {
        $xmlString += $InputObject
    }
    end
    {
        #This try catch ignores rest of the code and let script finish with no error.
        #try {
        $type = [PSObject].Assembly.GetType('System.Management.Automation.Deserializer')
        $ctor = $type.GetConstructor('instance,nonpublic', $null, @([xml.xmlreader]), $null)
        $sr = New-Object System.IO.StringReader $xmlString
        $xr = New-Object System.Xml.XmlTextReader $sr
        $deserializer = $ctor.Invoke($xr)
        $done = $type.GetMethod('Done', [System.Reflection.BindingFlags]'nonpublic,instance')
        while (!$type.InvokeMember("Done", "InvokeMethod,NonPublic,Instance", $null, $deserializer, @()))
        {
            try {
                $type.InvokeMember("Deserialize", "InvokeMethod,NonPublic,Instance", $null, $deserializer, @())
            } catch {
                Write-Warning "Could not deserialize ${string}: $_"
            }
        }
        $xr.Close()
        $sr.Dispose()
    #} catch {
    #    Write-Host "Could not finish script correctly"
   <#
   .SYNOPSIS
   Short description

   .DESCRIPTION
   Long description

   .PARAMETER InputObject
   Parameter description

   .EXAMPLE
   An example

   .NOTES
   General notes
   #>
    }
}
...