Canlı web sitelerini kod değişiklikleriyle nasıl güncellersiniz?


21

Bunun çok basit bir soru olduğunu biliyorum. Biri beni mizah edip bununla nasıl başa çıkacaklarını söyleseydi, çok iyi olurdum.

Bunu göndermeye karar verdim çünkü aşağıdaki sorunu çözmek için SynchToy'u yüklemek üzereyim ve bir "Oyuncak" kullanarak biraz profesyonelce hissediyorum ama daha iyi bir yol düşünemiyorum.

Çoğu zaman bu durumdayken, işleri yapmanın acı verici bir yolunu özlüyorum - bu, şirketteki tek geliştirici olmaktan kaynaklanıyor.

  • İş yerimde bilgisayarımda geliştirilen ASP.NET web uygulaması
  • Çözümün 2 projesi var:
    • Web sitesi (dosyalar)
    • WebsiteLib (C # / dll)
  • Git deposu kullanma
  • GoGrid 2008R2 web sunucusunda konuşlandırıldı

Dağıtım:

  1. Kod değişikliklerini yapın.
  2. Git’e bas.
  3. Uzak masaüstünden sunucuya.
  4. Git'ten çekin.
  5. Windows explorer ile sürükleyip bırakarak canlı dosyaların üzerine yaz.

5. Adımda tüm dosyaları web sitesinin kökünden sildim .. bu iyi bir şey olamaz. Bu yüzden SynchToy'u yüklemek üzereyim ...

GÜNCELLEME: Tüm faydalı cevaplar için TEŞEKKÜRLER. Cevabını işaretlemek için hangisini seçemiyorum - bir web dağıtımını kullanmak arasında - birkaç yararlı önerim var gibi görünüyor:

  1. Web Projesi = tüm site tek bir DLL içine paketlenmiş - benim için olumsuz basit güncellemeleri zorlayamam - 50 bir şirkette yalnız bir geliştirici olmak, bu zaman zaman daha basit bir şey olmaya devam ediyor.
  2. Doğrudan SCM'den sitenin web köküne çekmek - SCM'nin gizli dizininin açığa çıkmasına neden olabileceği korkusuyla bunu yapmadım, ancak buradaki cevaplar bunu aşmama yardımcı oldu (yine de bir tanesine sahip olmayı sevmeme rağmen) emin olun unutma konusunda endişelenecek daha çok şey zaman içinde hala doğru olduğundan emin olun)
  3. Bir web çiftliği kullanmak ve sistematik olarak düğümlere dağıtmak - bu sıfır arıza süresi için ideal bir çözümdür, bu aslında benim için önemli olan bir şeydir, çünkü site esasen şirketim için gerçek zamanlı bir gelir kaynağıdır - onları ikna etmek için zor zamanlar yaşayabilirim Sunucuların maliyetini iki katına çıkar.

-> Son olarak, site için tek bir tıklama dağıtımının yapılması gereken temel sorumlunun tekrar uygulanması veya YANLIŞ BAZI BİR YANLIŞ YANLIŞ, muhtemelen cevaplardan aldığım en faydalı şey.

GÜNCELLEME 2: Buna geri döndüğümü ve şu anda aylardır süren asıl çözümle güncellediğimi ve mükemmel çalıştığımı düşündüm (tek web sunucusu çözümüm için).

Kullandığım işlem:

  1. Kod değişiklikleri yapın
  2. Git’e bas
  3. Uzak masaüstünden sunucuya
  4. Git'ten çekin
  5. Aşağıdaki toplu komut dosyasını çalıştırın:

    cd C: \ Kullanıcılar \ Yönetici

    % systemroot% \ system32 \ inetsrv \ appcmd.exe "/ site.name:Default Web Sitesi" adlı siteyi durdur

    robokopi Belgeler \ kod \ da \ 1 \ çalışma \ Ağaç \ Borç VermeTreeWebSite1 c: \ inetpub \ wwwroot / E / XF linksconfig Web.config

    % systemroot% \ system32 \ inetsrv \ appcmd.exe "/site.name:Default Web Sitesi" sitesini başlattı

