Co możesz zrobić, aby zmniejszyć liczbę błędów związanych z wdrażaniem działającej witryny?

11

Jestem pewien, że wielu z was doświadczyło tego problemu. Witryna lub aplikacja internetowa jest uruchomiona i działa. Chcesz załadować następną wersję, ale nie wszystko zrozumiałeś, na przykład ustawienie wartości false w pliku konfiguracyjnym, wstawienie kolejnego rekordu do bazy danych i wykonanie wielu drobnych rzeczy, które czasami mogą liczyć do 20 lub więcej parametrów.

Po przesłaniu nowej wersji wszystko się psuje. Teraz naprawienie problemu może potrwać do 20 minut, ale ogólny stres, który tolerujesz, a także straty finansowe i wartości firmy dla firmy są czasami nie do zapomnienia.

Jakie są sposoby na ograniczenie tego rodzaju błędów wynikających z początkowej konfiguracji wdrożenia nowej wersji?

PS: Proszę nie wspominać o listach kontrolnych, ponieważ już je mamy. Problem z listami kontrolnymi polega na tym, że zawsze powinny być aktualizowane, ale nie będą.

Saeed Neamati
źródło
6
Nie powinieneś łamać swojej witryny podczas jej aktualizacji. Jeśli jesteś ... to twoja procedura jest zła.
Ramhound,
10
„Problem z listami kontrolnymi polega na tym, że zawsze powinny być aktualizowane, ale nie będą”. W takim przypadku jesteś skazany. Możemy powiedzieć ci dobre rzeczy do zrobienia i - podobnie jak lista kontrolna - nie da się tego zrobić. Jeśli nie możesz aktualizować list kontrolnych, powinieneś rozważyć znalezienie innego rodzaju pracy, gdyby błędy i niechlujstwa były lepiej tolerowane. Być może służba rządowa.
S.Lott,
5
Jeśli nie wszystko zrozumiałeś, nie powinieneś wdrażać.
HLGEM,
Jeśli wdrożenie się nie powiedzie, musisz je wycofać.
Tulains Córdova

Odpowiedzi:

28

Dwie rzeczy:

  • Środowisko przejściowe, podobnie jak środowisko na żywo, w którym testowane są wdrożenia.
  • Duże testy tego środowiska po wdrożeniu. Zautomatyzowane i niezautomatyzowane.

Są inne rzeczy, które można zrobić.

Proponuję przeczytać 5-częściową serię blogów na temat automatycznego wdrażania przez Troy Hunt. Oprzyrządowanie, którego używa, jest specyficzne dla stosu MS, ale koncepcje są uniwersalne.

Oded
źródło
masz na myśli, że wszystkie strony internetowe na całym świecie mają środowisko inscenizacyjne .
Saeed Neamati,
15
Nie wszyscy z nich. Dlatego mają takie problemy z wdrażaniem. Każda strona o znacznych rozmiarach, z którą współpracowałem, ma taką.
Oded
@ Saeed Neamati - Oczywiście nie jest to dokładny powód, dla którego wiele stron internetowych nie działa tak, jak powinny (tj. Strona z zewnętrznymi usługami płatniczymi moich związków kredytowych), gdy zdarza się, że klienci w terenie śmieją się z ciebie. W moim przypadku mam wybór, ale mogę skorzystać ze strony internetowej SKOK.
Ramhound,
6
@saeed: Nie mogę mówić w imieniu świata, ale wszyscy moi cholerni na pewno to robią.
Wyatt Barnett,
1
@ Tak, robią to wszyscy dobrzy.
HLGEM
13

Zastanawiam się, dlaczego nikt nie wspomniał o Kontroli wersji - która jest jednym z najważniejszych sposobów, aby uchronić Cię przed problemami podczas aktualizacji / aktualizacji.

Po pierwsze, wdrożenie powinno być tylko klonem stabilnego oddziału w repozytorium. Wszystko, w tym pliki konfiguracyjne, pliki SQL, skrypty instalacji / aktualizacji MUSI być kontrolowane pod kątem wersji.

Po drugie, musisz mieć „jakiś rodzaj” obszaru przejściowego - może to być wszystko - lokalny serwer, tymczasowy wirtualny serwer w chmurze, który właśnie pojawiłeś się, bardzo prosta konfiguracja wirtualnego hosta lub w pełni rozwinięta aplikacja niestandardowa, która utrzymujesz wraz z główną aplikacją. Różnica między tym „obszarem przejściowym” a „obszarem programistycznym” polega na tym, że poprzednie dokładniej modeluje (lub symuluje) rzeczywiste środowisko wdrażania. Na przykład, możesz rozwijać na PHP 5.3.x z modułem Apache, ale ponieważ twoim hostem jest PHP 5.2.x z FCGI, obszar oceny musi być taki sam.

