Beispiel #1
0
        private async Task HydratePipeline(Pipeline pipeline, BuildStatus overrideBuildStatus = BuildStatus.None)
        {
            try
            {
                // get all the things
                var buildTypes = await GetBuildTypesAsync();

                var buildQueue = await GetBuildQueueAsync();

                var runningBuilds = await GetRunningBuildsAsync();

                // get status for this pipeline
                var builderUrl  = string.Format(BuildStatusUrl, pipeline.BuilderId);
                var buildStatus = await GetBuildStatusAsync(builderUrl);

                // set stuff for this pipeline
                var buildType = GetBuildTypeById(pipeline.BuilderId, buildTypes);
                pipeline.CurrentStep   = pipeline.Text ?? buildType.name;
                pipeline.BuilderStatus = overrideBuildStatus != BuildStatus.None ? overrideBuildStatus : GetBuildStatusEnum(pipeline.BuilderId, runningBuilds, buildStatus);
                pipeline.Branch        = buildStatus != null ? buildStatus.branchName ?? "default" : "unknown";
                pipeline.UpdatedBy     = await GetUpdatedByAsync(buildStatus);

                pipeline.LastRunText = buildStatus != null?GetLastRunText((string)buildStatus.startDate) : "unknown";

                pipeline.IsQueued = IsBuildQueued(pipeline.BuilderId, buildQueue);

                if (pipeline.BuilderStatus == BuildStatus.Running)
                {
                    var result = GetRunningBuildBranchAndProgress(runningBuilds[pipeline.BuilderId]);
                    pipeline.Branch   = result.Item1;
                    pipeline.Progress = result.Item2;
                }
                else
                {
                    pipeline.Progress = string.Empty;
                }

                pipeline.Branch = pipeline.Branch.Replace("refs/heads/", "");

                // set stuff for the related dev
                var devUsername = "******";
                if (buildStatus != null && buildStatus.lastChanges.count > 0)
                {
                    devUsername = $"{buildStatus.lastChanges.change[0].username}@some-domain************.com";
                }

                var devCacheKey = $"{devUsername}{CacheKeys.Developers}";
                var cached      = _cache.Get <Developer>(devCacheKey);
                if (cached != null)
                {
                    pipeline.BrokenByName    = cached.Name;
                    pipeline.BrokenByPicData = cached.PictureData;
                }
                else
                {
                    var graphClient = _graphAuthProvider.GetAuthenticatedClient();
                    //var dev = await GraphService.GetUserJsonAsync(graphClient, devUsername, _httpContextAccessor.HttpContext);
                    //var devObj = JsonConvert.DeserializeObject<dynamic>(dev);
                    //var devName = devObj?.displayName; // by popular demand we want the teamcity name not the AD name
                    var devName = pipeline.UpdatedBy;
                    var devPic  = await GraphService.GetPictureBase64Async(graphClient, devUsername, _httpContextAccessor.HttpContext);

                    var developer = new Developer {
                        Name = devName, PictureData = devPic
                    };
                    _cache.Set(devCacheKey, developer);
                    pipeline.BrokenByName    = devName;
                    pipeline.BrokenByPicData = devPic;
                }

                switch (pipeline.BuilderStatus)
                {
                case BuildStatus.Failure:
                    pipeline.ShowBroken = true;
                    break;

                case BuildStatus.Success:
                    pipeline.ShowBroken = false;
                    break;

                default:
                    pipeline.ShowBroken = false;
                    break;
                }

                pipeline.BrokenBySpeech = CreateBrokenBySpeech(pipeline.BuilderId, pipeline.BrokenByName, pipeline.BuilderStatus, pipeline.Name);

                pipeline.QAStatus   = !string.IsNullOrWhiteSpace(pipeline.QAId) ? (BuildStatus)GetBuildStatusEnum(pipeline.QAId, runningBuilds, buildStatus) : BuildStatus.None;
                pipeline.STGStatus  = !string.IsNullOrWhiteSpace(pipeline.STGId) ? (BuildStatus)GetBuildStatusEnum(pipeline.STGId, runningBuilds, buildStatus) : BuildStatus.None;
                pipeline.RCStatus   = !string.IsNullOrWhiteSpace(pipeline.RCId) ? (BuildStatus)GetBuildStatusEnum(pipeline.RCId, runningBuilds, buildStatus) : BuildStatus.None;
                pipeline.LIVEStatus = !string.IsNullOrWhiteSpace(pipeline.LIVEId) ? (BuildStatus)GetBuildStatusEnum(pipeline.LIVEId, runningBuilds, buildStatus) : BuildStatus.None;

                pipeline.QACssClass   = GetEnvironmentStatusCssClass(pipeline.QAStatus);
                pipeline.STGCssClass  = GetEnvironmentStatusCssClass(pipeline.STGStatus);
                pipeline.RCCssClass   = GetEnvironmentStatusCssClass(pipeline.RCStatus);
                pipeline.LIVECssClass = GetEnvironmentStatusCssClass(pipeline.LIVEStatus);
            }
            catch (Exception e)
            {
                _logger.Error(e, $"An error occurred trying to hydrate pipeline {pipeline.Name}.");
            }
        }