This question came up on the development team I’m working with and we couldn’t really get to a consensus:
Should changes to the database be part of the CI script?
Assuming that the application you are working with has a database involved. I think yes because that’s the definition of integration. If you aren’t including a portion of your application then you aren’t really testing your integration. The counter-argument is that the CI server is the place to make sure your basic project setup works — essentially building a virgin checkout of the latest version of your code.
Is there a “best practices” document for CI that would answer this question? Is this something that is debated among those who are passionate about CI?
Martin Fowler’s opinion on it:
A common mistake is not to include everything in the automated build.
The build should include getting the database schema out of the
repository and firing it up in the execution environment.
All code, including DB schema and prepulated table values should both be subject to source control and continous integration. I have seen far to many projects where source control is used – but not on the DB. Instead there is a master database instance where everyone is doing there changes, on the same time. This makes it impossible to do branching and also makes it impossible to recreate an earlier state of the system.
I’m very fond of using Visual Studio 2010 Premium’s functionality for database schema handling. It makes the database schema part of the project structure, having the master schema under source control. An fresh database can be created right out of the project. Upgrade scripts to lift existing databases to the new schema are automatically generated.
Doing change management properly for databases without VS2010 Premium or a similar tool would at best be painful – if possible at all. If you don’t have that tool support I can understand your collegue that wants to keep the DB out of CI. If you have problems arguing for including the DB in CI, then maybe it is an option to first get a descen toolset for DB work? Once you have the right tools it is a natural step to include the DB in CI.