web-dev-qa-db-ja.com

コードの変更でライブWebサイトをどのように更新しますか?

これは非常に基本的な質問です。誰かが私をユーモアを与え、彼らがこれをどのように処理するかを教えてくれれば、私は素晴らしいと思います。

SynchToyをインストールして以下の問題を解決しようとしているため、これを投稿することにしました。 "Toy"を使用するのは少し専門的ではないと感じますが、より良い方法を考えることができません。

私がこの状況にいるとき、私は多くの場合、物事を行うための痛々しいほど明白な方法を見逃しています。これは、会社の唯一の開発者であることから来ています。

  • 職場のコンピューターで開発されたASP.NET Webアプリケーション
  • ソリューションには2つのプロジェクトがあります:
    • ウェブサイト(ファイル)
    • WebsiteLib(C#/ dll)
  • Gitリポジトリの使用
  • GoGrid 2008R2 Webサーバーにデプロイ

展開:

  1. コードを変更します。
  2. Gitにプッシュします。
  3. サーバーへのリモートデスクトップ。
  4. Gitからプルします。
  5. Windowsエクスプローラーでドラッグ/ドロップしてライブファイルを上書きします。

ステップ5で、Webサイトのルートからすべてのファイルを削除します。これは良いことではありません。それがSynchToyをインストールしようとしている理由です...

UPDATE:すべての有用な応答に感謝します。回答としてマークするものを選択できません-Webデプロイメントを使用する間-いくつかの便利な提案があるようです:

  1. Webプロジェクト=単一のサイトにパッケージ化されたサイト全体DLL-私にとっての欠点は、単純な更新をプッシュできない-50の会社での唯一の開発者であるため、これは時々より単純なままです。
  2. SCMからサイトのWebルートに直接プルする-私は最初、SCMの隠しディレクトリが公開されてしまうのではないかと恐れてこれをしていませんでしたが、ここでの回答はそれを乗り越えるのに役立ちました(まだ持っているのは好きではありませんが)確認するのを忘れることについて心配する必要があることは、今後も当てはまります)
  3. Webファームを使用し、体系的にノードに展開する-これは、ダウンタイムなしの理想的なソリューションです。これは、サイトが本質的に私の会社のリアルタイムの収益源であるため、私が実際に気にしていることです。ただし、サーバーのコストは2倍になります。

->最後に、サイトのシングルクリック展開が必要であるという基本原則の強化OR ELSE THERE THE THERE THRESING THE THERESING THE WRONGINGは、おそらく私が得た最も有用なものです答えます。

更新2:私はこれに戻って、今何ヶ月もの間続いている実際のソリューションで更新し、完全に機能していると思った(私のシングルWebサーバーソリューション)。

私が使用するプロセスは次のとおりです。

  1. コードを変更する
  2. Gitにプッシュ
  3. サーバーへのリモートデスクトップ
  4. Gitからプルする
  5. 次のバッチスクリプトを実行します。

    cd C:\ Users\Administrator

    %systemroot%\ system32\inetsrv\appcmd.exe停止サイト "/site.name:Default Web Site"

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

    %systemroot%\ system32\inetsrv\appcmd.exe開始サイト "/site.name:Default Web Site"

これでサイトがダウンしたことがわかるので、robocopyを使用して、変更されたファイルをインテリジェントにコピーしてから、サイトをアップに戻します。通常は2秒未満で実行されます。このサイトのピークトラフィックは1秒あたり約2リクエストであるため、サイト更新ごとに4リクエストの欠落が許容されます。

Gitに慣れてきたら、上記の最初の4つのステップが「手動プロセス」であることも許容できることがわかりました。

AppCmd.exeのドキュメントは here です。 Robocopyのドキュメントは here です。

21
Aaron Anodide

以前の雇用主では、コードの変更を展開するために、 ロードバランサー を設定して、1つのWebサーバーへのサービスを停止しました。最初のWebサーバー上のセッションが期限切れになるまでに20分かかる場合があります。デプロイメントZipファイルを解凍してそのWebサーバーのコードを更新し、最初のWebサーバーの直接IPアドレスにアクセスして問題がないことを確認します。正常に機能していると確信したら、ロードバランサーを設定して、現在更新されているWebサーバーにアクセスし、別のサーバーでセッションが期限切れになるのを待ってから、そのサーバーを更新します(その後、すべてのサーバーが更新されるまで続けます)。彼らが問題なくチェックアウトした後、私たちはロードバランサーがその仕事をするために戻るように設定しました。ピーク時の季節負荷中にロードバランサーに最大10台のWebサーバーが接続されている場合、これは複雑になりました(したがって、ライブのWebサイトをシャットダウンできないため、1つずつ更新するのに数時間かかる可能性があります。サイトへ)。

ASP.NETでは、App_Offline.htmという名前のanyファイルをWebサイトのルートディレクトリにドロップすると、そのWebサイトnがアンロードされ、これにより、 DLLS(および何でも)を更新します。 IISは、「アプリケーションオフライン」というタイトルのページを提供します。ファイルが削除、名前変更、または削除されると、Webアプリケーションが再起動し、IISが提供されますそのWebサイトへのWebページこれは、VS内からWebサイトを公開するときにVisual Studioが行うことです。

3
Tangurena

VS 2010のWeb展開を確認してください。 GoGridがサポートしている場合は、Web配置パッケージが適切なソリューションです。

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

3
Nate

自動ビルドおよびデプロイスクリプトを使用します

これを行う最良の方法は、MsBuildやNantなどの自動ビルドおよびデプロイスクリプトを使用することです。

