Inscenizacja czy produkcja?

Czy jest gdzieś w środowisku uruchomieniowym usługi, które powiedziałoby mi, czy jestem obecnie uruchomiony na "Staging" lub "produkcja"? Ręczne modyfikowanie konfiguracji do i z produkcji wydaje się nieco kłopotliwe.

Author: abatishchev, 2010-12-01

6 answers

Naprawdę nie powinieneś zmieniać konfiguracji, gdy jesteś oparty na Czy Jesteś w Prod lub Staging. Miejsce postoju nie jest zaprojektowane jako środowisko "QA", ale tylko obszar przechowywania przed wdrożeniem produkcji.

Po przesłaniu nowego wdrożenia obecne miejsce wdrożenia, do którego przesyłany jest pakiet, jest zniszczone i nie działa przez 10-15 minut, podczas gdy trwa wysyłanie i uruchamianie maszyn wirtualnych. Jeśli załadujesz bezpośrednio do produkcji, to 15 minut przestoju produkcji. Tak więc, Wymyślono miejsce postojowe: prześlij do miejsca postojowego, przetestuj materiał i kliknij przycisk "Zamień", a twoje środowisko postojowe magicznie stanie się produkcją (virtual IP swap). Tak więc twoja inscenizacja powinna być w 100% taka sama jak twoja produkcja.

Myślę, że szukasz środowiska QA / testing? Powinieneś otworzyć nową usługę dla środowiska testowego z własnym Prod/Staging. W takim przypadku należy zachować wiele zestawów plików konfiguracyjnych, po jednym zestawie na wdrożenie środowisko (produkcja, testowanie itp.)

Istnieje wiele sposobów zarządzania konfiguracją-piekło, które występuje, zwłaszcza z Azure, który ma na górze .pliki konfiguracyjne, własne *.pliki cscfg. Sposób, w jaki preferuję to zrobić z Azure project, jest następujący: Skonfiguruj mały projekt konfiguracyjny, Utwórz tam foldery pasujące do typów wdrażania. Wewnątrz każdego folderu ustawione są zestawy *.config&*.pliki cscfg dopasowane do konkretnego środowiska wdrażania: debugowanie, testowanie, Wydanie... są to ustawienia w Visual Studio jak również, jak budować typy docelowe. Mam małe polecenie xcopy, które pojawia się podczas każdej kompilacji projektu Config, które kopiuje wszystkie pliki z folderu docelowego Build projektu Config do folderu głównego projektu Config.

Następnie każdy inny projekt w rozwiązaniu, linki do .config or .plik cscfg z folderu głównego projektu Config.

Voila, moje konfiguracje magicznie dostosowują się do każdej konfiguracji kompilacji automatycznie. Ja też używam .Config transformations to manage debugowanie informacji o Release vs. non-Release Build targets.

Jeśli przeczytałeś to wszystko i nadal chcesz uzyskać status produkcja vs. Staging w czasie wykonywania, to: Get deploymentId from RoleEnvironment.DeploymentId Następnie użyj API zarządzania z odpowiednim X509 certificate, aby uzyskać Azure structure of your Service i wywołać metodę GetDeployments (jest to rest api, ale istnieje Biblioteka abstrakcji).

Hope this helps

Edit: wpis na blogu o konfiguracji ciągów konfiguracyjnych i przełączaniu między środowiskami @ http://blog.paraleap.com/blog/post/Managing-environments-in-a-distributed-Azure-or-other-cloud-based-NET-solution

 75
Author: Igorek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-16 15:19:48

Czasami chciałbym, żeby ludzie po prostu odpowiedzieli na pytanie.. nie wyjaśniaj etyki ani najlepszych praktyk...

Microsoft opublikował przykładowy kod robiący dokładnie to tutaj: https://code.msdn.microsoft.com/windowsazure/CSAzureDeploymentSlot-1ce0e3b5

obraz pokazujący instancję Staging

obraz pokazujący wystąpienie produkcji

