Exemple #1
0
        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);
        }