private bool SarchForTaskInDesignerProcess(IList <Guid> taskIds, DesignerProcess designerProcess)
        {
            var buildSteps = designerProcess
                             .Phases
                             .SelectMany(phase => phase.Steps);

            foreach (var taskId in taskIds)
            {
                var task = buildSteps.Where(step => step.TaskDefinition.Id == taskId)
                           .FirstOrDefault();

                if (task != null)
                {
                    return(true);
                }
            }

            return(false);
        }
Пример #2
0
        public async Task <Model.BuildDefinition> Handle(
            CreateBuildDefinitionQuery message,
            CancellationToken cancellationToken)
        {
            var connection = _tfsProvider.GetConnection() as VssConnection;

            var git   = connection.GetClient <GitHttpClient>();
            var repos = git.GetRepositoriesAsync().Result;

            var theRepo             = repos.First(r => r.Name.ToLower() == message.BuildDefinition.RepoName);
            var sourceControlServer = connection.GetClient <TfvcHttpClient>();  // connect to the TFS source control subpart
            var buildServer         = connection.GetClient <BuildHttpClient>(); // connect to the build server subpart

            var buildDefinition = new BuildDefinition()
            {
                Name    = message.BuildDefinition.BuildDefinitionName,
                Project = new Microsoft.TeamFoundation.Core.WebApi.TeamProjectReference
                {
                    Id   = message.BuildDefinition.ProjectId,
                    Name = message.BuildDefinition.ProjectName
                },
                Repository = new BuildRepository
                {
                    Id            = theRepo.Id.ToString(),
                    Type          = "TfsGit",
                    DefaultBranch = "refs/heads/dev" //todo: change to /release
                },
                Queue = new AgentPoolQueue
                {
                    Id = 7 //todo
                }
            };
            //Continuous integration
            var continuousIntegrationTrigger = new ContinuousIntegrationTrigger()
            {
                BatchChanges = false
            };

            continuousIntegrationTrigger.BranchFilters.Add("+refs/heads/dev");
            continuousIntegrationTrigger.BranchFilters.Add("+refs/heads/release");

            if (!string.IsNullOrEmpty(message.BuildDefinition.RepoPath))
            {
                continuousIntegrationTrigger.PathFilters.Add($"-/");
                continuousIntegrationTrigger.PathFilters.Add($"+/{message.BuildDefinition.RepoPath}");
            }

            buildDefinition.Triggers.Add(continuousIntegrationTrigger);
            //end Continuous Integration

            var process = new DesignerProcess()
            {
            };
            var phase1 = new Phase()
            {
                Name = "Phase 1"
            };
            string repoPath = message.BuildDefinition.RepoPath;

            if (!string.IsNullOrEmpty(message.BuildDefinition.RepoPath))
            {
                repoPath += "/";
            }
            phase1.Steps.Add(BuildStepBuildApps(repoPath));
            phase1.Steps.Add(BuildStepTestApps(repoPath));
            phase1.Steps.Add(BuildStepPublishTestResults(repoPath));
            phase1.Steps.Add(BuildStepSetVars(repoPath));
            phase1.Steps.Add(BuildStepBuildServiceImage(repoPath));
            phase1.Steps.Add(BuildStepBuildOutput(repoPath, message.ServiceName));
            phase1.Steps.Add(BuildStepPushServiceImage(repoPath));
            phase1.Steps.Add(BuildStepPublishArtifact());

            process.Phases.Add(phase1);
            buildDefinition.Process = process;

            BuildDefinition buildDefinitionResult = null;

            try
            {
                buildDefinitionResult = buildServer.CreateDefinitionAsync(buildDefinition).Result;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return(null);
            }
            Console.WriteLine($"Created build definition {buildDefinition.Name} {buildDefinitionResult.Id}");

            return(buildDefinitionResult.ToModel());
        }
        private void IngestData(List <BuildDefinition> buildDefinitions, TeamProjectReference project)
        {
            List <VssBuildDefinitionEntity>     buildDefinitionEntities     = new List <VssBuildDefinitionEntity>();
            List <VssBuildDefinitionStepEntity> buildDefinitionStepEntities = new List <VssBuildDefinitionStepEntity>();

            foreach (BuildDefinition buildDefinition in buildDefinitions)
            {
                // Parse build definitions
                VssBuildDefinitionEntity buildDefinitionEntity = new VssBuildDefinitionEntity
                {
                    Id                     = buildDefinition.Id,
                    Name                   = buildDefinition.Name,
                    Path                   = buildDefinition.Path,
                    ProjectName            = buildDefinition.Project.Name,
                    ProjectId              = buildDefinition.Project.Id,
                    PoolName               = buildDefinition.Queue?.Pool?.Name,
                    PoolId                 = buildDefinition.Queue?.Pool?.Id,
                    IsHosted               = buildDefinition.Queue?.Pool?.IsHosted,
                    QueueName              = buildDefinition.Queue?.Name,
                    QueueId                = buildDefinition.Queue?.Id,
                    CreatedDate            = buildDefinition.CreatedDate,
                    UniqueName             = buildDefinition.AuthoredBy.UniqueName,
                    Process                = buildDefinition.Process.GetType().Name,
                    WebLink                = (buildDefinition.Links.Links["web"] as ReferenceLink)?.Href,
                    RepositoryName         = buildDefinition.Repository?.Name,
                    RepositoryId           = buildDefinition.Repository?.Id,
                    Organization           = this.vssClient.OrganizationName,
                    GZipCompressedJsonData = Helper.Compress(buildDefinition),
                };
                buildDefinitionEntities.Add(buildDefinitionEntity);

                // Parse build definition steps for designer process
                if (buildDefinition.Process.GetType() == typeof(DesignerProcess))
                {
                    DesignerProcess process    = (DesignerProcess)buildDefinition.Process;
                    int             stepNumber = 1;

                    foreach (Phase phase in process.Phases)
                    {
                        foreach (BuildDefinitionStep buildDefinitionStep in phase.Steps)
                        {
                            VssBuildDefinitionStepEntity buildDefinitionStepEntity = new VssBuildDefinitionStepEntity
                            {
                                StepNumber = stepNumber,

                                // Build definition reference
                                BuildDefinitionId = buildDefinition.Id,
                                ProjectId         = buildDefinition.Project.Id,
                                ProjectName       = buildDefinition.Project.Name,

                                // Phase reference
                                PhaseType    = this.GetPhaseType(phase),
                                PhaseRefName = phase.RefName,
                                PhaseName    = phase.Name,
                                PhaseQueueId = this.GetPhaseQueueId(phase),

                                // Build definition steps
                                DisplayName      = buildDefinitionStep.DisplayName,
                                Enabled          = buildDefinitionStep.Enabled,
                                TaskDefinitionId = buildDefinitionStep.TaskDefinition.Id,
                                TaskVersionSpec  = buildDefinitionStep.TaskDefinition.VersionSpec,
                                Condition        = buildDefinitionStep.Condition,

                                // Extra data context
                                Organization = this.vssClient.OrganizationName,
                                //Data = Helper.SerializeObject(phase.Steps),
                            };
                            buildDefinitionStepEntities.Add(buildDefinitionStepEntity);
                            stepNumber++;
                        }
                    }
                }
                // todo: Need to parse yaml file here
            }

            this.logger.LogInformation("Ingesting build definition data...");
            using VssDbContext dbContext            = new VssDbContext(logger, this.sqlServerConnectionString);
            using IDbContextTransaction transaction = dbContext.Database.BeginTransaction();
            int buildDefinitionEntitiesResult     = dbContext.BulkInsertOrUpdate(buildDefinitionEntities);
            int buildDefinitionStepEntitiesResult = dbContext.BulkInsertOrUpdate(buildDefinitionStepEntities);

            transaction.Commit();
            this.logger.LogInformation($"Done ingesting {buildDefinitionEntitiesResult} build definitions, {buildDefinitionStepEntitiesResult} build definition steps");
        }
