4

TeamCity を使用したテスト環境用に、.NET アプリケーション (SVN で管理されたソース) の CI と自動展開を作成していますが、すべて順調に進んでいます。私は、db スクリプトの実行を自動化したい段階にあります。http://www.troyhunt.com/2011/02/automated-database-releases-with.htmlなどのいくつかの記事を検索して読みました(troyhunt のブログは非常に貴重です!)。 RedGate ソフトウェアを使用して変更を管理および展開する方法。新しいツールにスクリプト生成を処理させるのは少し心配なので、調査する価値のある他の受け入れられた方法があるかどうか疑問に思っています.

ソリューション設計の現在の標準には、orm db などの DB 関連ファイルを含むプロジェクトが含まれます。また、以下に示すように、変更スクリプトを含む一連のフォルダーも含まれています。

MySolution
 > MySolution.Data
    > 3.0 Scripts
       * 01 - UpdateUserTable.sql
       * 02 - UpdateRoleTable.sql
    > 3.1 Scripts
       * 01 - CreateJobTable.sql
       * 02 - InsertJobTypes.sql
       * 03 - AndSoOn.sql

チェックイン時にテスト環境に自動デプロイしたいのですが、実際のリリースをデプロイする頻度ははるかに低く、RedGate の比較ツールが時々発生する変更のレベルを処理できるかどうかわからないため、この構造は重要だと思います。そのため、スクリプトのバージョン フォルダーを使用し、リリース時にマイナーをインクリメントして、スクリプトのバージョンをきちんと保持する方がずっと快適です。

この既存の構造があるため、それを維持し、デプロイが成功したときに db スクリプトを適用できる TeamCity ビルド定義を追加する傾向がありました。TeamCity を使用して、期待されるパス内で SVN に新しく追加された .sql ファイルを識別し、それらをサーバー上で実行できると想像しましたが、最初から期待しすぎていたのかもしれません。私は過去にこの種のソリューションを TFS と MSBUILD およびカスタム ビルド ステップで実装しましたが、TeamCity の方法はまったく新しいものです。

このようなことを達成するプロセスはすでにありますか?私にはかなり正常な実装のように思えますが、まだその方法を見つけることができませんでした。それとも、RedGate ソリューションは私たちが目指すべき標準なのでしょうか?

4

3 に答える 3

3

どうすれば目標を達成できるかについて多くの調査と学習を行った後、先に進んで、これを行う独自のコンソール アプリケーションを作成することにしました。ここでは基本的な手順を説明しますが、後で詳しく説明する可能性があります。

DatabaseRevisionUpdater (コンソール アプリ)

  1. SVNSharp を使用して、DatabaseRevisionUpdater は SVN サーバーにフックし、指定された SVN リビジョン範囲から SQL スクリプト ファイルをメモリに読み込みます。
  2. .NET で作成されたトランザクション内で、アプリはスクリプト ファイルを 1 つずつ読み取ります。これらのスクリプトの実行中にエラーが発生した場合、トランザクションはロールバックされ、アプリはエラー コード -1 で終了します。
  3. ターゲット データベースには、更新が行われたときに書き込まれるいくつかの新しいログ テーブルが含まれている必要があります。バージョン テーブルは、どのリビジョンが作成されたか、成功したか失敗したかを追跡します。別のテーブルには、この改訂要求に対して実行された各スクリプトに関する情報が含まれています (ステータスは、成功、失敗、およびスキップされます)。
  4. 今後の更新が行われると、ステップ 3 のテーブルからデータベースのバージョンが決定されます。要求が以前の成功した更新と交差する場合、更新は既に適用されていると見なされるため、先に進みません。SVN Update Revision From もこれらのテーブルから決定できます。

TeamCity の統合

  • ランナー タイプのビルド ステップが追加されました: コマンド ライン
  • Working Directory は、コンソール アプリを含むビルド サーバー上のディレクトリです。
  • 実行: カスタム スクリプト (私の dbConnectionString のように、二重引用符を含む引数に対応していないように見えるため、パラメーターで実行可能ファイルを使用しないでください)
  • カスタム スクリプト: 実行可能ファイルの後に、自分のデータベースを対象とする引数が続きます。引数には、svnUsername、svnPassword、svnPath、databaseConnectionString、そして最も重要な RevisionTo が含まれます。%build.vcs.number.APP_ID% を使用して、現在のビルドのリビジョン番号を取得します。

ボーナスの使用 - 切断されたデータベースの更新

これはすべてテスト環境では正常に機能しますが、ライブ環境は svn またはインターネットにアクセスできない分離されたネットワーク上にあります (セキュリティ上の理由から)。私のコンソール アプリでは、いくつかの異なるモードを使用しています。上記のモードは、オールインワン ソリューションであるダイレクト アップデートです。ログテーブルを見てDBの現在のバージョンを判断し、指定したリビジョンまでのすべての更新についてSVNをポーリングし、ターゲットデータベースに対してそれらを実行し、それに応じてログテーブルを更新します。私たちのライブ環境では、いくつかの追加モードを追加しました。輸出入。

  • エクスポートは、リビジョン範囲内で SVN からスクリプトを取得するために使用されます。次に、それらを XML ファイルに保存します。ターゲットデータベースはまったく気にしません。
  • インポートは、XML データ ファイルをインポートし、その中の更新をターゲット データベースに適用するために使用されます。バージョンの互換性は気にしますが、SVN とは関係ありません。

それが本質的に私の解決策です。すぐに使えるものは何もありませんが、魅力のように機能します。TeamCity を適切に操作し、コンソール出力を使用してプロセスを詳細に記述し、可能な限り透過的にすることができます。TeamCity は、このすべての出力をビルド ログに報告し、リターン コードが 0 かそれ以外かによって、失敗または成功します。

1週間の旅なので、他の誰かが興味を持っている場合に備えて、ここにたどり着いた方法を詳しく説明する小さなブログ投稿を行うことにしました

于 2013-09-11T09:15:08.847 に答える
0

Red Gate では現在、「移行 v2」と呼ばれるものに取り組んでいます。これは、スキーマ比較の方法論と、たとえばデータ移動の状況でユーザーが独自のスクリプトを指定できるようにする両方を使用するデータベース展開テクノロジです。

これについて詳しく説明している一連の Web ページと、GoogleGroup フォーラムがあります。

この機能についてご不明な点がございましたら、お知らせください。

于 2013-09-19T07:52:26.100 に答える