Exemplo n.º 1
0
        public async void PostToStride(string strideWebhook, string strideApiKey, StrideMessageModel payload)
        {
            try
            {
                var payloadJson = JsonConvert.SerializeObject(payload);
                _log.Info($"Payload JSON {payloadJson}");
                _log.Info($"Stride Webhook URL {strideWebhook}");

                using (var client = new HttpClient())
                {
                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", strideApiKey);

                    var content  = new StringContent(payloadJson, Encoding.UTF8, "application/json");
                    var response = await client.PostAsync(strideWebhook, content);

                    response.EnsureSuccessStatusCode();
                }
            }
            catch (Exception ex)
            {
                _log.Error(ex.Message, ex);
            }
        }
Exemplo n.º 2
0
 public void PostToStride(StrideMessageModel payload)
 {
     PostToStride(_strideWebhook, _strideApiKey, payload);
 }
Exemplo n.º 3
0
        public static async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequestMessage req, TraceWriter log)
        {
            log.Info("C# HTTP trigger function processed a request.");

            string channelUrl = req.Headers?.FirstOrDefault(h => h.Key.ToLowerInvariant() == "channelurl").Value?.FirstOrDefault();
            string channelKey = req.Headers?.FirstOrDefault(h => h.Key.ToLowerInvariant() == "channelkey").Value?.FirstOrDefault();

            if (string.IsNullOrWhiteSpace(channelUrl) || string.IsNullOrWhiteSpace(channelKey))
            {
                channelUrl = KeyManager.GetSecret("StrideWebhookUrl");
                channelKey = KeyManager.GetSecret("StrideAuthToken");

                if (string.IsNullOrWhiteSpace(channelUrl) || string.IsNullOrWhiteSpace(channelKey))
                {
                    return(new BadRequestResult());
                }
            }

            string requestBody = new StreamReader(await req.Content.ReadAsStreamAsync()).ReadToEnd();
            var    request     = JsonConvert.DeserializeObject <VstsMessageModel>(requestBody);

            if (request.EventType.ToLowerInvariant() != "build.complete")
            {
                return(new OkObjectResult(""));
            }

            var buildSucceeded = request.Resource.Status.ToLowerInvariant() == "succeeded";

            var triggeredByUser = request.Resource.Requests.FirstOrDefault() == null ? "Someone"
                                : request.Resource.Requests.FirstOrDefault()?.RequestedFor?.DisplayName;

            var triggeredByUserImage = "https://avatarfiles.alphacoders.com/643/thumb-64385.png";

            var buildDuration = Math.Round(request.Resource.FinishTime.Subtract(request.Resource.StartTime).TotalMinutes, 1);

            var strideService = new StrideService(log, channelUrl, channelKey);
            var model         = new StrideMessageModel
            {
                Version = 1,
                Type    = "doc",
                Content = new[] {
                    new Content
                    {
                        Type  = "applicationCard",
                        Attrs = new Attrs
                        {
                            Details = new[]
                            {
                                new Detail
                                {
                                    Lozenge = new Lozenge
                                    {
                                        Appearance = "default",
                                        Text       = $"{buildDuration} minute(s)"
                                    }
                                }
                            },
                            Text = request.DetailedMessage.Text,
                            Link = new Link
                            {
                                Url = $"https://dotcontrol.visualstudio.com/{request.ResourceContainers.Project.Id}/_build/index?buildId={request.Resource.Requests.FirstOrDefault()?.Id}&_a=summary"
                            },
                            Collapsible = true,
                            Title       = new Title
                            {
                                Text = buildSucceeded
                                                                                ? $"{triggeredByUser} successfully triggered a build, hooray!"
                                                                                : $"{triggeredByUser} broke the build!",
                                User = new User
                                {
                                    Icon = new Icon
                                    {
                                        Url   = triggeredByUserImage,
                                        Label = triggeredByUser
                                    }
                                }
                            },
                            Description = new Description
                            {
                                Text = request.DetailedMessage.Text
                            },
                            Preview = new Link
                            {
                                Url = buildSucceeded ? _successImages[_randomizer.Next(_successImages.Length)]
                                                                                : _failedImages[_randomizer.Next(_failedImages.Length)]
                            },
                            Context = new Context
                            {
                                Icon = new Icon
                                {
                                    Url   = "https://a3bf67a2345da5d6ee8b-6d37b1ee447a16ff81e1420be19ec8c3.ssl.cf5.rackcdn.com/vsts/vsts.png",
                                    Label = "VSTS"
                                },
                                Text = $"{request.Resource.Definition.Name} {request.Resource.Status}"
                            }
                        }
                    }
                }
            };

            strideService.PostToStride(model);
            return(new OkObjectResult(""));
        }