Создание Azure Pipeline с помощью пользовательского YAML

Мы используем C# rest API для создания конвейера для мультитенантного приложения.

 string PipelineURL = string.Format("https://dev.azure.com/{0}/{1}/_apis/pipelines?api-version=6.0",
            ConfigurationManager.AppSettings["OrganizationName"].ToString(), ConfigurationManager.AppSettings["ProjectName"].ToString());

var postData = new
            {
                folder = "",
                name = Name,
                configuration = new
                {
                    type = "yaml",
                    path= "/azure-pipelines.yml",
                    repository = new
                    {
                        id = "repo-id",
                        name = "repo-name",
                        type = "azureReposGit"
                    }
                }
            };

Используя приведенный выше URL-адрес конвейера и ввод, можно создать конвейер. Но как мы можем передать пользовательскую строку YAML в качестве входных данных вместо пути.

Какова ваша цель? Конвейеры YAML основаны на файлах YAML в репозитории. Если вы хотите, чтобы репозиторий содержал другой YAML, вы обновляете YAML в репозитории. Вы не обновляете его через определение конвейера.

Daniel Mann 21.11.2022 15:51

@DanielMann Это многопользовательское приложение, и пока мы создаем ресурс, необходимо создать конвейер. В этом случае также необходимо обновить имя контейнера. Поэтому нужно создать конвейер с пользовательской строкой YAML вместо пути.

Ramakrishnan Ramar 22.11.2022 06:24

Это не так работает. Все, что может сделать определение конвейера YAML, — это указать на файл YAML в репозитории.

Daniel Mann 22.11.2022 07:21

Вам нужен классический пайплайн? Этот тип определения конвейера будет в данных JSON в REST API. Обратите внимание, что конвейер YAML не работает таким образом. Определение конвейера YAML основано на YAML в репозитории. Пользовательскую строку можно передать вручную или автоматически. Я предоставил автоматический метод, основанный на коде С#, см. мой ответ. :)

Bowman Zhu-MSFT 23.11.2022 10:07
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
1
4
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если ваш конвейер основан на YAML, то он должен основываться на файле YAML в репозитории, у вас нет возможности передать пользовательскую «строку YAML» в REST API.

1,

Если вы хотите, чтобы все определения конвейера были определены в JSON, вы можете создать классический конвейер через REST API (вы можете сначала создать классический конвейер вручную, а затем использовать Pipelines — Get REST API, чтобы проверить, как его спроектировать.) .

2,

Если вы хотите, чтобы автоматический метод передал пользовательскую строку в определение yaml YAML, вы можете десериализовать файл YAML, чтобы получить желаемое содержимое YAML, изменить его с помощью кода, а затем сериализовать данные и сохранить обратно в файл YAML.

Я заметил, что вы используете C#, поэтому я пишу для вас демонстрацию C#.

Например, у меня есть тестовый файл YAML:

trigger: none

pool:
  vmImage: ubuntu-latest

variables:
- name: testkey
  value: testvalue

Приведенный ниже код C# передаст пользовательское строковое значение в значение переменной testkey.

Программа.cs

using System;
using System.Collections.Generic;
using System.IO;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;

namespace change_YAML_content
{
    class Program
    {
        static void Main(string[] args)
        {
            string file_path = @"C:\repo\TestResults\change_YAML_content\test.yaml";
            string value_before_change = getvalue(file_path);
            setvalue(file_path);
            string value_after_change = getvalue(file_path);

            Console.WriteLine("The value before change: " + value_before_change + "\n" + "The value after change: " + value_after_change);
        }
        public static string getvalue(string file_path) 
        {
            var deserializer = new Deserializer();

            var reader = new StreamReader(file_path);
            var yamlObject = deserializer.Deserialize<YAMLFrontMeta>(reader);
            var variables = yamlObject.Variables;//This step you can make your own design.
            string rt = variables[0]["value"];
            reader.Close();
            return rt;
        }
        public static void setvalue(string file_path)
        {
            var deserializer = new Deserializer();
            var reader = new StreamReader(file_path);
            var yamlObject = deserializer.Deserialize<YAMLFrontMeta>(reader);
            var variables = yamlObject.Variables;//This step you can make your own design.
            variables[0]["value"] = "new value";

            //write the new content to YAML file
            var serializer = new SerializerBuilder()
                .WithNamingConvention(CamelCaseNamingConvention.Instance)
                .Build();
            var yaml = serializer.Serialize(yamlObject);

            reader.Close();
            File.WriteAllText(file_path, yaml);
        }
    }
    public sealed class YAMLFrontMeta
    {
        [YamlMember(Alias = "trigger", ApplyNamingConventions = false)]
        public string Trigger { get; set; }

        [YamlMember(Alias = "pool", ApplyNamingConventions = false)]
        public Dictionary<string, string> Pool { get; set; }

        [YamlMember(Alias = "variables", ApplyNamingConventions = false)]
        public List<Dictionary<string, string>> Variables { get; set; }

        //... and so on
    }
}

После запуска кода YAML будет:

trigger: none
pool:
  vmImage: ubuntu-latest
variables:
- name: testkey
  value: new value

Вышеприведенный пример — это всего лишь пример. Если вам нужны более сложные варианты использования, вы можете разработать дизайн на основе описанного выше метода и даже использовать этот метод для автоматизации создания файлов YAML, которые вы хотите. После этого вы можете отправить/загрузить файл yaml в репозиторий.

Если вы запустите приведенный выше код на основе репозитория, в котором существует YAML, вам будет полезно:

Отправьте изменения обратно в репозиторий

3,

Если вам не нужен автоматический метод для передачи пользовательской строки в YAML, просто отредактируйте YAML в своем репозитории.

Другие вопросы по теме