Następnie najpierw piszesz i testujesz swoje aktualizacje w środowisku programistycznym. Scal te zmiany w repozytorium obszaru pomostowego i ponownie przetestuj. W tym momencie możesz wprowadzić dowolne zmiany w konfiguracji w celu dostosowania do wdrożenia - ponieważ jest ona kontrolowana pod kątem wersji, nic nie zostanie utracone i zawsze możesz przywrócić w razie problemów.

Na koniec scal zmiany obszaru przejściowego w kopii wdrożenia na żywo.

Złożoność obszaru przejściowego powinna odzwierciedlać złożoność i zakres aplikacji. W każdym razie kontrola wersji jest niezbędna.

Oczywiście, jeśli nie korzystasz z Kontroli wersji - to nie dotyczy - ale jest to tak naiwne jak pisanie bazy danych w Logo.

treecoder
źródło
3
+1, ale nie wspomniałem o tym, ponieważ po prostu założyłem, że kontrola wersji została zrozumiana ...
maple_shaft
3
Tak, zdumiewające, ile osób kontroluje kod, na którym im zależy, a nie takie rzeczy jak konfiguracje,
SQl
1
@HLGEM, niestety masz rację, wszystko kontroluję u źródła, mam nawet serwer subversion działający w domu dla dokumentów NON DEVELOPMENT, które mam w domu, takich jak moje CV i przepisy kulinarne. :)
wałek klonowy
2
@maple_shaft, Ohhhh, nigdy nie myślałem o kontroli wersji mojego CV, co za świetny pomysł.
HLGEM,
3
Z pewnością świetny pomysł - pewnego dnia spojrzysz na dziennik i zobaczysz, czego się nauczyłeś i jak z upływem czasu stawałeś się coraz bardziej doświadczony. A jeśli popełnisz raz na miesiąc lub dwa, Twój dziennik po 25 latach będzie bardzo interesujący.
treekoder
6

Zgodnie z sugestią użyj systemu pomostowego . Daje to możliwość przetestowania zmian w środowisku na żywo.

Rodzi to kolejną kwestię: mieć testerów . Testowanie rzeczy, które sam napisałem, nie wykrywa tylu błędów, ile ktoś testuje moją aplikację.

Kolejna rzecz: zautomatyzuj proces wdrażania . Wykonuj migracje bazy danych za pomocą narzędzia Ant migrate, wdrażaj najnowszą wersję automatycznie z svn przez capistrano itp. Podczas wdrażania nie musisz robić więcej niż tylko kliknięcie, a wszystko odbywa się automatycznie. Zwłaszcza w przypadku stron internetowych, które wymagają pewnej konfiguracji, ręczne kroki wymagane do wdrożenia to koszmar, a prawdopodobieństwo, że coś pójdzie nie tak, jest ogromne.

Max
źródło
6

W przypadku czegoś, co absolutnie, pozytywnie nie może się zepsuć, rozważ posiadanie systemu A i B i użyj modułu równoważenia obciążenia, aby skierować wszystkie żądania do A podczas aktualizacji i testu B, a następnie przekierować wszystko do B podczas aktualizacji A.

Aby otrzymać punkty bonusowe, dodaj C i upewnij się, że twoje systemy są geograficznie oddzielone, aby trzęsienie ziemi nie zniszczyło dwóch z nich jednocześnie.

Przy wielu aplikacjach przyznam, że to przesada.

Komplikuje to również wszelkie zarządzanie transakcjami, które należy wykonać, ale problemów nie można przezwyciężyć.

Bill Michell
źródło
1
To poprawna odpowiedź
2
Dziękuję Ci. Najważniejsze są jednak także systemy kontroli wersji, systemy pomostowe i wdrożenia za jednym dotknięciem.
Bill Michell
5

Tak, potrzebujesz środowiska testowego lub testowego, w którym wykonasz wszystkie kroki, ale utrzymanie osobnych plików konfiguracyjnych dla oddzielnych środowisk jest koniecznością.

Environments
|_property_files
    |_ dev
        |_ com.bla.util
        |    |_ example.properties
        |_ com.bla.beans
        |    |_ someconfig.xml
    |_ test
        ....
    |_ production
        ....
|_database_updates
    |_ dev
        |_ insert_new_static_data.sql
        |_ ...

...

Zasadniczo w moich skryptach kompilacji i wdrażania biorę właściwość środowiska, która pobierze specyficzne dla środowiska pliki metadanych, takie jak pliki XML, i zastąpi je w lokalizacji kompilacji przed zapakowaniem. W dalszej części moich skryptów wdrożeniowych szukam wszelkich plików SQL w aktualizacjach bazy danych i wykonuję je również w skonfigurowanej bazie danych dla tego środowiska.

