private static async Task <bool> DeployWebsite() { try { Console.WriteLine("Setting Website Keys..."); string searchQueryKey = ConfigurationManager.AppSettings["SearchServiceQueryKey"]; string envText = File.ReadAllText("../../../../frontend/.env"); envText = envText.Replace("[SearchServiceName]", ConfigurationManager.AppSettings["SearchServiceName"]); envText = envText.Replace("[SearchServiceDomain]", _searchClient.SearchDnsSuffix); envText = envText.Replace("[IndexName]", IndexName); envText = envText.Replace("[SearchServiceApiKey]", searchQueryKey); envText = envText.Replace("[SearchServiceApiVersion]", _searchClient.ApiVersion); envText = envText.Replace("[AzureFunctionName]", ConfigurationManager.AppSettings["AzureFunctionSiteName"]); envText = envText.Replace("[AzureFunctionDefaultHostKey]", await KeyHelper.GetAzureFunctionHostKey(_httpClient)); File.WriteAllText("../../../../frontend/.env", envText); Console.WriteLine("Website keys have been set. Please build the website and then return here and press any key to continue."); Console.ReadKey(); Console.WriteLine("Deploying Website..."); if (File.Exists("website.zip")) { File.Delete("website.zip"); } ZipFile.CreateFromDirectory("../../../../frontend/dist", "website.zip"); byte[] websiteZip = File.ReadAllBytes("website.zip"); HttpContent content = new ByteArrayContent(websiteZip); string uri = String.Format("https://{0}.scm.azurewebsites.net/api/zipdeploy?isAsync=true", ConfigurationManager.AppSettings["AzureWebAppSiteName"]); byte[] credentials = Encoding.ASCII.GetBytes(String.Format("{0}:{1}", ConfigurationManager.AppSettings["AzureWebAppUsername"], ConfigurationManager.AppSettings["AzureWebAppPassword"])); _httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(credentials)); HttpResponseMessage response = await _httpClient.PostAsync(uri, content); if (DebugMode) { string responseText = await response.Content.ReadAsStringAsync(); Console.WriteLine("Deploy website response: \n{0}", responseText); } if (!response.IsSuccessStatusCode) { return(false); } Console.WriteLine("Website deployment accepted. Waiting for deployment to complete..."); IEnumerable <string> values; if (response.Headers.TryGetValues("Location", out values)) { string pollingUri = values.First(); bool complete = false; while (!complete) { Thread.Sleep(3000); HttpResponseMessage pollingResponse = await _httpClient.GetAsync(pollingUri); string responseText = await pollingResponse.Content.ReadAsStringAsync(); JObject json = JObject.Parse(responseText); complete = json.SelectToken("complete") == null ? false : json.SelectToken("complete").ToObject <bool>(); if (DebugMode) { Console.WriteLine("Current website deployment status: {0}", json.SelectToken("progress")?.ToString()); } } Console.WriteLine("Website deployment completed."); } else { Console.WriteLine("Could not find polling url from response."); } Console.WriteLine("Website url: https://{0}.azurewebsites.net/", ConfigurationManager.AppSettings["AzureWebAppSiteName"]); } catch (Exception ex) { if (DebugMode) { Console.WriteLine("Error deploying website: {0}", ex.Message); } return(false); } return(true); }