Gördüğünüz gibi bu siteyi yıkıyor, değiştirilen dosyaları akıllıca kopyalamak için robokopi kullanıyor ve ardından siteyi geri getiriyor. Genellikle 2 saniyeden daha kısa sürede çalışır. Bu sitedeki en yüksek trafik saniyede yaklaşık 2 istek olduğundan, site güncellemesi başına 4 istek eksik kabul edilebilir.

Sine Git konusunda daha fazla bilgi sahibi oldum, yukarıdaki ilk dört adımın "manuel bir işlem" olmasının da kabul edilebilir olduğunu gördüm, ancak istediğimde her şeyi tek bir tıklamayla çevirebildiğimden eminim.

AppCmd.exe'nin belgeleri burada . Robocopy için belgeler burada .


6
Sunucu hatası için daha uygun.
Karl Bielefeldt

Uzak bir masaüstü kullanmak yerine, sunucunuza SSHing'i düşünmelisiniz, bu şekilde isterseniz bir dağıtım komut dosyası yazabilirsiniz.
Malfist,

5
Bence bu soru burada kalmak için uygun. Bir web sitesi dağıtmak bana göre bir sysadmin işinden daha fazla bir geliştirici endişesi gibi görünüyor, ancak şirkete göre değişebilir. Yine de, geliştiriciye yönelik tüm cevaplar.
Adam Lear

1
@Malfist - nasıl bir ssh bir windows sunucusuna tam olarak yapar?
Wyatt Barnett

@Wyatt Uzak makinede bir SSH sunucusu çalıştırarak (neredeyse) bir Linux kutusunda olduğu gibi.
Adam Lear

Yanıtlar:


3

VS 2010'un web dağıtımını kontrol etmelisiniz. GoGrid destekliyorsa, web dağıtım paketi iyi bir çözümdür.

http://weblogs.asp.net/scottgu/archive/2010/07/29/vs-2010-web-deployment.aspx


web konuşlandırmasını kullandığınızda, düzeltme seçeneğini kaybedersiniz, hayır? Resmi sürecin dışında bir şey yapmak istemeyen pek çok insan olduğunu biliyorum, ancak acil durumlar için seçeneğe sahip olmaktan hoşlanıyorum ...
Aaron Anodide

Sen iyi nokta. Şirketimde insanların bunu yapmasını istemediğimizi biliyorum, çünkü değişiklikleri takip edemiyoruz. Kişisel siteler için bu seçeneğe sahip olmayı gerçekten çok seviyorum.
Nate

3

Önceki işverenimde kod değişikliklerini uygulamak için yük dengeleyicisini ayarladıkbir web sunucusuna servis vermeyi durdurmak için. İlk web sunucusundaki oturumların süresinin dolması 20 dakika sürebilir. Dağıtım zip dosyasını açarak bu web sunucusundaki kodu günceller, sonra ilk web sunucusunun doğrudan IP adresini vurarak işlerin düzgün çalıştığını kontrol ederiz. İşe yaradığımızda, yük dengeleyiciyi şimdi güncellenen web sunucusuna çarpacak şekilde ayarladık ve oturumların başka bir sunucuda süresinin dolmasını bekledik ve ardından bunu güncelledik (ve hepsi güncellenene kadar). Tamam olduklarını kontrol ettikten sonra, yük dengeleyicisini işini yapmak için geri getirmeye ayarladık. Bu, en yoğun mevsimsel yükler sırasında yük dengeleyicisine bağlı 10'a kadar web sunucumuz olduğu zaman karmaşık hale geldi (böylece onları tek tek güncellemek saatlerce sürebilir, çünkü canlı web sitesini kapatamadık - müşterilerin alabilmesi gerekiyordu. Siteye).

