in tool/TeamCity.Docker/TeamCityKotlinSettingsGenerator.cs [636:773]
private IEnumerable<string> GenerateBuildAndPushType(
string buildTypeId,
string name,
IReadOnlyCollection<INode<IArtifact>> path,
int weight,
bool onPause)
{
var images = path.Select(i => i.Value).OfType<Image>().Where(i => onPause || i.File.Repositories.Any()).ToList();
var references = path.Select(i => i.Value).OfType<Reference>().ToList();
var groups =
from image in images
group image by image.File.ImageId
into groupsByImageId
from groupByImageId in
from image in groupsByImageId
group image by image.File
group groupByImageId by groupsByImageId.Key;
var description = new StringBuilder();
foreach (var grp in groups)
{
if (description.Length > 0)
{
description.Append(" ");
}
description.Append(grp.Key);
foreach (var dockerfile in grp)
{
var tags = string.Join(",", dockerfile.Key.Tags);
if (!string.IsNullOrWhiteSpace(tags))
{
description.Append(':');
description.Append(tags);
}
}
}
var pauseStr = onPause ? "ON PAUSE " : "";
yield return $"object {buildTypeId} : BuildType({{";
yield return $"\t name = \"{pauseStr}Build and push {name}\"";
yield return $"\t {_buildNumberPattern}";
yield return $"\t description = \"{description}\"";
if (!onPause)
{
yield return "\t vcs {";
yield return "\t\t root(TeamCityDockerImagesRepo)";
yield return "\t }";
yield return "\n \t steps {";
// "docker pull" command types @ steps { ... } block
foreach (var command in references.SelectMany(refer => CreatePullCommand(refer.RepoTag, refer.RepoTag)))
{
yield return $"\t\t{command}";
}
// "docker build" command types @ steps { ... } block
foreach (var command in images.SelectMany(image => CreatePrepareContextCommand(image).Concat(CreateBuildCommand(image))))
{
yield return $"\t\t{command}";
}
// "docker image tag" command types @ steps { ... } block
foreach (var image in images)
{
if (image.File.Tags.Any())
{
var tag = image.File.Tags.First();
// "tag" command
foreach (var tagCommand in CreateTagCommand($"{image.File.ImageId}:{tag}", $"{BuildRepositoryName}{image.File.ImageId}{BuildImagePostfix}:{tag}", $"{image.File.ImageId}:{tag}"))
{
yield return $"\t\t{tagCommand}";
}
}
}
// "docker push" command types @ steps { ... } block
foreach (var image in images)
{
var tag = image.File.Tags.First();
foreach (var pushCommand in CreatePushCommand($"{BuildRepositoryName}{image.File.ImageId}{BuildImagePostfix}", $"{image.File.ImageId}:{tag}", tag))
{
yield return $"\t\t{pushCommand}";
}
}
// end of steps {...} block
yield return "\t}";
yield return "\tfeatures {";
if (weight > 0)
{
foreach (var feature in CreateFreeDiskSpaceFeature(weight))
{
yield return $"\t\t{feature}";
}
}
foreach (var feature in CreateDockerFeature())
{
yield return $"\t\t{feature}";
}
// ReSharper disable once StringLiteralTypo
foreach (var feature in CreateSwabraFeature())
{
yield return $"\t\t{feature}";
}
// end of features { ... } block
yield return "\t}";
foreach (var dependencies in CreateArtifactsDependencies())
{
yield return $"\t{dependencies}";
}
foreach (var param in CreateSpaceParams(weight))
{
yield return $"\t{param}";
}
var requirements = images.SelectMany(i => i.File.Requirements).Distinct().ToList();
foreach (var lines in CreateDockerRequirements(requirements))
{
yield return $"\t{lines}";
}
}
yield return "})";
yield return string.Empty;
}