Automatic deploy following build.When the build is complete, we could deploy the latest
version automatically. Perhaps the latest version would point at the integration database
instance. In this scenario, the integration version is “just for show” and serves no purpose
in the delivery pipeline (e.g., quality assurance, or QA). On the other hand, the system test
database might be used for deployment, so that part of the QA pipeline is automated too.
The problem here is that the build action under the CI process can occur at any time,
which might not be ideal if system testing is already taking place. 
Deploy new instance.If the deployment process is separate from the CI process, this is
the first of two possibilities. In this scenario, we deploy a clean build of a specific version
of the system. This is the simpler of the two scenarios.
Integrate existing instance.In this deployment scenario, we deploy against an existing
version of the system. This is no problem in terms of code—we simply replace all code
assets—though in fact we may have to consider the management of noncode assets
(e.g.,uploads from users) during deployment. For the database, that means applying
theincremental migration scripts.
We will build scripts allowing both the deployment of a new system/database instance,
and the integration of an existing instance. 
Using the Correct Database Instance
Once the site is deployed, we need to ensure that the application points to the correct data-
base instance. This configuration issue is actually a subset of the overall configuration issues
for deployment. It can be easily handled when we do not have many configuration settings
tochange, but the process can become unwieldy when many changes are involved. Possible
strategies include the following:
<xmlpoke>.Because configuration files are XML-based, the <xmlpoke>task can be used to
change values, add keys, and so on. On a small scale, this is a very useful task, but making
several changes to files can become unwieldy and a maintenance headache.
Configuration file linking.General configuration settings for a system can be held in
companion config files and referred to from the main config file. For example, web.config
might refer to settings held in dev.config,test.config, and so on. Using a single
<xmlpoke>and a few cleanup tasks could handle a bulk configuration change. The
benefitof this scenario is that the data for change is held outside the actual process.
Configuration service.Similarly, using the Microsoft Configuration Management Block
(or some other configuration service, perhaps Nini, which you can find at http://nini.➥
sourceforge.net/) typically means that the configuration change can be handled in the
same minimal way. The benefit is the same, and in addition all configuration data across
all applications is maintained in one location.
We will use the simplest scenario, the <xmlpoke>task, to handle the configuration changes
we need. In fact, with the use of the other two scenarios, the impact to the delivery scripts is
minimal: there will still need to be some kind of <xmlpoke>to point the configuration file to
the appropriate companion or service.
CHAPTER 8 DATABASE INTEGRATION
253
Convert pdf file to jpg on - Convert PDF to JPEG images in C#.net, ASP.NET MVC, WinForms, WPF project
How to convert PDF to JPEG using C#.NET PDF to JPEG conversion / converter library control SDK
best pdf to jpg converter; convert .pdf to .jpg online
Convert pdf file to jpg on - VB.NET PDF Convert to Jpeg SDK: Convert PDF to JPEG images in vb.net, ASP.NET MVC, WinForms, WPF project
Online Tutorial for PDF to JPEG (JPG) Conversion in VB.NET Image Application
convert pdf file to jpg file; changing pdf file to jpg
Asset Management
As mentioned earlier, the deployment scenario could entail multiple migrations to move the
database version on by several builds. The deployment script should take account of this. This
issue could be handled simply by passing the current and desired build numbers of the data-
base and then looping through the database deployment routines. Or it may be worthwhile to
build a custom task to handle these issues separately. We will see an implementation of this in
our deployment scripts.
Implementing Database Integration
Once again, the wizards at Etomic have produced another work of software art. This time they
have extended the web-based Transformer application so that it can use a database to store the
XML and XSLT snippets. These can then be viewed and used by other users of the application.
Note
In fact,this would be a natural extension of the previous application from Chapters 4,5,and 6 but
for clarity,and purposes of the previous examples,I have created a new application called Etomic.Share
Transformer.The code is in the “usual”place in the VSS database.Additionally,it does not rely on the sepa-
rate engine assembly for the same reason,though I imagine it would if this was a real application.
Figure 8-13 shows the new screen for the application that has generated all the excite-
ment at Etomic. 
Figure 8-13.Etomic.ShareTransformer application
To implement an automated build, and then continuous integration, for this application
we will follow the standard steps from the previous Design to Deliver work. Once this is satis-
factory, we will add in the database integration tasks, at which point we will finally decide
CHAPTER 8 ■ DATABASE INTEGRATION
254
Online Convert Jpeg to PDF file. Best free online export Jpg image
Convert a JPG to PDF. You can drag and drop your JPG file in the box, and then start immediately to sort the files, try out some settings and then create the
convert pdf file to jpg online; convert pdf to 300 dpi jpg
Online Convert PDF to Jpeg images. Best free online PDF JPEG
Online PDF to JPEG Converter. Download Free Trial. Convert a PDF File to JPG. Drag and drop your PDF in the box above and we'll convert the files for you.
convert multi page pdf to single jpg; change from pdf to jpg
which process to use and then add the CI scripts for CCNet. Finally, we will need to carry out
some fairly significant work on our simple deployment scripts to handle the various deploy-
ment scenarios satisfactorily.
The Build Script
In this version of our build scripts, I have amended the Build.Core.Xmlfile to load all noncore
assemblies separately, which we discussed earlier as a possible best practice. It looks like this:
<loadtasks 
assembly="D:\dotNetDelivery\Tools\NAntContrib\0.85rc2\bin\➥
NAnt.Contrib.Tasks.dll"/>
<loadtasks 
assembly="D:\dotNetDelivery\Tools\NUnit2Report\1.2.2\bin\➥
NAnt.NUnit2ReportTasks.dll"/>
<loadtasks 
assembly="D:\dotNetDelivery\Tools\Etomic.NAntExtensions\ ➥
Etomic.NAntExtensions.GeneralTasks.dll"/>
I have loaded the Red Gate task assembly from the debug directory, but of course this
should form part of the Etomic.NAntExtensions project we have already constructed.
The build script for the application (without considering database issues) is quite simple:
<?xml version="1.0" encoding="utf-8" ?> 
<project name="Etomic.ShareTransformer" default="help">
<description>
Build file for the Etomic.ShareTransformer application.
</description>
<property name="project.name.1" value="${solution.name}.UI" />
<property name="project.name.2" value="${solution.name}.Engine" />
<property name="solution.isweb" value="true"/>
<target name="go" depends="build, test, document, publish, notify"/>
<target name="build" description="Compile the application.">
<solution solutionfile="${core.source}\${solution.name}.sln" 
configuration="Debug" outputdir="${core.output}\"/>
</target>
<target name="test" description="Apply the unit tests.">
<property name="nant.onfailure" value="fail.test"/>
<nunit2>
<formatter type="Xml" usefile="true" extension=".xml" 
outputdir="${core.reports}\" />
<test>
<assemblies basedir="${core.output}\">
<include name="*Tests.dll"/>
CHAPTER 8 DATABASE INTEGRATION
255
C# Image Convert: How to Convert Adobe PDF to Jpeg, Png, Bmp, &
C# sample code for PDF to jpg image conversion. This demo code convert PDF file all pages to jpg images. // Define input and output files path.
batch convert pdf to jpg; convert multipage pdf to jpg
C# Image Convert: How to Convert Dicom Image File to Raster Images
RasterEdge.XDoc.Office.Inner.Office03.dll. RasterEdge.XDoc.PDF.dll. This demo code convert dicom file all pages to jpg images.
change pdf to jpg online; convert from pdf to jpg
</assemblies>
</test>
</nunit2>
<nunit2report out="${core.reports}\NUnit.html">
<fileset>
<include name="${core.reports}\*.Tests.dll-results.xml" />
</fileset>
</nunit2report>
<nant buildfile="Build.Common.xml" target="report.fxcop" 
inheritall="true"/>
<style 
style="D:\Tools\FxCop\1.30\Xml\FxCopReport.xsl" 
in="${core.reports}\fxcop.xml" out="${core.reports}\fxcop.html"/>
<property name="nant.onfailure" value="fail"/>
</target>
<target name="document" description="Generate documentation and reports.">
<ndoc>
<assemblies basedir="${core.output}\">
<include name="${project.name.1}.dll" />
<include name="${project.name.2}.dll" />
</assemblies>
<summaries basedir="${core.output}\">
<include name="${project.name.1}.xml" />
<include name="${project.name.2}.xml" />
</summaries>
<documenters>
<documenter name="MSDN">
<property name="OutputDirectory" value="${core.docs}\" />
<property name="HtmlHelpName" value="${solution.name}" />
<property name="HtmlHelpCompilerFilename" value="hhc.exe" />
<property name="IncludeFavorites" value="False" />
<property name="Title" value="${solution.name} (NDoc)" />
<property name="SplitTOCs" value="False" />
<property name="DefaulTOC" value="" />
<property name="ShowVisualBasic" value="False" />
<property name="ShowMissingSummaries" value="True" />
<property name="ShowMissingRemarks" value="False" />
<property name="ShowMissingParams" value="True" />
<property name="ShowMissingReturns" value="True" />
<property name="ShowMissingValues" value="True" />
CHAPTER 8 ■ DATABASE INTEGRATION
256
C# Create PDF from images Library to convert Jpeg, png images to
C# Create PDF from Raster Images, .NET Graphics and REImage File with XDoc Batch convert PDF documents from multiple image formats, including Jpg, Png, Bmp
convert pdf document to jpg; change pdf file to jpg online
VB.NET PDF Convert to Images SDK: Convert PDF to png, gif images
Convert PDF documents to multiple image formats, including Jpg, Png, Bmp, Gif, Tiff, Bitmap, .NET Graphics, and REImage. Turn multipage PDF file into image
change format from pdf to jpg; convert .pdf to .jpg
<property name="DocumentInternals" value="True" />
<property name="DocumentProtected" value="True" />
<property name="DocumentPrivates" value="False" />
<property name="DocumentEmptyNamespaces" value="False" />
<property name="IncludeAssemblyVersion" value="True" />
<property name="CopyrightText" 
value="${company.name} Ltd., 2005" />
<property name="CopyrightHref" value="" />
</documenter>
</documenters>
</ndoc>
</target>
<target name="publish" 
description="Place the compiled assets, reports etc. in agreed location.">
<nant buildfile="Build.Common.xml" target="publish" inheritall="true"/>
</target>
<target name="notify" 
description="Tell everyone of the success or failure.">
<echo message="Notifying you of the build process success."/>
</target>
<target name="fail">
<echo message="Notifying you of a failure in the build process."/>
</target>
<target name="fail.test">
<nunit2report out="${core.reports}\NUnit.html">
<fileset>
<include name="${core.reports}\Etomic.*.Tests.dll-results.xml" />
</fileset>
</nunit2report>
</target>
<target name="help">
<echo message="This file should not be executed. Use Build.Core.xml"/>
</target>
</project>
There is nothing that we have not seen before in this script. One of the more interesting
areas is the testtarget. If you look at the source code, the developer has included a config file
that is used by NUnit when the unit-testing task is called. This can be seen in the source code
shown in Figure 8-14 and then in the output directory shown in Figure 8-15.
CHAPTER 8 DATABASE INTEGRATION
257
C# WPF PDF Viewer SDK to convert and export PDF document to other
Convert PDF to image file formats with high quality, support converting PDF to PNG, JPG, BMP and GIF. C#.NET WPF PDF Viewer Tool: Convert and Export PDF.
.pdf to .jpg converter online; convert pdf images to jpg
C# TIFF: C#.NET Code to Convert JPEG Images to TIFF
demo1.jpg", @"C:\demo2.jpg", @"C:\demo3.jpg" }; // Construct List in imagePaths) { Bitmap tmpBmp = new Bitmap(file); if (null Use C# Code to Convert Png to Tiff.
best program to convert pdf to jpg; convert pdf to jpeg
Figure 8-14.App.config in Etomic.ShareTransformer.Tests assembly
Figure 8-15.Etomic.ShareTransformer.Tests.dll.config in the output directory
The developer of this application does not require a specific data load in the database for
the unit tests since they generate the required data for testing in the unit tests themselves and
then remove it. This can be seen in the following code from TransformationTests.cs:
[TearDown]
public void TearDown()
{
DeleteAllTransformations();
}
CHAPTER 8 ■ DATABASE INTEGRATION
258
[Test]
public void TestGetAll()
{
DeleteAllTransformations();
Transformation t = new Transformation();
t.Output = "aaa";
t.Title  = "aaa";
t.Xml = "aaa";
t.Xslt   = "aaa";
t.Save();
t.Save();
t.Save();
ApplicationEngine engine = new ApplicationEngine();
IList transforms = engine.GetAllTransformations();
Assert.IsTrue(transforms.Count == 3);
}
private void DeleteAllTransformations()
{
using(SqlCommand cmd = new SqlCommand("delete transformations", ➥
new SqlConnection(_dbConn)))
{
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
}
Given this, we can choose to leave the unit tests to run against the development database
and then integrate the database following successful unit testing. Or we can integrate the
database prior to the unit testing and then run the unit tests against the integration database
instance. Alternatively, we can run the tests against the development database instance, then
perform the database integration and run the unit tests against the integration database
instance as a “gold-plated” solution. In fact, this is what we will do in our own integration. 
To implement the database integration step, we need to add a new target called database
and then add this to the dependencies in the build file as follows:
<target name="go" description="The main target" 
depends="build, test, database, document, publish, notify"/>
<target name="database" description="Handle database integration">
</target>
CHAPTER 8 DATABASE INTEGRATION
259
That was the easy part. We can now fill it up with the required steps for integration.
Torecap, we will do the following:
Compile and run unit tests across the code of the application to ensure a certain level of
build success.
Produce a CREATE script for the current development database.
Run an integration cycle on the integration database instance and write these migration
files, too.
Point the configuration file for the unit tests to the integration database instance and then
run the unit tests again.
Publish the database assets in the same way as the code assets and then remove the 
“one-off” artifacts, such as the schema script.
We can accomplish this with the following set of scripts in the database target. First up is
the integration step for the CREATE and migration scripts:
<dbAutoIntegrate 
folder="D:\BookCode\Chapter8\${solution.name}.dbscripts\schema" 
server="localhost"
database="${solution.name}-dev"
uid="sa"
pwd="w1bbl3"
write="true"        
caption="${sys.version}"
>
<databases>
<database server="localhost" database="etomic.sharetransformer-integrate" 
uid="sa" pwd="w1bbl3" write="true"/>
</databases>
</dbAutoIntegrate>
The integration scripts are written to a specific working area with folders arranged as
described earlier.
We then flag the CREATE script to be written, and specify the database instance for
migration.
Note
The migration instance must exist to begin with,though it does not need to contain any
information.
CHAPTER 8 ■ DATABASE INTEGRATION
260
Once this work is done, we can point the unit test configuration to the integration test
instance as follows:
<attrib file="${core.output}\${solution.name}.Tests.dll.config" readonly="false" />
<xmlpoke
file="${core.output}\${solution.name}.Tests.dll.config"
xpath="/configuration/appSettings/add[@key = ‘DbConnectionString’]/@value"
value="server=localhost;database=etomic.sharetransformer-integrate; ➥
uid=transformer;pwd=transform3r" />
<attrib file="${core.output}\${solution.name}.Tests.dll.config" readonly="true" />
This code is similar to the versioning code in terms of ensuring the relevant file can be
written to. The <xmlpoke>task accepts an XPath query to change the configuration file.
Note
I have included the data for the poke directly in the build file (along with other information).This
should of course be factored out at the earliest opportunity.If all of your database integration scenarios are
the same,then this task can be moved into the Build.Common.xmlfile since it can be completely para-
meterized.
Finally, we can re-call the testtarget and rerun the unit tests (and the analysis that is a
part of the testtarget) before publishing the assets to the publish folder, thereby making them
accessible for deployment.
Note
The original test files will be overwritten by the new test call.Whether this matters is up to you.
This can easily be handled through the parameterization of the test filenames and a few changes to the
testtarget.
<call target="test"/>
<zip zipfile="${core.publish}\${solution.name}-DB-${sys.version}.zip">
<fileset basedir="D:\BookCode\Chapter8\${solution.name}.dbscripts\">
<include name="**"/>
</fileset>
</zip>
<delete includeemptydirs="false">
<fileset basedir="D:\BookCode\Chapter8\${solution.name}.dbscripts\schema\">
<include name="*" />
</fileset>
</delete>
CHAPTER 8 DATABASE INTEGRATION
261
The delete step in this example only includes the generated files in the schemafolder since
I am not using any others. In fact, you would probably want to include the removal of scripts
in the migratefolder too, because it is likely that these scripts refer to a specific database
migration. The scripts in testandreferenceare more likely to be generally applicable, or con-
stantly maintained across versions. For this build, so that we can test it in deployment, I have
included a script in referencecalledtransformations.xml. This file consists of three entries to
be inserted into a new database instance and will be included in the published package.
That is that. Running the build script produces the following significant output for the
databasetarget:
database:
[dbAutoIntegrate] Handling CREATE Script
[dbAutoIntegrate] Writing script CREATE-0.0.0.0.sql
[dbAutoIntegrate] Handling migration for etomic.sharetransformer-integrate
[dbAutoIntegrate] 
Writing script ALTER-etomic.sharetransformer-integrate-0.0.0.0.sql
[attrib] Setting file attributes for 1 files to Normal.
[xmlpoke] Found '1' nodes matching XPath expression 
'/configuration/appSettings/add[@key = 'DbConnectionString']/@value'.
[attrib] Setting file attributes for 1 files to ReadOnly.
test:
<testing output snipped>
[zip] Zipping 3 files to
'D:\BookCode\BuildAreaCI\Publish\Etomic.ShareTransformer\ ➥
Etomic.ShareTransformer-DB-0.0.0.0.zip'.
[delete] Deleting 2 files
You can use the SQL Bundle tools to confirm that the development and integration
instances are identical if you like.
With the background work completed and the build scenario determined, the actual
implementation in the build task was not so onerous. Of course, your own scenario may be
different. 
The next step is to deploy the assets generated. To test out the agreed steps, we should
place the system under CI and run a few iterations so that we have some assets to work with.
Theccnet.configfile for this is included with the source code, and contains nothing of any
consequence to the database integration—it is the same ccnet.configscript we always use.
If you like, you could make some changes to the database before each iteration, just for
fun. Running a few iterations will result in the some assets being available in the publish loca-
tion for Etomic.ShareTransformer, as shown in Figure 8-16.
CHAPTER 8 ■ DATABASE INTEGRATION
262
Documents you may be interested
Documents you may be interested