public IEnumerable GenerateScript()

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}\"";
                    }
                }
            }
        }