VSoft Technologies Blogs

rss

VSoft Technologies Blogs - posts about our products and software development.


Version 1.7 of Continua is now released. A big thank you to all those who downloaded the beta and especially those of you who reported issues and bugs.

This version introduces several new features, many of which have been requested by users over the past few months. These features are built upon the various improvements and bug fixes applied in revisions to version 1.6. Please don’t dismay if your requested feature is not included yet, it is still high on our to-do list. Indeed we have several other features specced out, and some partially developed in the background.

Version 1.7 Features

New Builds View dashboard

This view is useful for project administrators and shows a list of active builds across all viewable configurations. This includes running builds, queued builds and builds awaiting promotion.



New panel of indicators

Some important numbers including the total count of queued and running builds, as well as available agents and concurrent build licenses.



New Repositories tab

This is accessed via the Configurations view and shows status of each repository. We've also included “Check  Now” buttons for immediately polling each repository. You can also initiate repository checking from all existing repository pages



Project-wide and configuration versioning options.

We've added some new options in the details section of the project and configuration wizards

  • Project-wide versioning: The build version number can now be incremented across many configurations within a project.

  • Build number re-use: A new option at the project or configuration level to decrement the version counter when a build is discarded while initialising. e.g. due to configuration conditions. Please note that the build number will be decremented only if no other build has started in the mean time and is using a later build number.  



Improvements to Build Completed triggers.

  • Variable expressions: You can now use expressions when defining variables allowing you to pass information from triggering to triggered build.

  • New conditions tab: This allows you to use expressions to control whether a build is triggered



Improvements to Repository triggers.

  • Trigger on specific file change types: Triggers can now be set to start only when the changeset contains certain types of file changes e.g. additions, modifications and deletions.

  • Trigger file pattern: You can now specify a file pattern for repository triggers to restrict triggering only to changesets containing matching files.

  • Trigger comment pattern: You can also limit triggering to changesets with specific text in the comment.



Other build features

  • New force repository check option in queue build dialog allowing control over whether to recheck repository when building. There is also a default setting for each configuration

  • Improvements to Stop Build buttons on dashboard view to ensure that the build stopped is always the latest build at the time when the button was clicked. Stop build dialogs also now display the build number of the build being stopped.

Actions and event handlers

  • New node.js actions
    • Package management with Npm and Bower
    • Grunt and Gulp build runners
    • Unit testing with Mocha

  • New build event handler for posting status updates to a Stash server

  • Log Entry action now allows you to add the message as a build comment. This can be useful for showing additional build details on the build view page.

  • New comments field on all actions – displayed as a tooltip in Stages editor.

  • New ContinuaCI.* system environment variables are now available to all executable actions.

    ContinuaCI.AgentProperty.*
    ContinuaCI.Variable.*
    ContinuaCI.Project.Name
    ContinuaCI.Configuration.Name
    ContinuaCI.Build.Id
    ContinuaCI.Build.BuildNumber
    ContinuaCI.Build.ChangesetCount
    ContinuaCI.Build.ChangesetRevisions
    ContinuaCI.Build.ChangesetTagNames
    ContinuaCI.Build.ChangesetUserNames
    ContinuaCI.Build.Elapsed
    ContinuaCI.Build.HasNewChanges
    ContinuaCI.Build.IsFeatureBranchBuild
    ContinuaCI.Build.IssueCount
    ContinuaCI.Build.LatestChangeset.Created
    ContinuaCI.Build.LatestChangeset.IssueCount
    ContinuaCI.Build.LatestChangeset.RepositoryName
    ContinuaCI.Build.LatestChangeset.Revision
    ContinuaCI.Build.LatestChangeset.TagCount
    ContinuaCI.Build.LatestChangeset.UserName
    ContinuaCI.Build.Started
    ContinuaCI.Build.StartedBy
    ContinuaCI.Build.TimeOnQueue
    ContinuaCI.Build.UsesDefaultBranch
    ContinuaCI.Build.Version


  • Execute Program, DOS Command and PowerShell actions now include an option to generate a context XML file. This file contains details of the build including repositories, changesets and files for you to parse with your own script or program.


