private void ProcessMainProject(ArtifactoryBuild _task)
        {
            if (_task.SkipParent != null && _task.SkipParent.Equals("true"))
            {
                return;
            }

            /*Main project*/
            var mainProjectParser = new ProjectHandler(_task.ProjectName, _task.ProjectPath);

            /*
             * Trying to check if Artifactory configuration file exists (overrides) in the sub module level.
             *  If not we will use the configurations from the solution level
             */
            if (!mainProjectParser.parseArtifactoryConfigFile(_task.ProjectPath, _task))
            {
                mainProjectParser.ArtifactoryConfiguration = MainArtifactoryConfiguration;
            }

            var mainProject = mainProjectParser.generate();

            if (mainProject != null)
            {
                BuildInfoExtractor.ProccessModule(_buildInfo, mainProject, _task);
            }
        }
        public void deploy(ArtifactoryBuild task, Build build, BuildInfoLog log) 
        {
            ArtifactoryBuildInfoClient client = new ArtifactoryBuildInfoClient(task.Url, task.User, task.Password, log);
            client.setProxy(build.deployClient);
            client.setConnectionTimeout(build.deployClient);

            try
            {
                if (task.DeployEnabled != null && task.DeployEnabled.Equals("true"))
                {
                    /* Deploy every artifacts from the Map< module.name : artifact.name > => List<DeployDetails> */
                    task.deployableArtifactBuilderMap.ToList().ForEach(entry => entry.Value.ForEach(artifact => client.deployArtifact(artifact)));
                }

                if (task.BuildInfoEnabled != null && task.BuildInfoEnabled.Equals("true"))
                {
                    //Upload Build Info json file to Artifactory
                    log.Info("Uploading build info to Artifactory...");
                    /* Send Build Info  */
                    client.sendBuildInfo(build);
                }
            }
            catch (Exception e)
            {
                log.Error("Exception has append from ArtifactoryBuildInfoClient: " + e.Message, e);
                throw new Exception("Exception has append from ArtifactoryBuildInfoClient: " + e.Message, e);
            }
            finally 
            {
                client.Dispose();
            }         
        }
        public void deploy(ArtifactoryBuild task, Build build, BuildInfoLog log)
        {
            ArtifactoryBuildInfoClient client = new ArtifactoryBuildInfoClient(task.Url, task.User, task.Password, log);

            client.setProxy(build.deployClient);
            client.setConnectionTimeout(build.deployClient);

            try
            {
                if (task.DeployEnabled != null && task.DeployEnabled.Equals("true"))
                {
                    /* Deploy every artifacts from the Map< module.name : artifact.name > => List<DeployDetails> */
                    task.deployableArtifactBuilderMap.ToList().ForEach(entry => entry.Value.ForEach(artifact => client.deployArtifact(artifact)));
                }

                if (task.BuildInfoEnabled != null && task.BuildInfoEnabled.Equals("true"))
                {
                    //Upload Build Info json file to Artifactory
                    log.Info("Uploading build info to Artifactory...");
                    /* Send Build Info  */
                    client.sendBuildInfo(build);
                }
            }
            catch (Exception e)
            {
                log.Error("Exception has append from ArtifactoryBuildInfoClient: " + e.Message, e);
                throw new Exception("Exception has append from ArtifactoryBuildInfoClient: " + e.Message, e);
            }
            finally
            {
                client.Dispose();
            }
        }
        public static Agent BuildAgentFactory(ArtifactoryBuild task)
        {
            if (task.TfsActive != null && task.TfsActive.Equals("True"))
            {
                return(new AgentTFS(task));
            }

            return(new AgentMSBuild(task));
        }
