As you are probably aware, the Ensemble Management Portal does enforce source control hooks when editing other Ensemble configuration items, but that does not extend to the Production class currently.  There is a (rather long-standing) Prodlog asking that this be corrected and that the Production class be protected via the Source Control hooks that are active for a given namespace.  The number is 94592 and I suggest that you contact the WRC and ask them to officially log your need for this feature against that Prodlog (other customers are encouraged to do the same if it is something that you need as well).

Until this is available, the best process that I have found for managing Ensemble productions via Source Control is:

  1. Open the class in Studio and check it out
  2. Make your changes via the Ensemble Management Portal
  3. Return to studio and do a "Forced Compile" (which should trigger an exportof  the file)
  4. Check in your change.

This is certainly open to user error, but until the product supports source control hooks in the portal, it is the best hack that I have found for making sure the source of your Production is protected.  You could also create a watchdog task which periodically checks the save timestamp of the Production and compares it to the timestamp on disk to see if perhaps the production has been changed while your export has not - I have not tried this but theoretically it would be a way to provide a level of protection against people forgetting to check in changes. 

To answer your question about environment specific production settings, I would point you to the System Default feature of Ensemble which was designed specifically to meet this need:

Using System Defaults your environment-specific details are no longer stored in your class so you can move the class without having to worry about overriding an IP address, etc.

Hope That Helps!



That is a great question!  Today, you can separate your personal from professional subscriptions by logging out and then clicking the "Become a Member" link in the upper right-hand corner to create a new personal account (perhaps linked to your Gravatar to be used in the future ;) ).  This way you can control your content apart from whomever your current employer is.

Longer term, I would like to see the ability of making an account a collection of different personas (hats if you want) which would represent different roles within different organizations.  Internally we're looking at a project this year which may be able to move us in that direction (for all of our InterSystems-login controlled applications - DC included).  But I can't make any promises at this time in terms of timing or functionality.  But we definitely see the value in the points that you raised!


Ben Spead

Manager, AppServices, InterSystems


I can pull back the curtain and explain the variety of ways that we handle this for Caché and Ensemble-based applications within InterSystems.  We have about 35 in-house applications based on our own technologies.  Some of them are visible to customers while a majority are internal only (as an aside, you can see which of them are available to you by going to and looking at the Application Catalog which is available to you after you log in with your InterSystems credentials).  

The in-house applications are owned by a variety of teams and see a wide range of development activity - from only occationally being touched to having up to 5 or 6 developers working on the same code-base concurrently.  My team (Application Services) is responsible for providing tools, best practices and standard approaches which teams across the company can choose to adopt as opposed to reinventing the wheel.   As such, teams decide what is best for them and we have a variety of models currently in use.  

In general, we work with three environments for each application - production (LIVE), TEST and development (BASE).  Over the past few years we have moved to a model of deploying all of our LIVE servers on VMs which then enables us to clone LIVE and make TEST and BASE identical in terms of configuration, OS, etc.  This has saved a lot of time which was previously lost to surprises introduced by environments being out of sync.

With a BASE VM in place for most apps, our default work-flow is to make this a 'Shared BASE' which developers can use for their development work.  The advantages are that individual developers don't have to build out configuration and data which may impact the code they are writing (we periodically refresh BASE and TEST with the data from LIVE after appropriate scrubbing), and if a developer works with a half dozen applications they can jump in and out easily and quickly  when they need to address items across a number of applications.  Also, this makes it easier to handle things like integration (which Bill refers to above) as well as provide essentially zero ramp-up time for someone asked to jump in and help on an app for a short period.  Lastly, having a Shared BASe makes it easy for someone on call to debug code on an application which they may not normally touch.  In this model, our Studio Source Control hooks enforce only 1 developer checking out a file at a time from the Shared BASE.  

However, while this works for a majority of our applications due to the small number of developers concurrently working on the same application at the same time, we do see collissions on our most active applications with this model (because of only allowing a single developer to have a file checked out or due to different in-process changes breaking the system for others developing on it) and so we have moved other means of working in that case.  The most common is a 'hybrid' model where people can work on the Shared BASE for quick fixes, etc, but longer projects or changes which hit the most frequently edited items take place in a "Private BASE" where the developer does their work and after validation they check in their source into the BASE branch and then loads it into the Shared BASE to final development testing (this is prior to independent testing which will take place in TEST or LIVE).  In some cases the Private BASEs are per-developer namespaces on the "Shared BASE" server so that they can take advantage of common configuration and data (each developer has their own code DB but they point to the shared data DB).  In other cases developers build their own Private BASE locally and do nothing on the Shared BASE server until their code is pushed there for final BASE testing.  In the hybrid model, one developer can have a file checked out on the Shared BASE while someone else is working on the same file in their Private BASE and whoever does the check-in second will need to merge their code with the first check-in.  

Finally, we have one application which decided to have no Shared BASE at all, and instead they have a VM Template of a BASE environment for that application and each developer will spin off their own BASE VM.  This can make integration testing harder and there is no common place to test (and set-up time is much greater) so I am not in favor of this and don't generally recommend it internally to teams trying to figure out their own collaboration.  

I tend to recommend a Shared BASE as a starting point, and if a team finds that they are having confilcts due to the number of developers or level of activity I recommend that the most active developers spin off a Private BASE but leave the Shared BASE for small bug fixes, integration testing, data-driven testing or crisis debugging.   This recommendation aligns well with the home grown change control and deployment tools that we use internally and may not work well for other shops with other tools (our tools were tailored to make this model work well in order to try to maximize productivity for our internal application development activities).  

Feel free to hit me with any questions or comments on this approach :)

Ben Spead

Manager, AppServices, InterSystems