ASP.NET'te, bir web sitesinin kök dizinine herhangi bir dosyayı bırakırsanız App_Offline.htm, bu web sitesi kaldırılır ve bu da DLLS'yi (ve her neyse) güncellemenizi sağlar. IIS "Çevrimdışı Uygulama" başlıklı bir sayfa sunacak. Dosya kaldırıldığında, yeniden adlandırıldığında veya silindiğinde, web uygulaması yeniden başlatılır ve IIS bu web sitesine web sayfalarını sunar. Bu, VS içinden bir web sitesi yayınladığınızda Visual Studio'nun yaptığıdır.


2

Genelde yaptığım, her şeyi bir SVN deposunda tutmamdır. Bazı değişikliklerle işim bittiğinde, geliştirme sitesine bağlı kaldım ve ardından üretimimi kontrol ediyorum. Her şeyi senkronize tutar, hızlı ve kolaydır. Eğer kontrol etmek çok zorsa, Apache'yi WebDAV ile kurabilirsiniz ve bunu sizin için yapacak.


.svn dizini gibi canlı sitenizi sunmak için endişeleniyor musunuz?
Aaron Anodide

Gerçekten de, apache genellikle bu klasörlere erişimi engellemek için kurulur.
Malfist 19

IIS, varsayılan olarak .svn'yi (veya .git veya .hg) reddediyor.
Wyatt Barnett

Kötü niyetli bir kullanıcı dizine erişirse, açık durumdaki tüm koda erişebilir.
oleksii

5
Kötü niyetli bir kullanıcı dosya sisteminize erişirse, endişelenmeniz gereken daha çok şey vardır.
Malfist

2

Web uygulamalarımın her biri için üç dallı git depo kurulumum var. Canlı, Beta, Özellikler. Canlı elbette canlı bir sitedir. Beta, uygulamadan hemen önce hataları düzeltmek veya özelliklerin son testi için kullanılan sitedir. Sonra basit bir git itme dediğim gibi, bilgiyi içeri çekmek için git devam et. Özellikler "sonraki sürüm" geliştirmeleri için kullanılır.


Aynısı hemen hemen tüm kaynak kontrol sistemleriyle çalışır.
deadalnix

2

Sürekli teslimat problemini çözmeye çalışıyorsunuz . Başlangıçta manuel adımlarla başlarsınız, ancak yakında sorunları fark edeceksiniz. Bunlar en yaygın olanları:

  1. Kod bilgisayarınızda çalışır, üretimde çalışmaz
  2. Yeni değişiklik eski kodu bozuyor
  3. Artımlı değişiklikler konuşlandırmayı zorlaştırır ve zorlaştırır, eklenecek yeni kütüphaneler, uygulanacak yamalar vb.

Bir göz atın TeamCity (veya herhangi benzer bir araç).


2

Otomatik bir derleme ve dağıtma komut dosyası kullanın

Bunu yapmanın en iyi yolu, MsBuild veya Nant gibi bir Otomatik Yap ve Dağıt Komut Dosyası kullanmaktır.

Bunun nedeni, bir web sitesini yaymak için 1 komutunu yazmanız ve ardından geri almak için 1 komutunu yazmanızdır. Ve eğer yeterince iyiyseniz bu, veritabanı şema geçişlerinizi de içerecektir. (Migrator.Net)

Dağıtmak için SVN veya GIT kullanmamasının ana nedenlerinden biri, ortamın üretim ve aşamalandırma arasında değişebileceğidir. NANT komut dosyanızda, .config dosyalarınızı özel olarak hedeflediğiniz ortam için oluşturmasını sağlayabilirsiniz. Bu, üretimde bir yapılandırma ayarına girmeyi unutmaktan tasarruf sağlar.

Ayrıca tüm süreci otomatik hale getirir, böylece tek bir komut işlemi olur ve herhangi bir sayıda manuel işlem 1 basit işlem haline gelir.


1

Öncelikle, bir web projesi kullanıyor olmalısınız. İstediğiniz farklar nelerdir?

Bir web projesi tüm C # sınıfı dosyalarını (kodlar dahil) tek bir DLL'de birleştirir (güvenlik için daha iyidir ve taşınması gereken bir dosyadır)