Mógłbym to zrobić za pomocą niestandardowego zadania kompilacji, ale w rzeczywistości używam tylko testów JUnit , aby zrobić to za mnie. Jeśli wystąpią wyjątki SQL, test kończy się niepowodzeniem, a zatem wdrożenie kończy się niepowodzeniem. Ogólnie mówiąc, skrypty SQL mają inteligencję, jeśli niezbędne dane już istnieją w środowisku, pomijają wstawianie lub aktualizację.

Mam również podobny katalog skryptów wsadowych lub powłoki, które muszę uruchomić dla określonego środowiska.

Powiedz wszystkim w swoim pytaniu: zawsze powinny być aktualizowane, ale nie będą.

Te konfiguracje sterują twoimi automatycznymi kompilacjami i wdrożeniami, więc jeśli ich NIE zaktualizujesz, kompilacje się nie powiodą, a Twój menedżer zostanie o tym powiadomiony e-mailem. Tak samo ważne jest, aby zespół utrzymywał konfiguracje kompilacji i wdrażania dla konkretnej wersji, tak jak sprawdzanie kompilowanego kodu. Każde wykroczenie psuje kompilację.

Krótko mówiąc, większe zastosowanie zasad ciągłej integracji (CI) pomoże usunąć ból związany z wydaniami produkcyjnymi.

wałek klonowy
źródło
4

1) Wdróż najpierw na stronie testowej i przetestuj zmiany

2) Posiadaj całą konfigurację w pliku konfiguracyjnym (web config lub podobny). Ta konfiguracja powinna być zatem specyficzna dla aplikacji i nigdy nie zostanie nadpisana. Wszelkie zmiany są następnie kalibrowane zamiast zapominać o zmianie czegoś, co powinno różnić się od testu.

Tom Squires
źródło
I upewnij się, że ktoś sprawdzi kod tej konfiguracji dla każdego innego środowiska.
HLGEM
4

Oprócz powyższych doskonałych sugestii, aby mieć środowisko przedprodukcyjne i korzystać z automatycznych testów:

Zmniejsz złożoność bazy kodu. Ogólnie mniej kodu oznacza mniej błędów i łatwiejszy czas na ich znalezienie. Taka jest filozofia refaktoryzacji, rozdzielenia obaw i tak dalej.

Segmentuj bazę kodu . Jednym z powszechnych podejść jest podzielenie go na:

  • kilka podstawowych części, które zmieniają się powoli i są udostępniane w całej witrynie
  • wiele części liści, które mogą zmieniać się szybciej, ale każda z nich wpływa tylko na mniejszą część witryny

Takie zrozumienie bazy kodu pozwala skoncentrować rozwój i testowanie na podstawowych częściach, ponieważ błędy będą miały najbardziej drastyczny efekt.

Alex Feinman
źródło
3

Dobrze wykonane wydanie dotyczy planowania i komunikacji. Dlatego przed przeprowadzeniem wydania rozważ następujące pytania:

  1. Jak długo potrwa wydanie i czy istnieje jakiekolwiek ryzyko, że użytkownicy będą mogli nadal komunikować się z moim produktem podczas jego wydania? Jeśli istnieje ryzyko dla systemu, rozważ przełączenie go w tryb offline i umieszczenie w jego miejscu komunikatu „System jest w trakcie konserwacji”.

  2. Czy są jacyś klienci, których może być konieczne powiadomienie o wydaniu z wyprzedzeniem? Czy muszę im mówić o możliwym zakłóceniu usługi lub obniżeniu wydajności w trakcie wydawania? Osobiście zawsze mylę się po stronie nadmiernej komunikacji i mówienia wszystkim klientom o nadchodzącym oknie wydania lub konserwacji na blogu publicznym lub w podobnym miejscu.

  3. Jakie są moje plany awaryjne, jeśli wydanie się nie powiedzie? Na przykład, jeśli wydanie pójdzie źle, czy powinniśmy wycofać i przywrócić system do stanu, w którym był minimalizowany, kiedy jesteśmy offline? A jeśli tak, to czy kroki do wycofania wydania są dobrze udokumentowane? Czy powinienem mieć odpowiednie osoby pod telefonem lub pod ręką, aby pomóc w rozwiązywaniu problemów w razie ich wystąpienia. Osobiście uważam, że najlepszym sposobem podejścia do planowania każdego wydania jest założenie, że coś pójdzie nie tak z wydaniem. W ten sposób zmusiłem się do przemyślenia niektórych z tych kwestii z wyprzedzeniem.