Example #5
0
        // C# time format is not consistent with Artifactory requirements
        // C# format: "2017-01-11T11:21:31.31+02:00" the issue is with the ':' in the time zone
        // Expected:  "2017-01-11T11:21:31.31+0200"
        private static string getBuildInfoStartTime(ArtifactoryBuild task)
        {
            string startTime = string.Format(Build.STARTED_FORMAT, task.StartTime);

            if (startTime.Contains("+") || startTime.Contains("-"))
            {
                startTime = startTime.Remove(startTime.LastIndexOf(":"), 1);
            }
            return(startTime);
        }
        public static Agent BuildAgentFactory(ArtifactoryBuild task) 
        {
            if (task.TfsActive != null && task.TfsActive.Equals("True"))
            {
                IEnumerable<String> tfsCollectionURI = BuildEngineExtensions.GetEnvironmentVariable(task.BuildEngine, "TF_BUILD_COLLECTIONURI", false);
                if (tfsCollectionURI != null)
                {
                    return new AgentTFS(task);
                }
                else
                {
                    return new AgentTFS2015(task);
                }
            }

            return new AgentMSBuild(task);
        }
        public static Agent BuildAgentFactory(ArtifactoryBuild task)
        {
            if (task.TfsActive != null && task.TfsActive.Equals("True"))
            {
                IEnumerable <String> tfsCollectionURI = BuildEngineExtensions.GetEnvironmentVariable(task.BuildEngine, "TF_BUILD_COLLECTIONURI", false);
                if (tfsCollectionURI != null)
                {
                    return(new AgentTFS(task));
                }
                else
                {
                    return(new AgentTFS2015(task));
                }
            }

            return(new AgentMSBuild(task));
        }
        /// <summary>
        /// Read all referenced nuget`s in the .csproj calculate their md5, sha1 and id.
        /// </summary>
        public static void ProccessModule(Build build, ProjectModel project, ArtifactoryBuild _task)
        {
            var module = new Module(project.AssemblyName);

            string localSource = Path.Combine(_task.SolutionRoot, "packages");

            //string[] directoryPaths = Directory.GetDirectories(_task.SolutionRoot, project.AssemblyName, SearchOption.AllDirectories);
            string[] packageConfigPath = Directory.GetFiles(project.projectDirectory, "packages.config", SearchOption.AllDirectories);

            if (project.artifactoryDeploy != null && !string.IsNullOrWhiteSpace(_task.DeployEnabled) && _task.DeployEnabled.Equals("true"))
            {
                foreach (ProjectModel.DeployAttribute deployAttribute in project.artifactoryDeploy)
                {
                    List <DeployDetails> details = BuildArtifacts.resolve(deployAttribute, project.projectDirectory, _task.DeploymentRepository);
                    deployAttribute.properties.AddRange(build.getDefaultProperties());
                    foreach (DeployDetails artifactDetail in details)
                    {
                        //Add default artifact properties
                        artifactDetail.properties = Build.buildMatrixParamsString(deployAttribute.properties);

                        string artifactName = artifactDetail.file.Name;
                        module.Artifacts.Add(new Artifact
                        {
                            type = artifactDetail.file.Extension.Replace(".", String.Empty),
                            md5  = artifactDetail.md5,
                            sha1 = artifactDetail.sha1,
                            name = artifactName
                        });

                        string artifactId = module.id + ":" + artifactName;
                        if (_task.deployableArtifactBuilderMap.ContainsKey(artifactId))
                        {
                            _task.deployableArtifactBuilderMap[artifactId].Add(artifactDetail);
                        }
                        else
                        {
                            _task.deployableArtifactBuilderMap.Add(artifactId, new List <DeployDetails> {
                                artifactDetail
                            });
                        }
                    }
                }
            }
            addDependencies(project.AssemblyName, module, localSource, packageConfigPath, _task.Configuration);
            build.modules.Add(module);
        }
        public static Build extractBuild(ArtifactoryBuild task, ArtifactoryConfig artifactoryConfig, BuildInfoLog log)
        {
            Build build = new Build
            {
                modules = new List <Module>(),
            };

            build.started = string.Format(Build.STARTED_FORMAT, task.StartTime);
            build.artifactoryPrincipal = task.User;
            build.buildAgent           = new BuildAgent {
                name = "MSBuild", version = task.ToolVersion
            };
            build.type = "MSBuild";

            build.agent = Agent.BuildAgentFactory(task);

            //get the current use from the windows OS
            System.Security.Principal.WindowsIdentity user;
            user = System.Security.Principal.WindowsIdentity.GetCurrent();
            if (user != null)
            {
                build.principal = string.Format(@"{0}", user.Name);
            }

            //Calculate how long it took to do the build
            DateTime start = DateTime.ParseExact(task.StartTime, artifactoryDateFormat, null);

            build.startedDateMillis = GetTimeStamp();
            build.durationMillis    = Convert.ToInt64((DateTime.Now - start).TotalMilliseconds);

            build.number      = string.IsNullOrWhiteSpace(task.BuildNumber) ? build.startedDateMillis : task.BuildNumber;
            build.name        = task.BuildName ?? task.ProjectName;
            build.url         = build.agent.BuildAgentUrl();
            build.vcsRevision = task.VcsRevision;

            //Add build server properties, if exists.
            AddSystemVariables(artifactoryConfig, build);
            AddLicenseControl(artifactoryConfig, build, log);
            AddBlackDuck(artifactoryConfig, build, log);

            ConfigHttpClient(artifactoryConfig, build);

            return(build);
        }
        /// <summary>
        /// Read all referenced nuget`s in the .csproj calculate their md5, sha1 and id.
        /// </summary>
        public static void ProccessModule(Build build, ProjectModel project, ArtifactoryBuild _task)
        {
            var module = new Module(project.AssemblyName);

            string localSource = Path.Combine(_task.SolutionRoot, "packages");
            //string[] directoryPaths = Directory.GetDirectories(_task.SolutionRoot, project.AssemblyName, SearchOption.AllDirectories);
            string[] packageConfigPath = Directory.GetFiles(project.projectDirectory, "packages.config", SearchOption.AllDirectories);

            if (project.artifactoryDeploy != null && !string.IsNullOrWhiteSpace(_task.DeployEnabled) && _task.DeployEnabled.Equals("true"))
            {
                foreach (ProjectModel.DeployAttribute deployAttribute in project.artifactoryDeploy)
                {
                    List<DeployDetails> details = BuildArtifacts.resolve(deployAttribute, project.projectDirectory, _task.DeploymentRepository);
                    deployAttribute.properties.AddRange(build.getDefaultProperties());
                    foreach (DeployDetails artifactDetail in details)
                    {
                        //Add default artifact properties                    
                        artifactDetail.properties = Build.buildMatrixParamsString(deployAttribute.properties);

                        string artifactName = artifactDetail.file.Name;
                        module.Artifacts.Add(new Artifact
                        {
                            type = artifactDetail.file.Extension.Replace(".", String.Empty),
                            md5 = artifactDetail.md5,
                            sha1 = artifactDetail.sha1,
                            name = artifactName
                        });

                        string artifactId = module.id + ":" + artifactName;
                        if (_task.deployableArtifactBuilderMap.ContainsKey(artifactId))
                        {
                            _task.deployableArtifactBuilderMap[artifactId].Add(artifactDetail);
                        }
                        else
                        {
                            _task.deployableArtifactBuilderMap.Add(artifactId, new List<DeployDetails> { artifactDetail });
                        }
                    }
                }
            }
            addDependencies(project.AssemblyName, module, localSource, packageConfigPath, _task.Configuration);
            build.modules.Add(module);
        }
        private void ProcessMainProject(ArtifactoryBuild _task)
        {
            if (_task.SkipParent != null && _task.SkipParent.Equals("true"))
                return;

         /*Main project*/
            var mainProjectParser = new ProjectHandler(_task.ProjectName, _task.ProjectPath);
            /*
                 * Trying to check if Artifactory configuration file exists (overrides) in the sub module level.
                 *  If not we will use the configurations from the solution level
                 */
            if (!mainProjectParser.parseArtifactoryConfigFile(_task.ProjectPath, _task))
            {
                mainProjectParser.ArtifactoryConfiguration = MainArtifactoryConfiguration;
            }

            var mainProject = mainProjectParser.generate();
            if (mainProject != null)
            {
                BuildInfoExtractor.ProccessModule(_buildInfo, mainProject, _task);
            }
        }
        /*
         * Trying to read the "artifactory.build" file for deployment configuration.
         */
        public bool parseArtifactoryConfigFile(string projectArtifactoryConfigPath, ArtifactoryBuild task)
        {
            FileInfo artifactoryConfigurationFile = new FileInfo(projectArtifactoryConfigPath + "Artifactory.build");

            if (artifactoryConfigurationFile.Exists)
            {
                StringBuilder xmlContent = SolutionHandler.MsbuildInterpreter(artifactoryConfigurationFile, task);
                System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(ArtifactoryConfig));
                ArtifactoryConfiguration = (ArtifactoryConfig)reader.Deserialize(new System.IO.StringReader(xmlContent.ToString()));

                //Validate the xml file
                if (ArtifactoryConfiguration.PropertyGroup == null || ArtifactoryConfiguration.PropertyGroup.Deployments == null ||
                    ArtifactoryConfiguration.PropertyGroup.Deployments.Deploy == null)
                {
                    return(false);
                }

                return(true);
            }

            return(false);
        }
        /*
         * Trying to read the "artifactory.build" file for deployment configuration.
         */
        public bool parseArtifactoryConfigFile(string projectArtifactoryConfigPath, ArtifactoryBuild task)
        {
            FileInfo artifactoryConfigurationFile = new FileInfo(projectArtifactoryConfigPath + "Artifactory.build");
            if (artifactoryConfigurationFile.Exists)
            {

                StringBuilder xmlContent = SolutionHandler.MsbuildInterpreter(artifactoryConfigurationFile, task);
                System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(ArtifactoryConfig));
                ArtifactoryConfiguration = (ArtifactoryConfig)reader.Deserialize(new System.IO.StringReader(xmlContent.ToString()));

                //Validate the xml file
                if (ArtifactoryConfiguration.PropertyGroup == null || ArtifactoryConfiguration.PropertyGroup.Deployments == null ||
                    ArtifactoryConfiguration.PropertyGroup.Deployments.Deploy == null)
                {
                    return false;
                }

                return true;
            }

            return false;
        }
        public static Build extractBuild(ArtifactoryBuild task, ArtifactoryConfig artifactoryConfig, BuildInfoLog log)
        {
            Build build = new Build
            {
                modules = new List<Module>(),
            };

            build.started = string.Format(Build.STARTED_FORMAT, task.StartTime);
            build.artifactoryPrincipal = task.User;
            build.buildAgent = new BuildAgent { name = "MSBuild", version = task.ToolVersion };
            build.type = "MSBuild";

            build.agent = Agent.BuildAgentFactory(task);

            //get the current use from the windows OS
            System.Security.Principal.WindowsIdentity user;
            user = System.Security.Principal.WindowsIdentity.GetCurrent();
            if (user != null) build.principal = string.Format(@"{0}", user.Name);

            //Calculate how long it took to do the build
            DateTime start = DateTime.ParseExact(task.StartTime, artifactoryDateFormat, null);
            build.startedDateMillis = GetTimeStamp();
            build.durationMillis = Convert.ToInt64((DateTime.Now - start).TotalMilliseconds);

            build.number = string.IsNullOrWhiteSpace(task.BuildNumber) ? build.startedDateMillis : task.BuildNumber;
            build.name = task.BuildName ?? task.ProjectName;
            build.url = build.agent.BuildAgentUrl();
            build.vcsRevision = task.VcsRevision;

            //Add build server properties, if exists.
            AddSystemVariables(artifactoryConfig, build);
            AddLicenseControl(artifactoryConfig, build, log);
            AddBlackDuck(artifactoryConfig, build, log);

            ConfigHttpClient(artifactoryConfig, build);

            return build;
        }
