in tool/TeamCity.Docker/ScriptGenerator.cs [28:74]
public IEnumerable<string> GenerateScript(IGraph<IArtifact, Dependency> graph, INode<IArtifact> node, Func<IArtifact, bool> artifactSelector)
{
if (graph == null)throw new ArgumentNullException(nameof(graph));
if (node == null)throw new ArgumentNullException(nameof(node));
if (artifactSelector == null)throw new ArgumentNullException(nameof(artifactSelector));
var artifacts = _buildPathProvider.GetPath(graph, node).Select(i => i.Value).ToList();
var images = artifacts.OfType<Image>().ToList();
if (images.Any())
{
foreach (var reference in artifacts.OfType<Reference>())
{
if (artifactSelector(reference))
{
yield return $"docker pull {reference.RepoTag}";
}
}
// ReSharper disable once IdentifierTypo
var dockerignore = Path.Combine(_options.ContextPath, ".dockerignore").Replace("\\", "/");
var ignores = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
var isFirst = true;
foreach (var image in images)
{
if (artifactSelector(image))
{
if (ignores.Except(image.File.Ignores).Any())
{
yield return $"echo 2> {dockerignore}";
ignores.Clear();
isFirst = false;
}
foreach (var ignore in image.File.Ignores.Except(ignores))
{
var redirection = isFirst ? ">" : ">>";
isFirst = false;
yield return $"echo {ignore} {redirection} {dockerignore}";
ignores.Add(ignore);
}
var dockerFilePath = _pathService.Normalize(Path.Combine(_options.TargetPath, image.File.Path, "Dockerfile"));
yield return $"docker build -f \"{dockerFilePath}\" -t {image.File.ImageId}:{image.File.Tags.First()} \"{_options.ContextPath}\"";
}
}
}
}