Git repositories

  • Case-only renames are now recorded in the repository cache.

  • New option to list author instead of committer as changeset username


Version 1.7 is ready for you to download and install. All feedback is welcome!

FinalBuilder 8 Released!

It's very nearly 5 years since FinalBuilder 7 was released. Since it's release we have shipped many official updates, nearly every update including new features or improvements. This program of continuous improvement has worked well, with customers not having to wait for major new versions to arrive to get support for new versions of Visual Studio or Delphi etc, but it has limited our ability to make major changes. So it's time for a new major version of FinalBuilder.

What's new in FinalBuilder 8

IDE Themes

The IDE has two new themes, Dark and Light (yes, imaginatively named!). The IDE defaults to Dark on first run, however you can change the theme in the options quite easily.

IDE Light theme IDE Light theme

 

Debugger

One of the most asked for features now available in FinalBuilder 8, stepping into included projects. In FinalBuilder 7 and earlier, you could only step over included projects, and wait for them to return. In FinalBuilder 8, you can step into the included project, if it is not already opened the IDE will open the project and switch to it automatically. To make this possible, there are now "Step Into" and "Step Over" functions. The Step into/over now also applies to targets (see below).

Debugger breakpoints now have conditions :

IDE Light theme

Actionlists renamed to Targets

ActionLists have been renamed to Targets. Targets can now also define dependencies, so you can for example define Clean, Build, Test, and have Test depend on Build. If you execute the Test target, and Build has not already been executed, it will be executed first before Test. Targets can be specified on the command line.

IDE Light theme


In FinalBuilder 7 and earlier, projects had a Main and an OnFailure (global error handler) actionlist. In FinalBuilder 8, projects just have a Default Target. Older projects will be imported such that the Main and OnFailure Targets are called from the Default Target inside a try/catch block.

Run Target Action

You can now return values from Targets (ie out parameters) .

IDE Light theme

New Help System

The help has moved online in the form of a wiki. This enables us to do inline help updates without needing to ship new builds. The new help is still being worked on, lots of screenshots are missing etc.. 

Non Visible Changes

Stepping Engine

The stepping engine was rewritten to enable stepping into included projects, and to enable target dependencies. This, work, together with the new variables architecture is where the bulk of effort/time was spent in the FinalBuilder 8 development cycle.

Variables Architecture

The variables architecture and the expression evaluator were rewritten to resolve several corner case issues that we were not able to resolve in FinalBuilder 7. The expression evaulator has a new parser that will allow us to more easily extend the syntax in the future. The User variable namespace was removed, it caused too many problems with projects not running under other users, not running on the build server etc. Use Project variables instead.

Core Messaging

Changes to the messaging has allowed us to improve the performance of the stepping engine and logging, with much less thread switching. This also improved the IDE performance.

CLR Hosting

The minimum CLR version is now .NET 4.0 (ie FinalBuilder requires .net 4.0 to be installed). FinalBuilder 8 also requires Powershell 3.0 or later.

Code Changes

In addition to the architectural changes, we also spent a lot of time refactoring the code, running static analysis tools over the source, looking for memory leaks, potential bugs etc. One of the results of this is reduced memory usage during a build compared to FB7. The FB8 IDE does use slightly more memory than the FB7 IDE at startup (mostly due to the heavy use of delphi generics), however the runtime memory usage is much lower.A large  part of the refactoring involved unit testing (we created a new unit test framework to suite our needs!) and creating a suite of integration tests. 

FBCmd

The command line parameters have changed to be more consistent and easier to specify. You can also specify one or more targets to execute (when not specified, the default target is executed).

New Project File Formats

FinalBuilder has used an xml file format since version 1, however a common complaint over the years, has been that it is difficult to diff file versions. FinalBuilder 8 has tackled this in two ways.

A new DSL style project file format (.fbp8) is now the default format, it is very easy to diff.