その理由は、1つのコマンドを入力するだけでWebサイトをロールアウトし、1つのコマンドを入力するだけでロールバックできるためです。そして、十分に徹底している場合、これにはデータベーススキーマの移行が含まれます。 (Migrator.Net)

デプロイにSVNまたはGITを使用しない主な理由の1つは、本番環境とステージング環境で環境が変わる可能性があることです。 NANTスクリプトでは、対象とする環境専用の.configファイルをビルドすることができます。これにより、本番環境で構成設定を入力するのを忘れることがなくなります。

また、プロセス全体を自動化するため、1つのコマンドアフェアになり、任意の数の手動プロセスが1つの単純なプロセスになります。

2
Justin Shield

連続配信の問題を解決しようとしています。最初は手動の手順から始めますが、すぐに問題に気付くでしょう。これらは最も一般的なものです:

  1. コードはPCでは機能しますが、本番環境では機能しません
  2. 新しい変更は古いコードを壊します
  3. 増分変更を行うと、展開がますます困難になり、アタッチする新しいライブラリ、適用するパッチなどが取得されます。

TeamCity (または同様のツール)を見てください。

2
oleksii

通常、私が行うことは、すべてをSVNリポジトリに保持することです。いくつかの変更が終了したら、開発サイトでコミットし、本番環境でチェックアウトします。すべての同期を維持し、高速かつ簡単です。チェックアウトが面倒すぎる場合は、WebDAVを使用してApacheをセットアップできます。

2
Malfist

私の各Webアプリには、3つのブランチを持つgitリポジトリー設定があります。ライブ、ベータ、機能。ライブはもちろんライブサイトです。ベータ版は、バグの修正や、実装直前の機能の最終テストに使用されるサイトです。次に、単純なgit Pushを実行すると言ったように、git pull on liveを使用して情報を取り込みます。機能は「次のバージョン」の機能強化に使用されます。

2
Ominus

まず、Webプロジェクトを使用する必要があります。あなたが尋ねる違いは何ですか?

WebプロジェクトはすべてのC#クラスファイル(コードビハインドを含む)を1つのDLL(セキュリティのために優れており、移動する1つのファイルであるという事実)に)結合します。

次に、アプリケーションを公開する必要があります。その後、リモートデスクトップで、公開フォルダー内のすべてのファイルをドラッグして、上書きするように設定するだけです(新しいファイルで古いファイルが置き換えられます)。

公開すると、アプリケーションに必要なすべてのファイルが1つのフォルダーに配置されます。

1
The Muffin Man

現在の雇用主は puppet を使用して配置しています。 (これが より多くのソフトウェアパッケージ であり、同じ問題に対応しています。)

以前の雇用主は、カスタムジョブコントロールシステムを使用して、ソフトウェアの展開、再起動などを処理していました。それが利用可能であっても、ニーズをはるかに超えていました。

その前にいた雇用主には、Subversionからサーバーにデータをコピーしてローリング再起動を行うカスタムスクリプトがありました。

その前に見たいくつかの場所には、デプロイメントを管理するためのファイルが作成されていました。彼らは通常、ロードバランサーからWebサーバーの半分を切り取り、待機し、その半分を停止し、コードをロールアウトして再起動し、次にロードバランサーを反転させて、もう半分を停止し、再起動してから、ロードバランサーを元に戻すような戦略を使用しました。アップ。

私が作業したすべての場所で、コードのロールアウトは単一のコマンドであったか、単一のコマンドではないことが修正すべき問題として認識されました。

1
btilly

通常、この問題をWebサイトで解決するために使用するのは、ジャンクションと呼ばれる Systems Internals に含まれているツールです。

このツールを使用して、あるディレクトリから別のディレクトリへのリンクを作成できます。サーバー上のアプリルートには3つのフォルダーが含まれています。赤、青、現在。 IISは、常に現在のファイルを確認するように構成されています。

現在のフォルダーが現在指しているフォルダーを示すコマンドjunction currentを発行できます。たとえば、現在Blueを指していたとします。新しい展開のためにRedでファイルをキューに入れ、すべての構成の準備ができていることを確認します。

準備ができたら、コマンドjunction current redを発行して、ポイントさせます。

このソリューションを非常に優れたものにする2つの点があります

1)世界中でいつでも、変更をフォルダにキューに入れることができます。ラッシュはなく、唯一のダウンタイムは、アプリプールがスピンアップしているときです。 (このステップもプリコンパイルする方法があります。)

2)デプロイメントに問題が発生した場合、ロールバックするには、変更を元に戻すのではなく、コマンドを発行するだけです。この場合のコマンドはjunction current blueになります。

うまくいけば、私たちのやり方があなたのための新しい解決策にいくつかの光を当てることができます。

1
Mike

私がやったことと、あなたがこれのための範囲を持っているかどうかはわかりませんが、ここに行きます。開発者はコードをQAブランチにチェックインし、システムエンジニアがQA環境にロードします。QAに合格すると、プロダクションブランチに昇格します。ロードバランサのオッズと偶数でサーバーに接続されているすべてのサイトのうち少なくとも2つがありました。この場合、2つのサーバーの1つがオフラインになります。つまり、サイトがアーカイブされ、新しいサイトが一緒に展開されます。 iisに必要な変更があれば、iisが再起動され、次のサーバーに移動します。私たちの場合、これはすべてC#を使用してスクリプト化されていましたが、以前はvbスクリプトを使用して実行されていました。お役に立てば幸いです。乾杯

0
Alos