protected void Page_Load(object sender, EventArgs e) 
{ 
    // You basic information of the Deployment of Azure application. 
    string deploymentId = RoleEnvironment.DeploymentId; 
    string subscriptionID = "<Your subscription ID>"; 
    string thrumbnail = "<Your certificate thumbnail print>"; 
    string hostedServiceName = "<Your hosted service name>"; 
    string productionString = string.Format(
        "https://management.core.windows.net/{0}/services/hostedservices/{1}/deploymentslots/{2}",
        subscriptionID, hostedServiceName, "Production"); 
    Uri requestUri = new Uri(productionString); 

    // Add client certificate. 
    X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
    store.Open(OpenFlags.OpenExistingOnly); 
    X509Certificate2Collection collection = store.Certificates.Find(
        X509FindType.FindByThumbprint, thrumbnail, false); 
    store.Close(); 

    if (collection.Count != 0) 
    { 
        X509Certificate2 certificate = collection[0]; 
        HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
        httpRequest.ClientCertificates.Add(certificate); 
        httpRequest.Headers.Add("x-ms-version", "2011-10-01"); 
        httpRequest.KeepAlive = false; 
        HttpWebResponse httpResponse = httpRequest.GetResponse() as HttpWebResponse;

        // Get response stream from Management API. 
        Stream stream = httpResponse.GetResponseStream(); 
        string result = string.Empty; 
        using (StreamReader reader = new StreamReader(stream)) 
        { 
            result = reader.ReadToEnd();
        } 
        if (result == null || result.Trim() == string.Empty) 
        {
            return;
        }
        XDocument document = XDocument.Parse(result); 
        string serverID = string.Empty; 
        var list = from item
                   in document.Descendants(XName.Get("PrivateID",
                       "http://schemas.microsoft.com/windowsazure")) 
                   select item; 

        serverID = list.First().Value; 
        Response.Write("Check Production: "); 
        Response.Write("DeploymentID : " + deploymentId
            + " ServerID :" + serverID); 
        if (deploymentId.Equals(serverID)) 
            lbStatus.Text = "Production"; 
        else 
        { 
            // If the application not in Production slot, try to check Staging slot. 
            string stagingString = string.Format(
                "https://management.core.windows.net/{0}/services/hostedservices/{1}/deploymentslots/{2}",
                subscriptionID, hostedServiceName, "Staging"); 
            Uri stagingUri = new Uri(stagingString); 
            httpRequest = (HttpWebRequest)HttpWebRequest.Create(stagingUri); 
            httpRequest.ClientCertificates.Add(certificate); 
            httpRequest.Headers.Add("x-ms-version", "2011-10-01"); 
            httpRequest.KeepAlive = false; 
            httpResponse = httpRequest.GetResponse() as HttpWebResponse; 
            stream = httpResponse.GetResponseStream(); 
            result = string.Empty; 
            using (StreamReader reader = new StreamReader(stream)) 
            { 
                result = reader.ReadToEnd();
            } 
            if (result == null || result.Trim() == string.Empty) 
            {
                return;
            }
            document = XDocument.Parse(result); 
            serverID = string.Empty; 
            list = from item
                   in document.Descendants(XName.Get("PrivateID",
                       "http://schemas.microsoft.com/windowsazure")) 
                   select item; 

            serverID = list.First().Value; 
            Response.Write(" Check Staging:"); 
            Response.Write(" DeploymentID : " + deploymentId
                + " ServerID :" + serverID); 
            if (deploymentId.Equals(serverID)) 
            {
                lbStatus.Text = "Staging";
            }
            else 
            {
                lbStatus.Text = "Do not find this id";
            }
        } 
        httpResponse.Close(); 
        stream.Close(); 
    } 
}
 50
Author: artfulhacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-29 15:58:44

Staging to tymczasowy slot wdrożeniowy używany głównie do aktualizacji bez przestojów i możliwości cofnięcia aktualizacji.

Zaleca się, aby nie łączyć systemu (w kodzie lub w konfiguracji) z takimi specyfikacjami platformy Azure.

 8
Author: Rinat Abdullin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-02 06:53:47

Od Windows Azure Management Libraries i dzięki @ GuaravMantri odpowiedz na inne pytanie możesz zrobić to tak:

using System;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using Microsoft.Azure;
using Microsoft.WindowsAzure.Management.Compute;
using Microsoft.WindowsAzure.Management.Compute.Models;

namespace Configuration
{
    public class DeploymentSlotTypeHelper
    {
        static string subscriptionId = "<subscription-id>";
        static string managementCertContents = "<Base64 Encoded Management Certificate String from Publish Setting File>";// copy-paste it
        static string cloudServiceName = "<your cloud service name>"; // lowercase
        static string ns = "http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration";

        public DeploymentSlot GetSlotType()
        {
            var managementCertificate = new X509Certificate2(Convert.FromBase64String(managementCertContents));
            var credentials = new CertificateCloudCredentials(subscriptionId, managementCertificate);

            var computeManagementClient = new ComputeManagementClient(credentials);
            var response = computeManagementClient.HostedServices.GetDetailed(cloudServiceName);
            return response.Deployments.FirstOrDefault(d => d.DeploymentSlot == DeploymentSlot.Production) == null ? DeploymentSlot.Staging : DeploymentSlot.Production;
        }
    }
}
 5
Author: Ognyan Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:52

Łatwym sposobem rozwiązania tego problemu jest ustawienie w Twoich instancjach klucza do identyfikacji środowiska, w którym jest uruchomiony.

1) Ustaw na swoim slocie produkcyjnym: Ustaw Ustawienia > > Ustawienia aplikacji > > Ustawienia aplikacji I Utwórz klucz o nazwie SLOT_NAME i wartości "production". Ważne: sprawdź ustawienie gniazda.

2) Ustaw na swoim miejscu postoju: Ustaw Ustawienia > > Ustawienia aplikacji > > Ustawienia aplikacji I Utwórz klucz o nazwie SLOT_NAME i wartości "staging". Ważne: sprawdź ustawienie gniazda.

Uzyskaj dostęp z aplikacji do zmiennej i określ, w którym środowisku aplikacja jest uruchomiona. W Javie można uzyskać dostęp:

String slotName = System.getenv("APPSETTING_SLOT_NAME");
 3
Author: Flavio H. Freitas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-03 14:55:03

Oto 4 punkty do rozważenia

    VIP swap ma sens tylko wtedy, gdy Twoja usługa wychodzi na zewnątrz. AKA, kiedy wystawia API i reaguje na żądania.
  1. Jeśli Twoja usługa pobiera wiadomości z kolejki i przetwarza je, twoje usługi są proaktywne, a VIP swap nie jest dobrym rozwiązaniem dla Ciebie.
  2. Jeśli Twoja usługa jest zarówno reaktywna, jak i proaktywna, możesz ponownie rozważyć swój projekt. Może podzielimy serwis na 2 różne usługi.
  3. sugestia Erica dotycząca modyfikacji plików cscfg przed i po wymianie VIP jest dobra, jeśli aktywna część usługi może zająć krótki czas (ponieważ najpierw skonfigurujesz zarówno Staging, jak i produkcję, aby nie pobierać wiadomości, a następnie wykonaj wymianę VIP, a następnie zaktualizuj konfigurację produkcji, aby rozpocząć pobieranie wiadomości).
 1
Author: Ash Saf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-24 17:11:24