project
begin
    projectid = {04710B72-066E-46E7-84C7-C04A0D8BFE18}
    target
    begin
        name = Default
        targetid = {E6DE94D6-5484-45E9-965A-DB69885AA5E2}
        rootaction
        begin
            action.group
            begin
                id = {D860420B-DE46-4806-959F-8A92A0C86429}
            end
        end
    end
end

A new xml format (.fbx8), much less verbose than the old format.

<?xml version="1.0" encoding="UTF-8"?>
<finalbuilder>
    <project>
        <projectid>{6A717C24-D00F-4983-9FD0-148B2C609634}</projectid>
        <target>
            <name>Default</name>
            <targetid>{E6DE94D6-5484-45E9-965A-DB69885AA5E2}</targetid>
            <rootaction>
                <action.group>
                    <id>{D860420B-DE46-4806-959F-8A92A0C86429}</id>
                </action.group>
            </rootaction>
        </target>
    </project>
</finalbuilder>

Compressed project files (.fbz8) use the dsl format internally (compressed projects are just a zip file with a project.fbp8 inside it).

The default project file encoding is now UTF-8, which is more version control friendly (some version control systems treat utf-16 as binaries).

New Actions

FinalBuilder 8 includes new actions for Chocolatey, Bower, NPM, Gulp, Grunt, Rake, Fake, Mocha, along with Redgate SQL Compare and SQL Data Compare actions.

TFS 2015 XAML builds are also supported, a VSO task will be available soon (will be published on github).

License Key installation

We implemented a new more reliable trial mechanism for FinalBuilder 8, and made it simpler to install license keys. You can log into your account on our website directly in the FinalBuilder IDE and download & install license keys

The trial mechanism also uses license keys, which is more reliable than the mechansim used in earlier versions.

Where's my license key?

If you had an active Software Assurance Subscription for FinalBuilder 7 as of 20th August 2015, FinalBuilder 8 license keys were generated and added to your account today. You should have received an email notification.

How do I purchase an upgrade?

If you had a subscription for FinalBuilder 7, and it expired, you can upgrade by Renewing your subscription.

If you have a license for FinalBuilder 6 or earlier, you can Purchase an upgrade here.

Can I safely install FinalBuilder 8 on a machine with FinalBuilder x?

Yes. FinalBuilder 8 installs into a separate folder (as did all older versions of FinalBuilder).

Can FinalBuilder 8 open an run my old projects?

Yes, FinalBuilder 8 can open and run any projects from any earlier version of FinalBuilder. When you save the projects in FinalBuilder 8, it will save it as a FinalBuilder 8 project (new file).

Can older versions of FinalBuilder open FinalBuilder 8 projects?

No, FinalBuilder 8 projects use a different file format.

Does FinalBuilder 8 work with FinalBuilder Server 7?

No. FinalBuilder 8 does not work with FB Server 7, nor can it be made to work. FinalBuilder Server was discontinued over 2 years ago, if you need Continuous Integration then consider migrating to Continua CI.

I have questions!

Feel free to contact support@finalbuilder.com with any questions you might have.


This version introduces several new features, many of which have been requested by users over the past few months. These features are built upon the various improvements and bug fixes applied in revisions to version 1.6. Please don’t dismay if your requested feature is not included yet, it is still high on our to-do list. Indeed we have several other features specced out, and some partially developed in the background.

Version 1.7 Features

New Builds View dashboard

This view is useful for project administrators and shows a list of active builds across all viewable configurations. This includes running builds, queued builds and builds awaiting promotion.



New panel of indicators

Some important numbers including the total count of queued and running builds, as well as available agents and concurrent build licenses.



New Repositories tab

This is accessed via the Configurations view and shows status of each repository. We've also included “Check  Now” buttons for immediately polling each repository. You can also initiate repository checking from all existing repository pages



Project-wide and configuration versioning options.

We've added some new options in the details section of the project and configuration wizards

  • Project-wide versioning: The build version number can now be incremented across many configurations within a project.

  • Build number re-use: A new option at the project or configuration level to decrement the version counter when a build is discarded while initialising. e.g. due to configuration conditions. Please note that the build number will be decremented only if no other build has started in the mean time and is using a later build number.  



