Программно клонировать шаги Octopus Deploy Process и модифицировать клонированные шаги - PullRequest
0 голосов
/ 21 сентября 2018

Мы разрабатываем конвейер, для которого нам нужно добавить более 100 шагов и изменить две вещи для каждого шага: имя шага и идентификатор пакета.Вместо того, чтобы испытывать трудности, связанные с выполнением этого через пользовательский интерфейс, мы хотели бы сделать это программно.

Ниже приведен пример C #, который я набросал для этого (я разработчик на C # с крайне ограниченным PowerShell).навыки, поэтому я сделал это в C #).Строки над комментарием «С этого момента я нечеткая» - рабочий код, но строки под комментарием - просто псевдокод.

Может кто-нибудь объяснить мне, как писать строки под комментарием (или эквивалент PowerShell)?Мне не удалось найти вызовы API для этого.

Спасибо

    namespace ODClientExample
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> ListOfWindowsServices = new List<string>();
            ListOfWindowsServices.Add("svc1");
            ListOfWindowsServices.Add("svc2");
            ListOfFWindowsServices.Add("svc3");
            var server = "https://mysite.whatever/";
            var apiKey = "API-xxxxxxxxxxxxxxxxxx";   // I generated this via the Octopus UI         

            var endpoint = new OctopusServerEndpoint(server, apiKey);
            var repository = new OctopusRepository(endpoint);
            var project = repository.Projects.FindByName("Windows Services");

            // From here on is where I'm fuzzy:
            //
            var procesSteps = GetProcessSteps(project);
            var processStepToClone = GetProcesStepByName(processSteps, "SomeProcessStep");
            foreach (string svcName in ListofSvcNames)
            {
                processStepToClone.StepName = svcName;
                processStepToClone.PackageID = svcName;
            }
        }
    }
}

Я добился немного большего прогресса.Теперь я могу получить доступ к шагам в процессе и добавить шаг.Однако, когда мой код вызывает repository.DeploymentProcesses.Modify, я получаю следующее исключение:

  • Пожалуйста, укажите значение для идентификатора пакета.
  • Пожалуйста, выберите фид, в котором этот пакет будетскачано с.
  • Пожалуйста, выберите одну или несколько ролей, к которым будет применяться шаг 'svc1'.

Вот мой последний код:

    static void Main(string[] args)
    {
        List<string> ListOfFexWindowsServices = new List<string>();
        ListOfFexWindowsServices.Add("svc2");
        ListOfFexWindowsServices.Add("svc3");
        ListOfFexWindowsServices.Add("svc4");
        string server = "https://mysite.stuff/";
        string apiKey = "API-xxxxxxxxxxxxxxxxxxxxxxxx";   // I generated this via the Octopus UI         

        OctopusServerEndpoint endpoint = new OctopusServerEndpoint(server, apiKey);
        OctopusRepository repository = new OctopusRepository(endpoint);
        ProjectResource projectResource = repository.Projects.FindByName("MyProject");
        DeploymentProcessResource deploymentProcess = repository.DeploymentProcesses.Get(projectResource.DeploymentProcessId);

        var projectSteps = deploymentProcess.Steps;
        DeploymentStepResource stepToClone = new DeploymentStepResource();
        foreach (DeploymentStepResource step in projectSteps)
        {
            if (step.Name == "svc1")
            {
                stepToClone = step;
                break;
            }
        }

        foreach (string serviceName in ListOfFexWindowsServices)
        {
            DeploymentStepResource newStep = new DeploymentStepResource();
            PopulateNewStep(newStep, stepToClone, serviceName);
            deploymentProcess.Steps.Add(newStep);
            repository.DeploymentProcesses.Modify(deploymentProcess);
        }
    }

    static void PopulateNewStep(DeploymentStepResource newStep, DeploymentStepResource stepToClone, string serviceName)
    {
        newStep.Name = serviceName;
        newStep.Id = Guid.NewGuid().ToString();
        newStep.StartTrigger = stepToClone.StartTrigger;
        newStep.Condition = stepToClone.Condition;
        DeploymentActionResource action = new DeploymentActionResource
        {
            Name = newStep.Name,
            ActionType = "Octopus.TentaclePackage",
            Id = Guid.NewGuid().ToString(),
        };

        PopulateActionProperties(action);
        newStep.Actions.Add(action);
        // ISSUE:  Anything else to do (eg, any other things from stepToClone to copy, or other stuff to create)?
        newStep.PackageRequirement = stepToClone.PackageRequirement;

    }

    static void PopulateActionProperties(DeploymentActionResource action)
    {
        action.Properties.Add(new KeyValuePair<string, PropertyValueResource>("Octopus.Action.WindowsService.CustomAccountPassword", "#{WindowsService.Password}"));

        // TODO:  Repeat this sort of thing for each Action Property you see in stepToClone.
    }
...