CI Starter Kit
I have made the template following the project directory structure I described in my ESRI Developer Summit 2010 Continuous Integration Talk and the build scripts to along with it ready for download here. Couple that with VisualStudio shortcuts I described here and that should help any project get started quick. In latter posts, I will detail how you can get the above project & build scripts in the template setup on the TeamCity Continuous Integration server
Automated Build Starter Kit
Keeping with the automated build topic like the last two posts, you can download an “Automated Build Starter Kit” here (click image below)
The goal of this starter kit is to enable to quickly setup an automated build for any of your .NET projects using NAnt. To get started with the kit, all you need to do is unzip the contents of the zip file and rename the folder to something like the name of the project. And that’s it you are done. You can build the sample project in the zip file by opening up the command prompt at that directory location and execute the command “go build”. The zip file also contains a sample web application and a sample web site in it. To publish the sample web application to the IIS on the current machine execute “go publishWebApp” and to publish the sample website to the IIS on the current machine execute “go publishWebSite”. To publish both the sample web application and web site, execute “go publish”. The build script automatically registers the published locations as virtual directories with IIS also. Please the ReadMe.txt file in the zip contents for more information.
Launching your automated build scripts from within Visual Studio
In my last post, I had talked about the benefits of using a common directory structure for all your projects. Well here is another good one. I used to be opening up my command prompt and changing directories to the root directory of the project to launch my build scripts every time I needed to build. Opening up the command prompt to launch the build can get old on you pretty soon. But I was able to add a couple of buttons to my Visual Studio toolbar to launch my automated build and deploy scripts eliminating the need for the command prompt. Adding commands to the Visual Studio toolbar is pretty easy and can be done as shown below. Go to the “Tools -> External Tools” item on the Visual Studio menu bar.
The batch file I use to launch my automated build is always called “Go.bat” and resides at the root of the project directory and its contents look like this
@tools\nant\NAnt.exe -buildfile:MyProject.build %*
So, I just need to launch the “Go.bat” file with the project root as the working directory with the right NAnt targets as arguments. Since, my “Go.bat” file and my Visual Studio solution file reside in the same directory (project root). I can setup my external commands as below.
Make sure to check the “Use Output Window” option so that you can watch the output from your build script in your Visual Studio output window. Cool huh…
I can setup two external tools that invoke the “Go.bat” file with the working directory set to the path where the Visual Studio solution file ($(SolutionDir)/) resides. Note that I am passing in “build” and “publish” as the arguments to the “Go.bat” file when I launch it to either run the “build” NAnt target or run the “publish” NAnt target. Once the two entries have been setup here, they will appear in the “Tools” menu options in Visual Studio.
The last thing that is left to do is the trickiest part and I am not sure why Microsoft has left it this way. Go to “Tools -> Customize” and the dialog below should pop-up. Select “Tools” in the “Categories” list on the left. And this should list the externals commands you just added on the right. But the strange part is that the externals tools you setup will not be listed with the name you set them up with but with just general names like “External Command 2” & “External Command 3” etc. The correct names will not show up until you drag the tools from the dialog and drop them into one of your Visual Studio toolbars. Weird… but it works. I had a new toolbar setup for these two buttons and dropped them on to there.
So, I am happily building and deploying my projects with a single click from within Visual Studio.
Project Directory Structure
The directory structure that is used for projects could either make your life a whole lot easier or make it a pain when you are setting up your automated builds. Apart from being a crucial part of my automated build workflow, it also helps me makes sure that I can check out the project on a new machine and have the project be build-able right away both with the build script and in Visual Studio. Here is the project directory structure that I have been using for a while now. I have been very satisfied with it. Since I use the same project structure for all my projects, I can use a template build script that I can use right away by changing a couple of values in it.
What directory structure do you use for your projects? Thoughts? Suggestions?
Automating Start/Stop AGS and AGS services
I was working on setting up our automated build process for one of the projects I am working on and needed a way to start/stop the ArcGIS server running on a remote machine and also start/stop specific ArcGIS services running on remote machines. I was looking to see if ArcGIS Server provided any command line tools to perform these tasks so that I can just call these commands from my build file. But there is no out-of-the-box command line tools that come with ArcGIS Server which I could use for that purpose. So, I had to improvise and use some utilities and cook up a little bit of code.
To start/stop ArcGIS Services running on a remote machine, I was able to use the “PsService” from the Sysnternals Process utilities. Here is the crux of what PsService does.
PsService displays the status, configuration, and dependencies of a service, and allows you to start, stop, pause, resume and restart them. Unlike the SC utility, PsService enables you to logon to a remote system using a different account, for cases when the account from which you run it doesn’t have required permissions on the remote system
Usage: psservice [\\computer [-u username] [-p password]] <command> <options>
So, we can use the “stop” command and provide the service name for ArcGIS Server process “ArcServerObjectManager” as the option. Here is an example showing how it can be used.
psservice \\MachineName -u username -p password stop ArcServerObjectManager
Since, I had to call it from my NAnt build file, here is a sample of how it can be done
Setting up NAnt build file properties
<property name =“AGSMachineName” value=“myMachine”/>
<property name =“AGSAdminUser” value=“myUserName”/>
<property name =“AGSAdminPassword” value=“myPassword”/>
<!–comma seperated list of MapServices that needs to started/stopped–>
<property name =“AGSMapServices” value=“BaseMap, Boundaries, DynamicMap”/>
Targets to Start and Stop ArcGIS Server
<target name =“StopAGS”>
<exec program=“psservice” basedir=“.\tools\pstools\” append=“true”>
<arg line=“\\${AGSMachineName} -u ${AGSAdminUser} -p ${AGSAdminPassword} stop ArcServerObjectManager”/>
</exec>
</target>
<target name =“StartAGS”>
<exec program=“psservice” basedir=“.\tools\pstools\” append=“true”>
<arg line=“\\${AGSMachineName} -u ${AGSAdminUser} -p ${AGSAdminPassword} start ArcServerObjectManager”/>
</exec>
</target>
Now that’s good. The first hurdle has been crossed. But I still needed to start and stop specific MapServices that I desired. I couldn’t shortcut my way through this one and had to write some code to do this. The code to do it was pretty simple and didn’t turn out to be a pain.
The tool to start/stop ArcGIS services can be downloaded here
The source code for this tool can be downloaded here
The syntax to use the tool from the command line is
Usage: arcgisservice [serverName] [serviceName] [serviceType] [start | stop | restart] <username> <password>
The “username” & “password” for a user belonging to the “agsadmin” group can be specified here. If they are not specified, your current windows credentials will be used. And here is how it can be used in the NAnt build file.
Targets to Start and Stop ArcGIS MapServices specified as a comma seperated list
<target name=“StopMaps”>
<foreach item=“String” in=“${AGSMapServices}” delim=“,” property=“mapService”>
<exec program=“agsUtil” basedir=“.\tools\AGSTools\” append=“true”>
<arg line=” ${AGSMachineName} ${mapService} MapServer stop ${AGSAdminUser} ${AGSAdminPassword}”/>
</exec>
</foreach>
</target>
<target name=“StartMaps”>
<foreach item=“String” in=“${AGSMapServices}” delim=“,” property=“mapService”>
<exec program=“agsUtil” basedir=“.\tools\AGSTools\” append=“true”>
<arg line=“${AGSMachineName} ${mapService} MapServer start ${AGSAdminUser} ${AGSAdminPassword}”/>
</exec>
</foreach>
</target>
The target above will loop through and stop/start all the MapServices specified as a comma separated list in the “AGSMapServices” NAnt property.
And if you want to do the above and much more through another GUI didn’t want ArcCatalog installed all over the place, then the SOEXplorer would be the way to go.
Guidelines for writing a good UserStory
We have been using Scrum to manage our projects for almost the past five months now. It has been working great for us so far and has helped boost team work and increased the morale of the entire development team. I think it has enabled the team to keep their eyes on the ball and keep making progress by avoiding unnecessary distractions. One thing I have been struggling with in the Sprint planning meeting are with writing the UserStories. I am finding it tricky to come up with good clearly defined UserStories from the discussions we have been having. The INVEST acronym from the “User Stories Applied” book by Mike Cohn I think should serve as a good guideline for defining UserStories. The following is from Doug Seven‘s take on INVEST.
INVEST stands for Independent, Negotiable, Valuable, Estimatable, Small and Testable.
- Independent
The story should not carry with it dependencies, which can lead to estimating problems. Instead the story should be completely independent so that it can be worked on without pulling in a set of other stories. - Negotiable
Stories should have room to negotiate – they are a starting point, not a contract. - Valuable
The story should communicate the value to a user or customer, not to the developer. The story should define not only what a user can do, but what value the user gets from the implemented story. If there is no value, cut the story. - Estimateable
You need to be able to estimate the amount of work required to implement the story. If it is too big and too daunting (an epic), break it up into smaller stories. - Small
Similar to the previous, stories need to be small. Large stories are too complex to manage, and are typically more than one story compounded together. - Testable
The implementation of the story needs to be testable. Define the tests that can be performed to validate the story was correctly implemented.
leave a comment