Improvements to Build Completed triggers.

  • Variable expressions: You can now use expressions when defining variables allowing you to pass information from triggering to triggered build.

  • New conditions tab: This allows you to use expressions to control whether a build is triggered



Improvements to Repository triggers.

  • Trigger on specific file change types: Triggers can now be set to start only when the changeset contains certain types of file changes e.g. additions, modifications and deletions.

  • Trigger file pattern: You can now specify a file pattern for repository triggers to restrict triggering only to changesets containing matching files.

  • Trigger comment pattern: You can also limit triggering to changesets with specific text in the comment.



Other build features

  • New force repository check option in queue build dialog allowing control over whether to recheck repository when building. There is also a default setting for each configuration

  • Improvements to Stop Build buttons on dashboard view to ensure that the build stopped is always the latest build at the time when the button was clicked. Stop build dialogs also now display the build number of the build being stopped.

Actions and event handlers

  • New node.js actions
    • Package management with Npm and Bower
    • Grunt and Gulp build runners
    • Unit testing with Mocha

  • New build event handler for posting status updates to a Stash server

  • Log Entry action now allows you to add the message as a build comment. This can be useful for showing additional build details on the build view page.

  • New comments field on all actions – displayed as a tooltip in Stages editor.

  • New ContinuaCI.* system environment variables are now available to all executable actions.

    ContinuaCI.AgentProperty.*
    ContinuaCI.Variable.*
    ContinuaCI.Project.Name
    ContinuaCI.Configuration.Name
    ContinuaCI.Build.Id
    ContinuaCI.Build.BuildNumber
    ContinuaCI.Build.ChangesetCount
    ContinuaCI.Build.ChangesetRevisions
    ContinuaCI.Build.ChangesetTagNames
    ContinuaCI.Build.ChangesetUserNames
    ContinuaCI.Build.Elapsed
    ContinuaCI.Build.HasNewChanges
    ContinuaCI.Build.IsFeatureBranchBuild
    ContinuaCI.Build.IssueCount
    ContinuaCI.Build.LatestChangeset.Created
    ContinuaCI.Build.LatestChangeset.IssueCount
    ContinuaCI.Build.LatestChangeset.RepositoryName
    ContinuaCI.Build.LatestChangeset.Revision
    ContinuaCI.Build.LatestChangeset.TagCount
    ContinuaCI.Build.LatestChangeset.UserName
    ContinuaCI.Build.Started
    ContinuaCI.Build.StartedBy
    ContinuaCI.Build.TimeOnQueue
    ContinuaCI.Build.UsesDefaultBranch
    ContinuaCI.Build.Version


  • Execute Program, DOS Command and PowerShell actions now include an option to generate a context XML file. This file contains details of the build including repositories, changesets and files for you to parse with your own script or program.


Git repositories

  • Case-only renames are now recorded in the repository cache.

  • New option to list author instead of committer as changeset username


Version 1.7 beta is ready for you to download and install. All feedback is welcome!

Nancyfx is a Lightweight, low-ceremony, framework for building HTTP based services on .Net and Mono. It's open source and available on github. 

Nancy supports Forms Authentication, Basic Authentication and Stateless Authentication "out of the box", and it's simple to configure. In my application, I wanted to be able to handle mixed Forms and NTLM Authentication, which is something nancyfx  doesn't support. We have done this before with asp.net on IIS, and it was not a simple task, involving a child site with windows authentication enabled while the main site had forms (IIS doesn't allow both at the same time) and all sorts of redirection. It was painful to develop, and it's painful to install and maintain. 

Fortunately with Nancy and Owin, it's a lot simpler. Using Microsoft's implementation of the Owin spec, and Nancy's Owin support, it's actually quite easy, without the need for child websites and redirection etc. 

I'm not going to explain how to use Nancy or Owin here, just the part needed to hook up NTLM support. In my application, NTLM authentication is invoked by a button on the login page ("Login using my windows account") which causes a specific login url to be hit. We're using Owin for hosting rather than IIS and Owin enables us to get access to the HttpListener, so we can control the authentication scheme for each url. We do this by adding an AuthenticationSchemeSelectorDelegate.

internal class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var listener = (HttpListener)app.Properties["System.Net.HttpListener"];
       //add a delegate to select the auth scheme based on the url 
        listener.AuthenticationSchemeSelectorDelegate = request =>
        {
            //the caller requests we try windows auth by hitting a specific url
            return request.RawUrl.Contains("loginwindows") ? AuthenticationSchemes.IntegratedWindowsAuthentication : AuthenticationSchemes.Anonymous;
        }
        app.UseNancy();
    }
}

