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); }
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"); }
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); }