プログラマー、品質エンジニア、グラフィックインターフェイスの大規模なチームがアプリケーションを開発できますが、プロジェクトの最後にモヒカン人が責任を負います。 理論的な知識の欠如は、試行錯誤の結果として得られた経験が実装を体系的に成功させるのに1時間では不十分であるため、ヒーローを緊張させます。 Webプロジェクトを適切に戦いに巻き込む方法を理解するために、基本から始めましょう。
一般スタッフプラン
開発者は、要件、仕様、あらゆる種類の推奨事項および指示を受け取った後、ソースコードリポジトリ内の自分の操作用のスペースを割り当てます。 そのような領域は、個人のSVNブランチ、CVSの新しいモジュール、またはファイルシステム上のフォルダーです。
「開発-テスト-デプロイ」の後続のサイクルについて詳細に話すことは意味がありません。それらについて非常に多くの有用なことが書かれています。 重要な所見のみに注意してください。
- 各アプリケーションは、個人用データベースとファイルストレージを使用する必要があります。 一般的な「ゴミ箱」を使用することは、重大なエラーを生成する悪です。
- 自動テストの開発は常に正当化されるわけではありません。自動テストの実装は作業時間の20%を超えてはなりません。 テストによる開発は非常に無駄です。
- プロセスへの参加者が多いほど 、集合結果をマージしてチェックする必要が頻繁に発生します。 継続的な統合は役立ちますが、それを維持するのは圧倒的です。自動化とコストのバランスを取る必要があります。
学ぶのは難しい
多くのマネージャーが開発環境で受け入れテストを実施していることは注目に値しますが、これは根本的に間違っています。 ナノバッグの個別の候補を作成することは非常に怠けている(そして無駄である)ことは明らかです。 しかし、テストプラットフォームでの実装手順が完了すると、開発者の時間と神経が大幅に節約されます。 さらに、マイナーな修正をグループにグループ化して、製品の1つのバージョンで修正することに煩わされることはありません。受け入れテストの重要なヒント:
- 実装シナリオの候補は、リリース実装シナリオに可能な限り近いものにする必要があります。 最終リリースでデータベース構造を更新し、データを移行し、サードパーティライブラリを追加する場合は、リリースが導入される予定の順序でこれらすべてを正確に行う必要があります。
- テストプラットフォームの条件は、可能な限り戦闘の条件に近くする必要があります。 アプリケーションが5つのmemcachedサーバーのクラスターを使用する場合は、テストプラットフォームで1つ以上のサーバーを準備します。 アプリケーションがRWモードで1つのDBMSマスターサーバーを使用し、ROモードで2つのスレーブサーバーを使用する場合は、完全なレプリケーションスキームを再作成します。 分散システムをテストするための機器を節約すると、 VMWareサーバー (またはVirtuozzoを除く他の類似製品 )を無料で使用できます 。 システムライブラリ、OSカーネルなどのバージョンも、戦闘プラットフォームの対応するコンポーネントのバージョンと一致する必要があります。
- 負荷テストは、変動する受け入れテストの問題です。 リリース条件を完全に再現することは不可能です。負荷が正確にわからないため、推測することしかできません。 はい、そして戦闘プラットフォームの完全なコピーを作成することは利益がありません。 適切なテストのために、通常、アプリケーションでボトルネックが特定され、それらの最大安定値が測定され、結果が予想される負荷に近似されます。
- テストは回帰的でなければなりませんが、品質とコストのバランスを取る必要があります。 インターフェースに表面的な変更のみが行われた場合、テスト計画を完全に実行することは意味がありません。
- アプリケーションのロールバックを忘れないでください 。前のバージョンへの復帰は慎重に行う必要があります。
私はかつて広告に関するポータルの開発を行っていました。 その後、チームはリリースを導入する前に20人までの候補者をロールアウトする必要がありました。 リリースは10回目から導入されました。 最終テストレポートは〜70%成功しました。 私の人生で最も成功したプロジェクトではありません。
武器へ
リリースの実装順序は次のとおりです。- プラットフォームコンポーネントの新しいバージョンを紹介しています 。 古いバージョンにロールバックするツールを保持しながら、ライブラリ、サービスなどを更新します。
- データベースとファイルストレージを紹介します 。 アプリケーションの以前のバージョンがバトルで機能する場合は、新しいストレージ構造をサポートするために古いリリースを事前に準備する必要があります。 物語はこれです:
- 以前のリリースに新しいストレージスキームのサポートを追加する
- 変更された以前のリリースの紹介
- 新しいストレージ構造を導入し、データを移行します(以前のリリースは新しいストレージの古いロジックで動作するはずです)
- 新しいリリースの紹介
- アプリケーションを実装しています 。
- アプリケーションのテスト 。
- ロールバックします (必要な場合)。
- アプリケーションをロールバックします 。
- データベースとファイルストレージをロールバックします (必要な場合)。
- プラットフォームコンポーネントのロールバック (必要な場合)。
戦闘への応用
まず、フォルダー構造がファイルストレージから分離されるように、アプリケーションを設計する必要があります。 そうだね / var / www / myproject / /その他/ / lib / /クラス/ /画像/ /テンプレート/ index.php / var / www / userdata / /画像/ /ビデオ/ | 正しくない / var / www / myproject / /その他/ / lib / /クラス/ /画像/ /テンプレート/ /ユーザーデータ/ /画像/ /ビデオ/ index.php |
第三に、多くの開発者は、ソースコードリポジトリから更新することにより、アプリケーションを戦闘に導入します( svn up )。 このアプローチはrm –rf /としか比較できません。 リリースはリポジトリから完全に抽出され、以前のリリースとは別の場所に配置される必要があります。
リリースは、戦闘プラットフォーム上の別個のフォルダーに配置されます。 user @ stable:〜/ apps / myproject $ ls -la drwxr-xr-x 12ユーザーwww-data 4096 Oct 29 11:38。 drwxr-xr-x 5ユーザーwww-data 4096 May 13 23:22 .. drwxr-xr-x 8ユーザーwww-data 4096 Oct 22 17:11 rel_0.5.1 drwxr-xr-x 8ユーザーwww-data 4096 Oct 27 13:17 rel_0.5.1.1 drwxr-xr-x 8ユーザーwww-data 4096 Oct 28 02:07 rel_0.5.1.2 drwxr-xr-x 8ユーザーwww-data 4096 Oct 29 11:38 rel_0.5.2 user @ stable:〜/ apps / myproject $ svn co svn + ssh://user@svn.myproject.ru/myproject/tags/rel_0.5.2.1 ... user @ stable:〜/ apps / myproject $ ls -la drwxr-xr-x 12ユーザーwww-data 4096 Oct 29 11:38。 drwxr-xr-x 5ユーザーwww-data 4096 May 13 23:22 .. drwxr-xr-x 8ユーザーwww-data 4096 Oct 22 17:11 rel_0.5.1 drwxr-xr-x 8ユーザーwww-data 4096 Oct 27 13:17 rel_0.5.1.1 drwxr-xr-x 8ユーザーwww-data 4096 Oct 28 02:07 rel_0.5.1.2 drwxr-xr-x 8ユーザーwww-data 4096 Oct 29 11:38 rel_0.5.2 drwxr-xr-x 8ユーザーwww-data 4096 Oct 29 12:31 rel_0.5.2.1 |
シンボリックリンクを使用して、プロジェクトをあるリリースから別のリリースに切り替えます。
同様に、以前のバージョンにロールバックできます。 user @ stable:〜/ httpdocs / $ ls –la drwxr-xr-x 3ユーザーwww-data 4096 Oct 29 11:40。 drwxr-xr-x 9ユーザーwww-data 4096 Oct 28 21:25 .. lrwxrwxrwx 1ユーザーwww-data Oct 27 29 11:40 pro-> ../apps/myproject/rel_0.5.2 user @ stable:〜/ httpdocs / $ rm pro && ln –s ../apps/myproject/rel_0.5.2.1 pro user @ stable:〜/ httpdocs / $ ls –la drwxr-xr-x 3ユーザーwww-data 4096 Oct 29 11:40。 drwxr-xr-x 9ユーザーwww-data 4096 Oct 28 21:25 .. lrwxrwxrwx 1ユーザーwww-data Oct 27 30 17:12 pro-> ../apps/myproject/rel_0.5.2.1 |
- すべてのトラフィックをフロントから残りのワーカーにリダイレクトすることにより、バックエンドの一部を無効にします
- 無効なバックエンドでは、ローカル実装とテストを実施します
- トラフィックを新しいバックエンドに切り替えます
- バックエンドの手順を繰り返します
- フロントエンドのブロック実装の結果として、通常の状態に切り替え、すべてのバックエンドに負荷を分散します。
PSストーリーを完成させるのに十分な力があれば、 LiquiBaseの楽しさ 、rsyncの落とし穴、ファイルストレージの移行についての第2部を待ちます。
PPS habrayuzerの1つとの通信中に、それが定式化されました。この情報アピールの主なことは、私の推奨事項を課すことではなく、特定の状況で発生する可能性のある問題について考えさせることです。 * ^に関する一般的な推奨事項と、誰も必要としません。 最終的には、誰もが自分のやり方でそれを行います。 そして、そうです。 すべてのプロジェクトはユニークだからです。