Мы используем 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 в качестве входных данных вместо пути.
@DanielMann Это многопользовательское приложение, и пока мы создаем ресурс, необходимо создать конвейер. В этом случае также необходимо обновить имя контейнера. Поэтому нужно создать конвейер с пользовательской строкой YAML вместо пути.
Это не так работает. Все, что может сделать определение конвейера YAML, — это указать на файл YAML в репозитории.
Вам нужен классический пайплайн? Этот тип определения конвейера будет в данных JSON в REST API. Обратите внимание, что конвейер YAML не работает таким образом. Определение конвейера YAML основано на YAML в репозитории. Пользовательскую строку можно передать вручную или автоматически. Я предоставил автоматический метод, основанный на коде С#, см. мой ответ. :)
Если ваш конвейер основан на YAML, то он должен основываться на файле YAML в репозитории, у вас нет возможности передать пользовательскую «строку YAML» в REST API.
Я заметил, что вы используете 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, вам будет полезно:
Отправьте изменения обратно в репозиторий
Если вам не нужен автоматический метод для передачи пользовательской строки в YAML, просто отредактируйте YAML в своем репозитории.
Какова ваша цель? Конвейеры YAML основаны на файлах YAML в репозитории. Если вы хотите, чтобы репозиторий содержал другой YAML, вы обновляете YAML в репозитории. Вы не обновляете его через определение конвейера.