Następnie, jeśli chodzi o wykonanie wydania, jednym z najlepszych sposobów zapewnienia płynnego działania jest ćwiczenie, ćwiczenie, praktyka i dokumentowanie wszystkiego, co napotkasz po drodze. Na długo przed wdrożeniem nowego kodu do produkcji najpierw przećwicz wdrażanie kodu w bezpiecznym, właściwie piaskowionym środowisku testowym. Poproś osobę, która będzie odpowiedzialna za wdrożenie w środowisku produkcyjnym, przeprowadź wdrożenie testowe na etapie testowania. Weź to pod uwagę podczas próby ubioru i postępuj tak, jakbyś to robił. Dokumentuj wszystko, co robisz na każdym kroku; udokumentuj każde wykonane polecenie, każdy uruchomiony kod SQL, wszelkie zmodyfikowane pliki i sposób ich modyfikacji, a także na każdym etapie po drodze udokumentuj, czego się spodziewasz, czy procedura zostanie wykonana poprawnie. Jeśli napotkasz jakiś problem, udokumentuj, co zrobiłeś, aby go rozwiązać.

Następnie wdrażanie ćwiczeń jest zakończone, przejrzyj swoje notatki i sprawdź, czy możesz udoskonalić proces w celu wyeliminowania błędów. Następnie zrób to wszystko od nowa . Ćwicz dalej, aż wykonanie wydania stanie się tak rutynowe, jak wykonanie prostej instrukcji, na przykład „zaloguj się do tego komputera, wykonaj to polecenie; następnie zaloguj się do bazy danych i wykonaj to polecenie SQL, a następnie ...”

Powyżej wymieniono czynności, które zespół zarządzający operacjami lub wydaniami może zrobić, aby wydanie przebiegało płynnie. Ale co inżynieria może zrobić, aby zminimalizować ryzyko w wydaniu?

  1. Wydawnictwa powinny być małe. Mówiąc najprościej, im bardziej złożony zestaw zmian kodu zawartych w wydaniu, tym bardziej ryzykowne stanie się wydanie. Wyświadcz przysługę swojemu zespołowi operacyjnemu, planując mieć większą liczbę małych wydań, a nie mniejszą liczbę dużych wydań w tym samym okresie.

  2. Test, test, test. Nie tylko testuj kod w środowisku kontroli jakości, użyj środowiska testowego również do testowania oprogramowania. Często zdarzają się błędy, które mają niewiele lub nie mają nic wspólnego z samym kodem, ale mają główną przyczynę, która leży w konfiguracji samego środowiska (lub pewnej kombinacji tych dwóch). Aby znaleźć te problemy, musisz przetestować kod w środowisku, które ściśle odzwierciedla produkcję, czyli inscenizację.

Na koniec, czasem najważniejsze jest nie to, co robimy, aby zapobiec błędom, ale to, jak postępujemy, gdy się nie udają. Dlatego uważam, że ważne jest budowanie kultury w Twojej firmie wokół przejrzystości operacyjnej. Nie próbuj ukrywać problemów przed klientami, bądź na bieżąco. Aktywnie korzystaj z Twittera, aby informować klientów o problemach, o których Twój zespół operacyjny jest obecnie świadomy i pracuje nad ich rozwiązaniem ( Lighthouse jest w tym niesamowity!). Rozważ opublikowanie strony „statusu” swojej usługi, do której klienci mogą się odwołać, aby sprawdzić, czy coś jest nie tak ( TypePad oferuje świetny przykład tego). Podsumowując, zawsze popełniaj błąd po stronie nadmiernej komunikacji. Twoi klienci Ci za to podziękują.

Byrne Reese
źródło
1

Wiele odpowiedzi tutaj już mówi, jak wdrożyć konkretne rozwiązanie problemu, ale, o ile mogę stwierdzić, prawdziwym problemem nie jest poprawna migracja / aktualizacja strony internetowej. Być może projekt / architektura, która za tym stoi, jest delikatna.

Jeśli to prawda, będziesz musiał dostosować architekturę swojego systemu, tak aby był wystarczająco solidny, aby kontynuować prawidłowe działanie, nawet jeśli ustawienia konfiguracji ulegną zmianie lub nie zostaną odpowiednio ustawione, i taki, że ulegnie degradacji z wdziękiem, jeśli wystąpią. Idealnie, jeśli dodałeś nową funkcjonalność lub zmieniłeś starą funkcjonalność w sposób, który wymaga nowej kolumny bazy danych, twoja strona będzie działać, nawet jeśli brakuje kolumny (być może bez nowej funkcjonalności lub ze zdegradowaną formą starej funkcjonalności) . Twój klient nie powinien tracić pieniędzy - w najgorszym wypadku może nie otrzymywać nowych pieniędzy z wprowadzonych ulepszeń.

Jeśli twój system jest na tyle delikatny, że ustawienia konfiguracji mogą powodować tak poważne problemy, aktualizacje programu nie będą jedynymi źródłami problemów - a wymyślenie, jak bezpiecznie je aktualizować, zwiększy tylko szkody, które wystąpią, gdy nastąpi awaria inne źródło.

Blueberryfields
źródło