in tool/TeamCity.Docker/ConfigurationExplorer.cs [69:116]
private IEnumerable<Template> GetConfigurations([NotNull] string sourcePath, [NotNull] IReadOnlyDictionary<string, string> additionalVars)
{
if (sourcePath == null)
{
throw new ArgumentNullException(nameof(sourcePath));
}
if (additionalVars == null)
{
throw new ArgumentNullException(nameof(additionalVars));
}
var templateCounter = 0;
foreach (var dockerfileTemplate in _fileSystem.EnumerateFileSystemEntries(sourcePath, "*.Dockerfile"))
{
var dockerfileTemplateRelative = Path.GetRelativePath(sourcePath, dockerfileTemplate);
using (_logger.CreateBlock($"{++templateCounter:000} {dockerfileTemplateRelative}"))
{
var dockerfileTemplateDir = Path.GetDirectoryName(dockerfileTemplate) ?? ".";
var dockerfileTemplatePath = Path.GetFileName(dockerfileTemplate);
// ReSharper disable once IdentifierTypo
var dockerignoreTemplatePath = Path.Combine(dockerfileTemplateDir, Path.GetFileNameWithoutExtension(dockerfileTemplatePath) + ".Dockerignore");
var variants = new List<Variant>();
var configCounter = 0;
// Get all configuration files for particular OS (e.g. Ubuntu/20.04/..., Ubuntu/18.04/, ...
foreach (var configFile in _fileSystem.EnumerateFileSystemEntries(dockerfileTemplateDir, dockerfileTemplatePath + ".config"))
{
var buildPath = Path.GetDirectoryName(Path.GetRelativePath(sourcePath, configFile)) ?? "";
using (_logger.CreateBlock($"{templateCounter:000}.{++configCounter:000} {Path.GetRelativePath(sourcePath, configFile)}"))
{
var vars = UpdateVariables(additionalVars, GetVariables(configFile));
variants.Add(new Variant(buildPath, configFile, vars.Select(i => new Variable(i.Key, i.Value)).ToList()));
}
}
var ignore = new List<string>();
if (_fileSystem.IsFileExist(dockerignoreTemplatePath))
{
// Add .Dockerignore files
ignore.AddRange(_fileSystem.ReadLines(dockerignoreTemplatePath));
}
yield return new Template(_fileSystem.ReadLines(dockerfileTemplate).ToImmutableList(), variants.AsReadOnly(), ignore.AsReadOnly());
}
}
}