Octopus: развертывание запланированной задачи Windows

Этот вопрос предназначен для всех, кто использует Octopus Deploy для выполнения запланированных задач.

https://library.octopusdeploy.com/step-template/actiontemplate-windows-scheduled-task-create

Кто-нибудь сталкивался с ситуацией, когда в запланированной задаче нужно указать параметр «Начать через (необязательно):»?

Мне интересно, возможно ли это с Octopus Deploy или есть ли какая-то работа?


person ProgSky    schedule 27.03.2017    source источник
comment
Предполагается, что начать через (необязательно):   -  person ProgSky    schedule 28.03.2017
comment
Ответ Octopus: мне задали этот вопрос не так давно, к сожалению, шаблоны шагов в основном создаются и управляются сообществом. Похоже, что лучшим вариантом было бы создать копию шаблона шага и добавить / script в свой собственный раздел, чтобы отредактировать поле Start in. К сожалению, в настоящее время здесь нет других вариантов. Мы во многом полагаемся на вклад сообщества с нашими шаблонами шагов. Если вы это сделаете, мы будем рады видеть PR с вашей модификацией. По следующей ссылке представлена ​​информация о том, как работает отправка в нашу библиотеку: github.com/OctopusDeploy/Library   -  person ProgSky    schedule 28.03.2017


Ответы (2)


Шаги сообщества Octopus deploy - это просто сценарии Powershell с переменными. Вы можете отредактировать Powershell, чтобы настроить любую переменную для пути «Начать в» и передать это запланированной задаче. Я могу привести вам пример, который вам нужен.

Обновить

После тщательного изучения сценария Posh для задачи, я думаю, что лучшим вариантом было бы добавить один параметр для XML-файла, который определяет параметры задачи, и установить его на этапах развертывания Octopus. Это даст вам максимальную возможность исправления в случае, если вам нужно указать какие-либо другие параметры, кроме параметра «Начать в».

Обновление 2

Итак, я написал собственный шаг, чтобы делать то, что вы хотели, а затем посмотрел на ленту сообщества, глупый я. Уже есть шаблон основы для создания запланированной задачи из файла XML. XML позволит вам установить рабочий каталог. Шаблон шага называется «Создание запланированных задач из XML», и вы можете найти его по адресу http://library.octopusdeploy.com/step-templates/26c779af-4cce-447e-98bb-4741c25e0b3c/actiontemplate-create.-scheduled-tasks-from-xml.

Кроме того, вот где я собирался с настраиваемым шагом, это просто Powershell:

$ErrorActionPreference = "Stop";
Set-StrictMode -Version "Latest";

function New-ScheduledTask {
    param (
        [Parameter(Mandatory = $true)][hashtable] $octopusParameters
    )

    $arguments = @{
        TaskName = $octopusParameters['TaskName']
        User = $octopusParameters['RunAsUser']
    }

    if ($octopusParameters['RunAsPassword']) {
        $arguments.Password = $runAsPassword
    }

    if ($octopusParameters.ContainsKey('RunWithElevatedPermissions')) {
        if ([boolean]::Parse($octopusParameters['RunWithElevatedPermissions'])) {
            $arguments.RunLevel = 'Highest'
        }
    }

    switch ($octopusParameters['Schedule']) {
        'Once' {
            $triggerArguments.Once = $true
            $triggerArguments.At = $runAt
        }
        'Daily' {
            $triggerArguments.Daily = $true
            $triggerArguments.At = $runAt

            if ($interval) {
                $triggerArguments.DaysInterval = $octopusParameters['Interval']
            }
        }
        'Weekly' {
            $triggerArguments.Weekly = $true
            $triggerArguments.At = $runAt

            if ($interval) {
                $triggerArguments.WeeksInterval = $octopusParameters['Interval']
            }
        }
        'Startup' {
            $triggerArguments.AtStartup = $true
        }
        'Logon' {
            $triggerArguments.AtLogOn = $true
        }
    }

    $actionArguments = @{
        Execute = $octopusParameters['Executable']
        Argument = $octopusParameters['Arguments']
        WorkingDirectory = $octopusParameters['WorkingDirectory']
    }
    $arguments.Action = New-ScheduledTaskAction @actionArguments

    $triggerArguments = @{
        TaskName = $taskName
        User = $runAsUser
    }
    $arguments.Trigger = New-ScheduledTaskTrigger @triggerArguments

    Write-Output "Creating Scheduled Task - $taskName"

    Unregister-ScheduledTask -TaskName $taskName -Confirm:$false -ErrorAction:SilentlyContinue
    Register-ScheduledTask @arguments | Out-Null

    Write-Output "Successfully Created $taskName"
}