Example #15
0
 public AgentMSBuild(ArtifactoryBuild task)
 {
     name    = "MSBuild";
     version = task.ToolVersion;
 }
        /// <summary>
        /// Replacing all the MSBuild properties placeholder $()
        /// </summary>
        /// <param name="artifactoryConfigurationFile">Full file path</param>
        /// <param name="task">MSBuild implemented Task</param>
        /// <returns>New file content after replacement.</returns>
        public static StringBuilder MsbuildInterpreter(FileInfo artifactoryConfigurationFile, ArtifactoryBuild task)
        {
            StringBuilder xmlContent = new StringBuilder(artifactoryConfigurationFile.OpenText().ReadToEnd());

            Regex           propertiesPattern = new Regex(@"(\$\([\w]+\))");
            MatchCollection matchCollection   = propertiesPattern.Matches(xmlContent.ToString());

            foreach (var match in matchCollection)
            {
                string propertyKey = match.ToString().Replace("$(", string.Empty).Replace(")", string.Empty);
                IEnumerable <String> msbuildProperty = BuildEngineExtensions.GetEnvironmentVariable(task.BuildEngine, propertyKey, false);
                if (msbuildProperty != null)
                {
                    xmlContent = xmlContent.Replace(match.ToString(), msbuildProperty.First());
                }
            }
            return(xmlContent);
        }
 public SolutionHandler(ArtifactoryBuild task, BuildInfoLog log)
 {
     _task = task;
     _log  = log;
     GetMainConfiguration();
 }
        /// <summary>
        /// Replacing all the MSBuild properties placeholder $()
        /// </summary>
        /// <param name="artifactoryConfigurationFile">Full file path</param>
        /// <param name="task">MSBuild implemented Task</param>
        /// <returns>New file content after replacement.</returns>
        public static StringBuilder MsbuildInterpreter(FileInfo artifactoryConfigurationFile, ArtifactoryBuild task)
        {
            StringBuilder xmlContent = new StringBuilder(artifactoryConfigurationFile.OpenText().ReadToEnd());

            Regex propertiesPattern = new Regex(@"(\$\([\w]+\))");
            MatchCollection matchCollection = propertiesPattern.Matches(xmlContent.ToString());
            foreach (var match in matchCollection)
            {
                string propertyKey = match.ToString().Replace("$(", string.Empty).Replace(")", string.Empty);
                IEnumerable<String> msbuildProperty = BuildEngineExtensions.GetEnvironmentVariable(task.BuildEngine, propertyKey, false);
                if (msbuildProperty != null)
                {
                    xmlContent = xmlContent.Replace(match.ToString(), msbuildProperty.First());
                }
            }
            return xmlContent;
        }
 public AgentTFS2015(ArtifactoryBuild task)
 {
     name = "TFS2015";
     version = "";
     buildEngine = task.BuildEngine;
 }
 // C# time format is not consistent with Artifactory requirements
 // C# format: "2017-01-11T11:21:31.31+02:00" the issue is with the ':' in the time zone
 // Expected:  "2017-01-11T11:21:31.31+0200"
 private static string getBuildInfoStartTime(ArtifactoryBuild task)
 {
     string startTime = string.Format(Build.STARTED_FORMAT, task.StartTime);
     if (startTime.Contains("+") || startTime.Contains("-"))
     {
         startTime = startTime.Remove(startTime.LastIndexOf(":"), 1);
     }
     return startTime;
 }
 public SolutionHandler(ArtifactoryBuild task, BuildInfoLog log) 
 {
     _task = task;
     _log = log;
     GetMainConfiguration();
 }
 public AgentTFS(ArtifactoryBuild task)
 {
     name = "TFS";
     version = "";
     buildEngine = task.BuildEngine;
 }
 public AgentMSBuild(ArtifactoryBuild task) 
 {
     name = "MSBuild";
     version = task.ToolVersion; 
 }