Come si aggiornano i siti Web in tempo reale con modifiche al codice?

20

So che questa è una domanda molto semplice. Se qualcuno potesse darmi umorismo e dirmi come lo manterrebbero, sarei grato.

Ho deciso di postare questo perché sto per installare SynchToy per risolvere il problema qui sotto, e mi sento un po 'poco professionale usando un "Toy" ma non riesco a pensare a un modo migliore.

Molte volte trovo quando sono in questa situazione, mi manca qualche modo dolorosamente ovvio di fare le cose - questo deriva dall'essere l'unico sviluppatore della compagnia.

  • Applicazione Web ASP.NET sviluppata sul mio computer al lavoro
  • La soluzione ha 2 progetti:
    • Sito web (file)
    • WebsiteLib (C # / dll)
  • Utilizzo di un repository Git
  • Distribuito su un server Web GoRail 2008R2

Distribuzione:

  1. Apporta modifiche al codice.
  2. Invia a Git.
  3. Desktop remoto sul server.
  4. Estrazione da Git.
  5. Sovrascrivi i file live trascinandoli / rilasciandoli con Windows Explorer.

Nel passaggio 5 elimino tutti i file dalla radice del sito Web. Questo non può essere una buona cosa da fare. Ecco perché sto per installare SynchToy ...

UPDATE: GRAZIE per tutte le risposte utili. Non riesco a scegliere quale contrassegnare la risposta - tra l'utilizzo di una distribuzione Web - sembra che abbia diversi consigli utili:

  1. Progetto Web = intero sito racchiuso in una singola DLL - lato negativo per io non posso spingere aggiornamenti semplici - essendo uno sviluppatore solitario in un'azienda di 50, questo rimane qualcosa che è più semplice, a volte.
  2. Tirando direttamente da SCM nella web root del sito - originariamente non l'ho fatto per paura che la mia directory nascosta di SCM potesse finire essere esposto, ma le risposte qui mi hanno aiutato a superare questo (anche se non mi piace ancora avere una cosa in più di cui preoccuparsi dimenticando di essere sicuro è ancora vero nel tempo)
  3. Uso di una web farm e distribuzione sistematica ai nodi - questo è la soluzione ideale per zero tempi di inattività, che in realtà è qualcosa che io cura in quanto il sito è essenzialmente una fonte di entrate in tempo reale per la mia compagnia, potrei avere difficoltà a convincerli a raddoppiare il costo dei server però.

- > infine, la re-applicazione del principio di base che ci deve essere una distribuzione con un solo clic per il sito O ALTRO QUALCOSA DI QUALCOSA DI ERRORE è probabilmente la cosa più utile che ho ottenuto dalle risposte.

AGGIORNAMENTO 2: Ho pensato di tornare su questo punto e di aggiornarlo con la soluzione effettiva che è stata implementata per molti mesi e funziona perfettamente (per la mia soluzione per server Web singola).

Il processo che uso è:

  1. Apporta modifiche al codice
  2. Invia a Git
  3. Desktop remoto sul server
  4. Estrazione da Git
  5. Esegui il seguente script batch:

    cd C: \ Users \ Administrator

    % systemroot% \ system32 \ inetsrv \ appcmd.exe fermata sito "/site.name:Default sito web"

    robocopy Documents \ code \ da \ 1 \ work \ Tree \ LendingTreeWebSite1 c: \ inetpub \ wwwroot / E / XF connectionsconfig Web.config

    % systemroot% \ system32 \ inetsrv \ appcmd.exe sito di avvio "/site.name:Default sito Web"

Come puoi vedere, il sito è inattivo, usa robocopy per copiare in modo intelligente i file che sono stati modificati, quindi ripristina il sito. Funziona in genere in meno di 2 secondi. Poiché il traffico di punta su questo sito è di circa 2 richieste al secondo, mancano 4 richieste per aggiornamento del sito.

Sine, sono diventato più abile con Git. Ho trovato che anche i primi quattro passaggi sopra descritti come "processo manuale" sono accettabili, anche se sono sicuro di poter eseguire il tutto con un solo clic se volessi a.

La documentazione di AppCmd.exe è qui . La documentazione di Robocopy è qui .

    
posta Aaron Anodide 02.08.2011 - 20:55
fonte

10 risposte

3

Dovresti controllare la distribuzione Web di VS 2010. Se GoGrid lo supporta, il pacchetto di distribuzione Web è una buona soluzione.

link

    
risposta data 02.08.2011 - 23:00
fonte
3

Al mio precedente datore di lavoro, per implementare le modifiche al codice, abbiamo impostato il bilanciamento del carico per interrompere servizio su un server web. Potrebbero essere necessari 20 minuti per la scadenza delle sessioni sul primo server Web. Dovremmo aggiornare il codice su quel server Web decomprimendo il file zip di implementazione, quindi verificate che le cose funzionino correttamente colpendo l'indirizzo IP diretto per quel primo web server. Quando siamo convinti che funzioni bene, allora imposteremo il bilanciamento del carico in modo che colpisca il server web ora aggiornato e attenda che le sessioni scadano su un altro server e quindi aggiorniamo quella (e così via fino a quando tutte sono state aggiornate). Dopo aver effettuato il check-out ok, avremmo impostato il bilanciamento del carico per tornare a fare il suo lavoro. Ciò si è complicato quando abbiamo avuto fino a 10 server Web connessi al bilanciamento del carico durante i picchi di carico stagionale (quindi aggiornarli uno alla volta potrebbe richiedere ore perché non potevamo chiudere il sito Web live - i clienti dovevano essere in grado di ottenere al sito).

In ASP.NET, se si rilascia qualsiasi file denominato App_Offline.htm nella directory principale di un sito Web, quel websiten scarica ciò che consentirà di aggiornare la DLL (e qualsiasi altra cosa). IIS servirà una pagina denominata "Applicazione offline". Quando il file viene rimosso, rinominato o eliminato, l'applicazione Web verrà riavviata e IIS fornirà pagine Web a tale sito Web. Questo è ciò che fa Visual Studio quando pubblichi un sito web da VS.

    
risposta data 03.08.2011 - 02:18
fonte
2

In genere quello che faccio è che tengo tutto in un repository SVN. Quando ho finito con alcune modifiche, mi impegno sul sito dev, e poi checkout sulla produzione. Mantiene tutto sincronizzato, è veloce e facile. Se il check-out è troppo complicato, puoi configurare Apache con WebDAV e lo farà per te.

    
risposta data 02.08.2011 - 21:03
fonte
2

Per ognuna delle mie app web ho una configurazione di repository git con tre rami. Live, Beta, Funzionalità. Dal vivo è naturalmente il sito dal vivo. Beta è il sito utilizzato per correggere i bug o per il test finale delle funzionalità prima dell'implementazione. Poi, come hai detto, faccio un semplice push git, git pull on live per inserire le informazioni. Le funzionalità sono utilizzate per i miglioramenti della "prossima versione".

    
risposta data 02.08.2011 - 21:13
fonte
2

Stai tentando di risolvere il problema di consegne continuative . Inizialmente avresti iniziato con passaggi manuali, ma presto ti renderai conto dei problemi. Questi sono i più comuni:

  1. Il codice funziona sul tuo PC, non funziona sulla produzione
  2. Nuova modifica interrompe il vecchio codice
  3. Le modifiche incrementali renderanno sempre più difficile l'implementazione, riceverai nuove librerie da allegare, patch da applicare ecc.

Dai un'occhiata a TeamCity (o a qualsiasi strumento simile).

    
risposta data 03.08.2011 - 01:09
fonte
2

Utilizza uno script di generazione e distribuzione automatizzato

Il modo migliore per farlo è usare uno script di Build e Deploy automatico come MsBuild o Nant.

Il motivo è che puoi semplicemente digitare 1 comando per aprire un sito Web e quindi semplicemente digitare 1 comando per eseguire il rollback. E se si è abbastanza accurati, ciò includerà le migrazioni dello schema del database. (Migrator.Net)

Uno dei motivi principali per cui non utilizzare SVN o GIT per la distribuzione è che l'ambiente può cambiare tra produzione e gestione temporanea. Nel tuo script NANT puoi creare i tuoi file .config appositamente per l'ambiente che stai cercando. Ciò evita di dimenticare di inserire un'impostazione di configurazione in produzione.

Inoltre, automatizza l'intero processo in modo che diventi un affare di comando, e qualsiasi numero di processi manuali diventa un processo semplice.

    
risposta data 03.08.2011 - 01:07
fonte
1

Prima di tutto, dovresti usare un progetto web. Quali sono le differenze che chiedi?

Un progetto web combina tutti i file di classe C # (code behinds inclusi) in una singola DLL (migliore per la sicurezza e il fatto che sia un file da spostare)

In secondo luogo, è necessario pubblicare l'applicazione e quindi è ancora possibile desktop remoto, trascinare tutti i file nella cartella di pubblicazione e semplicemente impostarlo per sovrascrivere (i nuovi file sostituiranno i vecchi file).

La pubblicazione metterà tutti i file necessari per l'applicazione in una cartella.

    
risposta data 02.08.2011 - 21:46
fonte
1

Il mio attuale datore di lavoro utilizza il fantoccio . (Qui ci sono altri pacchetti software che risolvono lo stesso problema.)

Il mio precedente datore di lavoro ha utilizzato un sistema di controllo dei lavori personalizzato per gestire la distribuzione del software, il riavvio, ecc. Anche se era disponibile, era un modo eccessivo per le tue esigenze.

Il datore di lavoro che avevo precedentemente aveva script personalizzati per copiare i dati da subversione ai server e fare un riavvio a rotazione.

Diversi posti che ho visto in precedenza avevano creato file per gestire la distribuzione. In genere hanno usato una strategia come tagliare metà dei server web dal bilanciamento del carico, attendere, arrestare quella metà, eseguire il codice, riavviarli, quindi lanciare il bilanciamento del carico, attendere, arrestare l'altra metà, riavviarli, quindi ripristinare il bilanciamento del carico up.

In tutti i luoghi in cui ho lavorato, il roll out del codice era un singolo comando o la mancanza di un singolo comando era riconosciuta come problema da risolvere.

    
risposta data 02.08.2011 - 21:51
fonte
1

In genere ciò che usiamo per risolvere questo problema con i nostri siti Web è uno strumento incluso con Sistemi Internals chiamato junction.

Usando questo strumento siamo in grado di creare collegamenti da una directory all'altra. La root dell'app sul server contiene 3 cartelle. Rosso, Blu, Corrente. IIS è configurato per guardare sempre Current per i suoi file.

Puoi impartire un comando junction current che ti dirà a quale cartella è attualmente puntata. Supponiamo ad esempio che al momento puntasse verso il blu. Quello che faremmo è accodare i file in rosso per la nuova distribuzione e accertarci che tutta la configurazione fosse pronta per andare.

Una volta che siamo pronti possiamo impartire il comando junction current red per farlo puntare.

Ci sono due cose che rendono questa soluzione così bella

1) Hai tutto il tempo del mondo per mettere in coda le tue modifiche nella cartella. Nessuna fretta e l'unico tempo di inattività è quando il pool di applicazioni si avvia. (C'è un modo per pre-compilare anche questo passaggio.)

2) Se qualcosa va storto con la tua implementazione, tutto quello che devi fare per eseguire il rollback è emettere un comando invece di provare a ripristinare le modifiche. Il comando nel nostro caso sarebbe junction current blue

Speriamo che il nostro modo di fare le cose possa gettare luce su una nuova soluzione per te.

    
risposta data 02.08.2011 - 22:00
fonte
0

Quello che ho fatto e non sono sicuro che tu abbia lo scopo per questo, ma qui va. Uno sviluppatore controllerebbe il codice in un ramo QA che sarebbe quindi caricato in un ambiente QA da un ingegnere di sistemi, una volta passato QA sarebbe promosso al ramo di produzione. C'erano almeno 2 di ogni sito collegato a un server su una bilancia di bilanciamento del carico pari e dispari in questo caso, uno dei due server verrebbe portato offline, verrà arrestato il sito verrà archiviato e il nuovo sito verrà distribuito insieme a qualsiasi modifica di iis richiesta verrà quindi riavviata e quindi si passerà al server successivo. Questo è stato tutto copiato usando C # nel nostro caso ma è stato fatto in passato usando lo script vb. Spero che aiuti. Saluti

    
risposta data 02.08.2011 - 21:59
fonte