İkincisi, uygulamayı yayınlamanız gerekir ve ardından hala uzaktaki masaüstünü açabilir, yayınlama klasörünüzdeki tüm dosyaları sürükleyip üzerine yazacak şekilde ayarlayabilirsiniz (yeni dosyalar eski dosyaların yerini alacak).

Yayınlama, uygulama için gerekli tüm dosyaları bir klasöre koyacaktır.


1

Mevcut işverenim kukla kullanarak konuşlandırıyor . (İşte aynı soruna yönelik daha fazla yazılım paketi .)

Önceki işverenim, yazılım dağıtma, yeniden başlatma vb. İşlemlerini yürütmek için özel bir iş kontrol sistemi kullandı.

Daha önce sahip olduğum işveren, çökertme işleminden sunuculara veri kopyalamak ve yeniden başlatma işlemini başlatmak için özel komut dosyalarına sahipti.

Daha önce gördüğüm birkaç yerde konuşmayı yöneten dosyalar vardı. Genellikle web sunucularının yarısını yük dengeleyicisinden kesmek, beklemek, o yarıyı durdurmak, kodları açmak, yeniden başlatmak, yük dengeleyicisini çevirmek, beklemek, diğer yarısını durdurmak, yeniden başlatmak ve yük dengeleyicisini geri getirmek gibi bir strateji kullandılar. yukarı.

Çalıştığım tüm yerlerde, kodun dağıtılması ya tek bir komuttu ya da tek bir komut olmayışı düzeltilmesi sorun olarak kabul edildi.


1

Genelde bu sorunu web sitelerimizle çözmek için kullandığımız şey, birleşim adı verilen Systems Internals ürününde bulunan bir araçtır .

Bu aracı kullanarak bir dizinden diğerine bağlantılar oluşturabiliyoruz. Sunucudaki uygulama kökü 3 klasör içerir. Kırmızı, Mavi, Güncel. IIS, her zaman Geçerli olan dosyalara bakacak şekilde yapılandırılmıştır.

junction currentHangi klasörün o anda işaret edildiğini size söyleyen bir komut verebilirsiniz . Mesela şu anda Mavi'yi işaret ettiğini söyleyin. Yapacağımız şey, yeni dağıtım için Kırmızı'daki dosyaları sıraya koymak ve tüm yapılandırmanın kullanıma hazır olduğundan emin olmak.

Hazır olduğumuzda, junction current redişaret etmesi için emri verebiliriz.

Bu çözümü harika yapan iki şey var.

1) Klasördeki değişikliklerinizi sıraya koymak için dünyada her zaman vaktiniz var. Hiçbir acele ve sadece aşağı zaman uygulaması havuzunun döndüğü zamandır. (Bu adımı önceden derlemenin bir yolu var.)

2) Dağıtımınızda bir sorun varsa, geri almak için tek yapmanız gereken değişiklikleri geri almak yerine bir komut vermek. Bizim durumumuzdaki emir olacaktır.junction current blue

Umarım bir şeyleri yapma şeklimiz sizin için yeni bir çözüme ışık tutabilir.


0

Yaptıklarımı ve bunun için bir kapsam olup olmadığından emin değilim, ama işte. Bir geliştirici, bir KG şubesine kodunu kontrol eder, daha sonra KG mühendisine bir QA ortamına yüklenir, KG'yi geçtikten sonra, üretim şubesine yükseltilirdi. Bir sunucuya bağlı her siteden en az 2 tanesi bir yük dengeleyici ihtimaline sahipti ve bu durumda eşitsiz kaldı, iki sunucudan biri çevrimdışına alınacak, site durdurulacak ve arşivlenecek ve yeni site ile birlikte dağıtılacak Gerekli olan tüm iis değişiklikleri iis yeniden başlatılır ve ardından bir sonraki sunucuya geçilir. Tüm bunlar bizim durumumuzda C # kullanılarak yazılmıştır ancak geçmişte vb komut dosyası kullanılarak yapılmıştır. Umarım bu yardımcı olur. Şerefe

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.