Пример #4
0
        public async Task <BuildDefinition> CreateBuildDefinition(string projectName, string repoName, string repoPath, string serviceName, string buildName)
        {
            var clientCredentials = new VssBasicCredential(string.Empty, _connectInfo.PAT);
            var connection        = new VssConnection(_connectInfo.ServerUrl, clientCredentials);


            var git   = connection.GetClient <GitHttpClient>();
            var repos = git.GetRepositoriesAsync().Result;

            var theRepo             = repos.First(r => r.Name.ToLower() == repoName);
            var sourceControlServer = connection.GetClient <TfvcHttpClient>();  // connect to the TFS source control subpart
            var buildServer         = connection.GetClient <BuildHttpClient>(); // connect to the build server subpart

            var buildDefinition = new BuildDefinition()
            {
                Name    = buildName,
                Project = new Microsoft.TeamFoundation.Core.WebApi.TeamProjectReference
                {
                    Id   = _connectInfo.ProjectId,
                    Name = projectName
                },
                Repository = new BuildRepository
                {
                    Id            = theRepo.Id.ToString(),
                    Type          = "TfsGit",
                    DefaultBranch = "refs/heads/dev"
                },
                Queue = new AgentPoolQueue
                {
                    Id = 7 //todo
                }
            };
            var process = new DesignerProcess()
            {
            };
            var phase1 = new Phase()
            {
                Name = "Phase 1"
            };

            if (!string.IsNullOrEmpty(repoPath))
            {
                repoPath += "/";
            }
            phase1.Steps.Add(BuildStepBuildApps(repoPath));
            phase1.Steps.Add(BuildStepTestApps(repoPath));
            phase1.Steps.Add(BuildStepPublishTestResults(repoPath));
            phase1.Steps.Add(BuildStepSetVars(repoPath));
            phase1.Steps.Add(BuildStepBuildServiceImage(repoPath));
            phase1.Steps.Add(BuildStepBuildOutput(repoPath, serviceName));
            phase1.Steps.Add(BuildStepPushServiceImage(repoPath));
            phase1.Steps.Add(BuildStepPublishArtifact());

            process.Phases.Add(phase1);
            buildDefinition.Process = process;

            BuildDefinition buildDefinitionResult = null;

            try
            {
                buildDefinitionResult = buildServer.CreateDefinitionAsync(buildDefinition).Result;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return(null);
            }
            Console.WriteLine($"Created build definition {buildDefinition.Name} {buildDefinitionResult.Id}");


            return(buildDefinitionResult);
        }