Example #1
0
        public void TestStartProcessCreatesEnvironmentVariables()
        {
            var writer = new Mock.MockBuildOutputWriter()
            {
                PrefixSeverity = false
            };

            var agentOptions = new BuildAgentOptions()
            {
                AgentIdentifier  = "AgentID",
                ConcurrentBuilds = 1,
                WorkingPath      = "WorkingPath"
            };

            var codeInfo = new CodeRepositoryInfo()
            {
                Author             = "Author",
                RevisionIdentifier = "RevIdent"
            };

            var buildEntry = new BuildQueueEntry()
            {
                BuildNumber = 999
            };

            var project = new BuildProjectConfiguration()
            {
                ProjectID      = Guid.NewGuid(),
                Name           = "TestProject",
                RepositoryType = "svn",
                RepositoryPath = "repo-path",
                Variables      = new Dictionary <string, string>()
                {
                    { "VarTest", "123" }
                }
            };

            using (var env = new BuildEnvironment("C:\\Build", writer))
            {
                env.AddAgentVariables(agentOptions);
                env.AddCodeInfoVariables(codeInfo);
                env.AddGlobalVariables();
                env.AddQueueEntryVariables(buildEntry);
                env.AddProjectConfigurationVariables(project);

                var resultCode = env.StartProcessAsync("cmd.exe", "/c set").Result;

                Assert.AreEqual(0, resultCode);
            }

            var vars = new Dictionary <string, string>();

            using (var reader = new System.IO.StringReader(writer.StringWriter.ToString()))
            {
                string line;
                while (true)
                {
                    line = reader.ReadLine();
                    if (line == null)
                    {
                        break;
                    }

                    var parts = line.Split(new char[] { '=' }, 2);

                    vars.Add(parts[0], parts[1]);
                }
            }

            Assert.AreEqual("true", vars["CI"]);
            Assert.AreEqual("C:\\Build", vars["CI_WORKINGPATH"]);

            Assert.AreEqual(Environment.MachineName, vars["CI_AGENTHOST"]);
            Assert.AreEqual(agentOptions.AgentIdentifier, vars["CI_AGENTIDENTIFIER"]);

            Assert.AreEqual(codeInfo.RevisionIdentifier, vars["CI_REVISIONIDENTIFIER"]);
            Assert.AreEqual(codeInfo.Author, vars["CI_REVISIONAUTHOR"]);

            Assert.IsNotNull(vars["CI_BUILDDATE"]);
            Assert.IsNotNull(vars["CI_BUILDDATETIME"]);

            Assert.AreEqual(project.NextBuildNumber, int.Parse(vars["CI_BUILDNUMBER"]));

            Assert.AreEqual(project.ProjectID.ToString(), vars["CI_PROJECTID"]);
            Assert.AreEqual(project.Name, vars["CI_PROJECTNAME"]);
            Assert.AreEqual(project.RepositoryType, vars["CI_REPOSITORYTYPE"]);
            Assert.AreEqual(project.RepositoryPath, vars["CI_REPOSITORYPATH"]);
            Assert.AreEqual(project.Variables["VarTest"], vars["CI_VARTEST"]);
        }
Example #2
0
        /// <summary>
        /// Processes build jobs in the given queue one at a time until the queue is emtpy.
        /// </summary>
        /// <param name="projectQueue"></param>
        /// <returns></returns>
        public async Task ProcessQueueAsync(System.Collections.Concurrent.ConcurrentQueue <LocalQueuedJob> projectQueue)
        {
            LocalQueuedJob buildJob;

            while (projectQueue.TryDequeue(out buildJob))
            {
                try
                {
                    var environment = new BuildEnvironment(System.IO.Path.Combine(_options.WorkingPath, buildJob.Configuration.Name), buildJob.Output);
                    int failCount   = buildJob.QueueEntry.FailCount;

                    environment.AddGlobalVariables();
                    environment.AddAgentVariables(_options);
                    environment.AddProjectConfigurationVariables(buildJob.Configuration);
                    environment.AddQueueEntryVariables(buildJob.QueueEntry);

                    // Create the working path if it does not exist
                    if (!System.IO.Directory.Exists(environment.WorkingPath))
                    {
                        System.IO.Directory.CreateDirectory(environment.WorkingPath);
                    }

                    if (!System.IO.Directory.Exists(environment.CodePath))
                    {
                        System.IO.Directory.CreateDirectory(environment.CodePath);
                    }
                    else
                    {
                        // Delete all the files and folders contained in the working path
                        PathUtils.CleanFolder(environment.CodePath);
                    }

                    var maxFailureCount = buildJob.Configuration.MaxFailureCount;
                    var codeRepo        = CodeRepositoryFactory.Create(buildJob.Configuration);
                    var codeInfo        = await codeRepo.GetInfo(buildJob.Configuration.RepositoryPath, buildJob.RevisionIdentifier);

                    environment.AddCodeInfoVariables(codeInfo);

                    // export the code into the working code folder
                    await codeRepo.Export(buildJob.Configuration.RepositoryPath, buildJob.RevisionIdentifier, environment.CodePath);

                    // run each build task in order
                    var buildResult = await buildJob.Configuration.Tasks.RunAllAsync(environment);

                    if (buildResult.Success)
                    {
                        environment.WriteMessage(MessageSeverity.Info, "The build project completed successfully.");
                    }
                    else
                    {
                        failCount++;

                        if (failCount >= maxFailureCount)
                        {
                            buildResult = BuildResult.Fail(buildResult.StatusCode, false);

                            environment.WriteMessage(MessageSeverity.Error, $"The build project failed too many times ({failCount}) and will not be attempted again.");
                        }
                        else
                        {
                            environment.WriteMessage(MessageSeverity.Warn, $"The build project has failed on try {failCount} of {maxFailureCount} and will be attempted again.");
                        }
                    }

                    await _repository.SetBuildResultAsync(buildJob.QueueEntry.BuildQueueID, buildResult);
                }
                catch (Exception ex)
                {
                    await buildJob.Output.LogErrorAsync(ex.Message);

                    await _repository.SetBuildResultAsync(buildJob.QueueEntry.BuildQueueID, BuildResult.Fail(3, true));

                    System.Diagnostics.Debug.WriteLine(ex.Message);
                }
            }
        }