What this achieves is to invoke the NTLM negotiation if the "loginwindows" url is hit on our nancy application. If the negotiation is successful (ie the browser supports NTLM and is able to identify the user),  then the Owin environment will have the details of the user, and this is how we get those details out of Owin (in our bootstrapper class).

protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
{
  pipelines.BeforeRequest.AddItemToStartOfPipeline((ctx) =>
  {
      if (ctx.Request.Path.Contains("loginwindows"))
      {
          var env = ((IDictionary<string,>)ctx.Items[Nancy.Owin.NancyOwinHost.RequestEnvironmentKey]);
          var user = (IPrincipal)env["server.User"];
          if (user != null && user.Identity.IsAuthenticated)
          {
              //remove the cookie if someone tried sending one in a request!
              if (ctx.Request.Cookies.ContainsKey("IntegratedWindowsAuthentication"))
                  ctx.Request.Cookies.Remove("IntegratedWindowsAuthentication");
              //Add the user as a cooking on the request object, so that Nancy can see it.
              ctx.Request.Cookies.Add("IntegratedWindowsAuthentication", user.Identity.Name);
          }
      }
      return null;//ensures normal processing continues. 
  });
}

Note we are adding the user in a cookie on the nancy Request object, which might seem a strange thing to do, but it was the only way I could find to add something to the request that can be accessed inside a nancy module, because everything else on the request object is read only. We don't send this cookie back to the user. So with that done, all that remains is the use that user in our login module

 Post["/loginwindows"] = parameters => 
    {
        string domainUser = "";
        if (this.Request.Cookies.TryGetValue("IntegratedWindowsAuthentication",out domainUser))
        {
            //Now we can check if the user is allowed access to the application and if so, add 
            //our forms auth cookie to the response.             
            ...
        }
    }

Of course, this will probably only work on Windows, not sure what the current status is for System.Net.HttpListener is on Mono. This code was tested with Nancyfx 1.2 from nuget. 

FinalBuilder 8 Beta

It's almost 5 years since FinalBuilder 7 was released. Since it's release we have shipped 44 official updates, nearly every update including new features or improvements. This program of continuous improvement has worked well, with customers not having to wait for major new versions to arrive to get support for new versions of Visual Studio or Delphi etc, but it has limited our ability to make major changes. So it's time for a new major version of FinalBuilder. 

What's new in FinalBuilder 8

IDE Themes

The IDE has two new themes, Dark and Light (yes, imaginatively named!). The IDE defaults to Dark on first run, however you can change the theme in the options quite easily. The themes are still a work in progress, we are waiting on an update from a third party control vendor to resolve some issues.

IDE Light theme IDE Light theme

 

Debugger

One of the most asked for features now available in FinalBuilder 8, stepping into included projects. In FinalBuilder 7 and earlier, you could only step over included projects, and wait for them to return. In FinalBuilder 8, you can step into the included project, if it is not already opened the IDE will open the project and switch to it automatically. To make this possible, there are now "Step Into" and "Step Over" functions. The Step into/over now also applies to targets (see below).

Debugger breakpoints now have conditions :

IDE Light theme

Actionlists renamed to Targets

ActionLists have been renamed to Targets. Targets can now also define dependencies, so you can for example define Clean, Build, Test, and have Test depend on Build. If you execute the Test target, and Build has not already been executed, it will be executed first before Test. Targets can be specified on the command line.

IDE Light theme


