public async static void CreateBuildDefinition(string teamProject) { var tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(collectionUrl)); var bhc = tpc.GetClient <BuildHttpClient>(); string templateProject = "TEMPLATE_PROJECT"; int templateId = FindBuildDefinitionId(templateProject, "TEMPLATE_BUILD"); BuildDefinition buildDefTemplate = (await bhc.GetDefinitionAsync(templateProject, templateId)); buildDefTemplate.Project = null; buildDefTemplate.Name = "NewBuild"; var repository = buildDefTemplate.Repository; buildDefTemplate.Repository = null; repository.Url = null; repository.Id = null; repository.Name = teamProject; buildDefTemplate.Repository = repository; var queue = buildDefTemplate.Queue; buildDefTemplate.Queue = null; AgentPoolQueue newQueue = new AgentPoolQueue(); newQueue.Name = queue.Name; buildDefTemplate.Queue = newQueue; buildDefTemplate.Variables.Clear(); BuildDefinitionVariable var1 = new BuildDefinitionVariable(); var1.Value = "value"; buildDefTemplate.Variables.Add("key", var1); await bhc.CreateDefinitionAsync(buildDefTemplate, teamProject); }
public bool RunCI() { VssConnection connection = new VssConnection(new Uri(collectionUri), new VssBasicCredential(string.Empty, pat)); BuildHttpClient buildClient = connection.GetClient <BuildHttpClient>(); Task <List <BuildDefinitionReference> > buildDefs = Task.Run(() => buildClient.GetDefinitionsAsync(projectName, null, null, null, null, null, null, null, null, null, null, null)); buildDefs.Wait(); List <BuildDefinition> buildDefinitions = new List <BuildDefinition>(); foreach (BuildDefinitionReference bdr in buildDefs.Result) { Task <BuildDefinition> bd = Task.Run(() => buildClient.GetDefinitionAsync(projectName, bdr.Id)); bd.Wait(); buildDefinitions.Add(bd.Result); } SortedList <int, BuildDefinition> buildIsNeeded = new SortedList <int, BuildDefinition>(); foreach (BuildDefinition buildDef in buildDefinitions) { bool ignoreDefintion = true; if (buildDef.Repository != null && buildDef.Repository.Type == "Svn") { // get last version from the repository int buildOrder = 0; if (buildDef.Variables.ContainsKey("buildOrder")) { BuildDefinitionVariable bvBuildOrder = null; if (buildDef.Variables.TryGetValue("buildOrder", out bvBuildOrder)) { buildOrder = Convert.ToInt32(bvBuildOrder.Value); } } if (buildDef.Variables.ContainsKey("buildCI")) { BuildDefinitionVariable bvBuildCi = null; if (buildDef.Variables.TryGetValue("buildCI", out bvBuildCi)) { ignoreDefintion = !Convert.ToBoolean(bvBuildCi.Value); } } if (!ignoreDefintion) { long lastRepositoryVersion = GetLatestCheckinVersion(buildDef.Repository.Id, buildDef.Repository.DefaultBranch); // get last version from builds Task <List <Microsoft.TeamFoundation.Build.WebApi.Build> > taskBuildList = Task.Run(() => buildClient.GetBuildsAsync(projectName, new List <int> { buildDef.Id })); taskBuildList.Wait(); Microsoft.TeamFoundation.Build.WebApi.Build latestBuild = taskBuildList.Result[0] as Microsoft.TeamFoundation.Build.WebApi.Build; if (latestBuild != null) { if (Convert.ToInt64(latestBuild.SourceVersion) < lastRepositoryVersion) { Console.WriteLine(string.Format("Build is required for {0} - last built version {1} last checkin version {2}", buildDef.Name, latestBuild.SourceVersion, lastRepositoryVersion)); buildIsNeeded.Add(buildOrder, buildDef); } else { Console.WriteLine(string.Format("Build is up to date for {0} - last built version {1} last checkin version {2}", buildDef.Name, latestBuild.SourceVersion, lastRepositoryVersion)); } } } } } // now we know what needs to be build, we must trigger any builds... foreach (BuildDefinition buildDef in buildIsNeeded.Values) { Console.WriteLine(string.Format("Triggering build for {0}", buildDef.Name)); Build build = new Build() { Definition = buildDef, Project = buildDef.Project, Reason = BuildReason.IndividualCI }; Task <Build> taskBuild = Task.Run(() => buildClient.QueueBuildAsync(build)); taskBuild.Wait(); return(true); // ONLY ALLOW **ONE** BUILD PER TIME } return(false); }