# only execute the step if it's called from octopus deploy,
# and skip it if we're runnning inside a Pester test
if (Test-Path -Path "Variable:octopusParameters") {
    New-ScheduledTask $octopusParameters
}
person Ben Richards    schedule 30.04.2017
comment
Спасибо, Боян, пример поможет. - person ProgSky; 01.05.2017
comment
Вы используете Windows 2012 или 2016? Powershell 3 имеет новый API, который позволяет упростить создание задач, но v3 по умолчанию есть только в Windows 8, 10, 2012 и 2016. - person Ben Richards; 01.05.2017
comment
Я работаю в Windows 2012. - person ProgSky; 01.05.2017

После того, как я столкнулся с той же проблемой, я обнаружил, что schtasks.exe не принимает параметр «Рабочий каталог» (Start In (необязательно)).

Я сделал следующее:

  1. Создайте запланированную задачу с помощью шаблона Octopus (Запланированная задача Windows - Создать - С паролем)
  2. Сохранено запланированное задание как XML с помощью PowerShell.
  3. Отредактировал XML, чтобы добавить рабочий каталог
  4. Использовал шаблон Octopus (создание запланированных задач из XML) с использованием обновленного XML для создания запланированной задачи.

Вот оболочка PowerShell, которую я использовал в Octopus, чтобы получить запланированную задачу в виде XML и вставить узел рабочего каталога:

$scheduleFolder = $OctopusParameters["ScheduledTaskFolder"]
$scheduleName = $OctopusParameters["ScheduledTaskName"]
$scheduleWorkingDirectory = $OctopusParameters["ScheduledTaskWorkingDirectory"]
$scheduleXmlFileName = $OctopusParameters["ScheduledTaskXmlFileName"]
$installFolder = $OctopusParameters["InstallFolder"]

Write-Output "Connecting to Schedule Service"
$schedule = New-Object -Com("Schedule.Service") 
$schedule.Connect()

Write-Output "Getting $scheduleName task in folder $scheduleFolder as xml"
$task = $schedule.GetFolder($scheduleFolder).GetTasks(0) | Where {$_.Name -eq 
$scheduleName}

$xml = [xml]$task.Xml

# Parent node
$execNode = $xml.Task.Actions.Exec

# Create WorkingDirectory node
$workingDirectoryElement = $xml.CreateElement("WorkingDirectory", 
$execNode.NamespaceURI) 
$workingDirectoryElement.InnerText = $scheduleWorkingDirectory

# Insert the WorkingDirectory node after the last child node
Write-Output "Inserting WorkingDirectory node in $execNode.Name node"
$numberExecNodes = $execNode.ChildNodes.Count

$execNode.InsertAfter($workingDirectoryElement, $execNode.ChildNodes[$numberExecNodes 
- 1])

# Output the xml to a file
Write-Output "Saving $installFolder\$scheduleXmlFileName"
$xml.Save("$installFolder\$scheduleXmlFileName")

Другой вариант - сохранить файл XML (с узлами рабочего каталога) как часть вашего проекта и просто развернуть его с помощью шаблона Octopus (Создание запланированных задач из XML).

...
  <Actions Context="Author">
    <Exec>
      <Command>"C:\Program Files\Test Application\Application.exe"</Command>
      <WorkingDirectory>C:\Program Files\Test Application</WorkingDirectory>
    </Exec>
  </Actions>
</Task>
person user3790118    schedule 06.12.2018