We currently we use Jenkins and FinalBuilder but we are now evaluating Continua CI. We only use Jenkins to confirm successful builds (make sure everything is checked in), but now we want to automate our production builds (including packaging and deployment) as well.
I have reviewed the documentation and played with the trial but have a couple of questions:
1) For a production release, how can I make sure everything is built using the latest code in the relevant branches? With FinalBuilder, I can just run a project file that has an include action for all relevant projects. It will explicitly build them in the order that ensures dependencies are correctly handled. With Continua CI it seems you can chain projects together with triggers. However that seems a bit more error prone to set up. Rather than specifying which libraries an application uses, you would need to specify which applications each library is used in. Also if libraries depend on other libraries, could that make some projects be built more than once?
2) If a project depends on another project, it will need assemblies/DCUs/libraries from that project. In the forum it mentions that the way to do this is to save these intermediary files onto a share where other projects can access them. I assume this is with a copy action that copies the relevant files from the Agent Work space to/from the share and environmental variables would be used by separate projects to know where to find them on the share. Do you have any examples of this? Also, if builds can occur in parallel, how do you ensure that a subsequent build does not overwrite these files before a dependent project is finished with them.
Any help with these questions would be appreciated.
Are you looking to replace FinalBuilder with Continua CI? If so, that’s not a great idea, because Continua CI does not have the same functionality. A better option would be to use the two together.
Continua CI does not currently do dependencies very well, it’s something we have planned for a future version (along with a bunch of other stuff!). Chaining builds with triggers does work, but it’s difficult to maintain anything complex.
With binary dependencies things are somewhat tricky. Since you mention DCU’s, I’ll assume you are using Delphi, which unfortunately after 20+ years still doesn’t have a proper package manager (getit is a toy, and unusable in a build process, delphinus doesn’t work offline). With .net, it’s trivial to build libraries into nuget packages and deploy them to a package feed (which can just be a network share) and have msbuild/vs pick them up during the build. I have a half written package manage that I hope to finish one day, because I have the same needs.
As for parallel builds, Continua CI can do those (depending on licenses, as the product is licensed per concurrent build). Each build is performed in it’s own build workspace, however when copying artifacts to a shared folder, care would need to be taken. That can be done by :
a) Use unique version specific folders for the shared binaries (ie create a new subfolder for each new version) - this would be my preference.
or
b) Use the Shared Resource feature to take Read or Write locks on the Resource to control writing to the folder. If you go with this option, note that the locks are held for the duration of the Stage, so this would effectively serialise the builds.
If you currently have a build process in FinalBuilder that will build your dependancies, it’s still possible to use that from within Continua CI, however it’s a case of making it runnable from any folder (replacing hard coded paths with based relative paths). Also, Continua CI typically manages the source code, checking out the source into the workspace folder during the build. This can be controlled by Repository Rules, and you can blank out the rules if you want FinalBuilder to get the source yourself (I don’t recommend this though). The FinalBuilder project file should also be checked into the repository.
There are so many options or ways to slice things, that it’s difficult to be more specific without knowing more about your setup etc. Feel free to contact support and we delve further into your setup privately.
Most of our projects are Visual Studio C#/C++ and that is the focus of our build automation. We have a few Delphi projects which are built with FinalBuilder. As per your suggestion we will continue using FinalBuider to build the Delphi projects.
I will take up your invitation to contact support.