継続的インテグレーションとデプロイの自動化の一環として、Entity Framework 4.3.1のmigrate.exeツールを使用して、TeamCityビルドサーバーからデータベースの移行を実行しています。私たちが遭遇したこれらの問題の1つは、migrate.exeツールが失敗したときにゼロ以外の終了コードを発行しないことです。
C:\<path>\packages\EntityFramework.4.3.1\tools>migrate.exe AppContext /startupdirectory:C:\<path>\bin\Debug /startupconfigurationfile:C:\<path>\Web.config /verbose
<Bunch of successful migrations>
Applying explicit migration: 201202212004585_UpdateTable
VERBOSE: ALTER TABLE [TableA] DROP CONSTRAINT [FK_TableA_TableB]
System.Data.Entity.Migrations.Design.ToolingException: 'FK_TableA_TableB' is not a constraint.
Could not drop constraint. See previous errors.
at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMig
ration, Boolean force)
at System.Data.Entity.Migrations.Console.Program.Run()
at System.Data.Entity.Migrations.Console.Program.Main(String[] args)
ERROR: 'FK_TableA_TableB' is not a constraint.
Could not drop constraint. See previous errors.
C:\<path>\packages\EntityFramework.4.3.1\tools>echo %errorlevel%
0
これにより、移行が失敗し、失敗するはずの場合に、TeamCityはビルドを「成功」として渡します。
一時的な回避策は、「ERROR:」のビルドログをgrepし、これが発生したときにビルドを失敗させることですが、この解決策は大雑把であり、EFが失敗したか、同様のログエントリを持つ他のプロセスかを判断できません。
より良い回避策のための提案はありますか?merge.exeを動作させる方法、または失敗がmigrate.exeに固有のものであることをTeamCityに認識させる方法のいずれか。