In FinalBuilder 7 and earlier, projects had a Main and an OnFailure (global error handler) actionlist. In FinalBuilder 8, projects just have a Default Target. Older projects will be imported such that the Main and OnFailure Targets are called from the Default Target inside a try/catch block.

Run Target Action

You can now return values from Targets (ie out parameters) .

IDE Light theme

New Help System

The help has moved online in the form of a wiki. This enables us to do inline help updates without needing to ship new builds. The new help is still being worked on, lots of screenshots are missing etc.. 

Non Visible Changes

Stepping Engine

The stepping engine was rewritten to enable stepping into included projects, and to enable target dependencies. This, work, together with the new variables architecture is where the bulk of effort/time was spent in the FinalBuilder 8 development cycle.

Variables Architecture

The variables architecture and the expression evaluator were rewritten to resolve several corner case issues that we were not able to resolve in FinalBuilder 7. The expression evaulator has a new parser that will allow us to more easily extend the syntax in the future. The User variable namespace was removed, it caused too many problems with projects not running under other users, not running on the build server etc. Use Project variables instead.

Core Messaging

Changes to the messaging has allowed us to improve the performance of the stepping engine and logging, with much less thread switching. This also improved the IDE performance.

CLR Hosting

The minimum CLR version is now .NET 4.0 (ie FinalBuilder requires .net 4.0 to be installed).

Code Changes

In addition to the architectural changes, we also spent a lot of time refactoring the code, running static analysis tools over the source, looking for memory leaks, potential bugs etc. One of the results of this is reduced memory usage during a build compared to FB7. The FB8 IDE does use slightly more memory than the FB7 IDE at startup (mostly due to the heavy use of delphi generics), however the runtime memory usage is much lower.A large  part of the refactoring involved unit testing (we created a new unit test framework to suite our needs!) and creating a suite of integration tests. 

FBCmd

The command line parameters have changed to be more consistent and easier to specify. You can also specify one or more targets to execute (when not specified, the default target is executed).

New Project File Formats

FinalBuilder has used an xml file format since version 1, however a common complaint over the years, has been that it is difficult to diff file versions. FinalBuilder 8 has tackled this in two ways.

A new DSL style project file format (.fbp8) is now the default format, it is very easy to diff.

project
begin
    projectid = {04710B72-066E-46E7-84C7-C04A0D8BFE18}
    target
    begin
        name = Default
        targetid = {E6DE94D6-5484-45E9-965A-DB69885AA5E2}
        rootaction
        begin
            action.group
            begin
                id = {D860420B-DE46-4806-959F-8A92A0C86429}
            end
        end
    end
end

A new xml format (.fbx8), much less verbose than the old format.

<?xml version="1.0" encoding="UTF-8"?>
<finalbuilder>
    <project>
        <projectid>{6A717C24-D00F-4983-9FD0-148B2C609634}</projectid>
        <target>
            <name>Default</name>
            <targetid>{E6DE94D6-5484-45E9-965A-DB69885AA5E2}</targetid>
            <rootaction>
                <action.group>
                    <id>{D860420B-DE46-4806-959F-8A92A0C86429}</id>
                </action.group>
            </rootaction>
        </target>
    </project>
</finalbuilder>

Compressed project files (.fbz8) use the dsl format internally (compressed projects are just a zip file with a project.fbp8 inside it).

The default project file encoding is now UTF-8, which is more version control friendly (some version control systems treat utf-16 as binaries).

New Actions

There are no new actions at the moment, although several are in development, they will be added to the beta builds as they are completed. 

How do I get the Beta?

Links to the beta downloads will be published to the FinalBuilder Downloads page. 

What if I find a bug?

We have created a Beta forum on our forums, or you can email support (please added Beta to the subject). When reporting an issue, be sure to include the beta build number and details about your environment. Please test with the latest beta build before reporting bugs. 

We are particularly keen for people to load up their existing projects from older (ie 7 or earlier) versions of FinalBuilder, save them in FB8 format, and load them again and confirm that everything loaded ok. 

When will it be released?

When it's ready ;)