VSoft Technologies BlogsVSoft Technologies Blogs - posts about our products and software development.https://www.finalbuilder.com/resources/blogsContinua CI System Server Propertieshttps://www.finalbuilder.com/resources/blogs/postid/844/continua-ci-server-propertiesContinua CI,Delphi,FinalBuilder,GeneralThu, 13 May 2021 12:59:28 GMT<p>If you are using Continua for your CI, (and if not why not?) ensure that you check out <a href="https://wiki.finalbuilder.com/x/BYDp">System Server Properties</a>. These allow access to global settings which do not fit on any existing page.</p> <p>They can be used to configure several aspects of the UI and build process to fit your team preferences. This could simply be the number items to show per page on each of the dashboard views (<em>Server.ProjectsView.*.PageSize</em>), or more complex patterns for detecting errors and warnings in actions settings (<em>Actions.Messages.*Patterns</em>). Some system server properties are rarely needed, but some can be considered essential, such as <em>Server.HostUrl</em> which can be used to ensure the links in notifications go to the correct external host name.</p> <p>We have recently added some new server properties which allow you to control the tabs on the Queue Options dialog (<em>Server.QueueOptionsDialog.*</em>) and create a banner for displaying a message to all (or a subset of) users (<em>Server.Banner.*</em>).</p> <p>Here is the result of changing <em>Server.QueueOptionsDialog.TabSequence</em> from "Variables,Repositories,Options"</p> <p><img alt="Queue Options dialog tabs - Variables first" src="/blogimages/daves/serverprops/QueueOptionsVariablesFirst.png" /></p> <p>to "Repositories,Variables,Options".</p> <p><img alt="Queue Options dialog tabs - Variables first" src="/blogimages/daves/serverprops/QueueOptionsRepositoriesFirst.png" /></p> <p> </p> <p>This is what happens to an existing banner when you change the <em>Server.Banner.MessageType</em> from "Information"</p> <p><img alt="Information Banner" src="/blogimages/daves/serverprops/InformationBanner.png" /></p> <p>to "Warning".</p> <p><img alt="Warning Banner" src="/blogimages/daves/serverprops/WarningBanner.png" /></p> <p>Server properties can be edited on the "Continua Server - Properties" page located in the "Administration" section of Continua CI. See our documentation for <a href="https://wiki.finalbuilder.com/x/BYDp">details on all the currently available server properties</a>.</p> 844New VSoft Forumshttps://www.finalbuilder.com/resources/blogs/postid/831/new-vsoft-forumsDelphi,General,Web DevelopmentMon, 10 Sep 2018 15:13:04 GMT<p>TLDR; Our forums have moved to <a href="https://www.finalbuilder.com/forums">https://www.finalbuilder.com/forums</a></p> <p>After years of frustration with Active Forums on Dotnetnuke, we finally got around to moving to a new forums platform. </p> <p>The old forums had zero facilities for dealing with spammers, and sure enough every day, spammers would register on the website and post spam on the forums. Even after turning on email verification (where registration required verifying your email), spammers would verify their emails and post spam.</p> <p>The old forums were also terrible at handling images, code markup etc, and will often completely mangle any content you paste in.</p> <p>So the hunt was on for a new platform. I've lost count of the number of different forum products I've looked at over the years, none of which totally satisfied my needs/wants. I've even contemplated writing my own, but I have little enough free time as it is, and would much rather focus on our products. </p> <p><a href="https://discourse.org">Discourse</a>  looked interesting, so I installed it on a Ubuntu Server 18.04 virtual machine (it runs in a Docker container). After some initial trouble with email configuration (it didn't handle subdomains properly) it was up and running. I'm not great with linux, I've tinkered with it many times over the years but never really used it for any length of time. I was a little apprehensive about installing Discourse, however their guide is pretty good and I managed just fine. </p> <p>The default settings are pretty good, but it is easy to configure. After experimenting with it for a few days (there are a LOT of options), we we liked it a lot, and decided to go with it. </p> <p>Discourse is Excellent at handling bad markup, I'm astounded at how well it deals with malformed html and just renders a good looking post (most of the time). Inserting images is a breeze, the editor will accept Markdown or html, and gives an accurate preview while you are writing a post. Posting code snippets works well usng the same markup as github, with syntax highlighting for a bunch of languages (C#, delphi, javascript, vbscript, xml etc). The preview makes it easy to tell when you have things just right. Discourse also works very well on mobile, although our website does not (the login page is usable) - more work to be done there (like a whole new site!). </p> <p>Discourse is open source (GPL), so you can either host it yourself (free) or let Discourse.org host if for you (paid, starting at $100pm). Since we had spare capacity on our web servers (which run hypver-v 2016) I chose to host it ourselves. That was 11 days ago. </p> <p>My goal was to import the content from the old forums, there are 12 years of valuable posts there which I was loath to lose. </p> <p>The first challenge was that Discourse requires unique emails, and our dotnetnuke install did not. After 12 years of upgrades, our database was in a bit of a sorry state. There were many duplicate accounts (some users had 5 accounts), I guess if you can't remember your login you just create a new one, right? I can't totally blame users for that, the password reset email system was unreliable in the past (it should be ok now, check your spam folder!). So we cleaned up the database, removed old accounts that had no licenses and no forum posts. </p> <p>The next challenge was enabling single sign on with the website. Someone had written a dotnetnuke extension for it, but I wasn't able to get it working (it was written for an older version), so I spent 2 days writing my own (and almost losing the will to live!). Once that was sorted, I got to work on importing the data. Discourse does have a bunch of import code on <a href="https://github.com/discourse/discourse/tree/master/script/import_scripts">github</a> - none of which are for dotnetnuke, and they are all written in Ruby (which I have zero experience with). Fortunately, Discourse does have a <a href="https://docs.discourse.org/">rest api</a> - so using C# (with dapper & restsharp) I set about writing a tool to do the import. Since Discourse doesn't allow you to permanently delete topics, this needed to work first time, and be restartable when an error occurred. This took 4 days to write, much of which was just figuring out how to get past the rate limits Discourse imposes. I did this all locally with a back up of the website db and a local discourse instance. The import took several hours, with many restarts (usually due to bad content in the old forums, topics too short etc). </p> <p>Backing up the local instance of Discourse was trivial, as was restoring it on the remote server (in LA). We did have to spend several hours fixing a bunch of posts, and then some time with sql fixing dates (editing a post sends it to the top of a category). I did also have to ssh into the container to "rebake" the posts to fix image url issues. Fortunately theres is a wealth of info on <a href="https://meta.discourse.org">Discourse's own forums</a> - and search works really well!</p> <p>We chose not to migrate the FinalBuilder Server forum (the product was discontinued in 2013) or the Action Studio forum (which gets very few posts).  </p> <p style="text-align: center;"><img src="/blogimages/vincent/new-forums/discourse.png" /> </p> <p>I'm sure we'll still be tweaking the forums over the next few weeks, but on the whole we are pretty happy with how they are. Let us know what you think (in the <a href="https://www.finalbuilder.com/forums/c/site-feedback">Site Feedback</a> forum!).</p> 831Introducing Continua CI Version 1.9https://www.finalbuilder.com/resources/blogs/postid/782/introducing-continua-ci-version-19.NET,Continua CI,Delphi,General,Web Development,WindowsTue, 14 Aug 2018 13:47:08 GMT<p><img alt="" src="/blogimages/dave/ContinuaCIWizardImageSmall.png" style="border-width: 0px; border-style: solid; margin-right: 5px; margin-left: 5px; width: 55px; height: 55px;" /></p> <p>Version 1.9 is now out of beta and available as a stable release. Thank you to those of you who have already tried out the beta - especially those who reported issues.</p> <p>This version brings major changes to the notifications system. We redesigned it using a common architecture, that makes it much easier to add new notification publisher types. Where previously, only email, XMPP and private message notifications were available, there are now publishers for Slack, Teams, Hipchat and Stride. And we can now add more (let us know what you need).</p> <p><img alt="" src="/blogimages/dave/PublisherTypes.png" style="width: 626px; height: 399px; display: block; margin-left: auto; margin-right: auto; " /></p> <p>We are no longer limited to one publisher of each type. You may, for example, have different email servers for different teams on your company. You can set up two email publishers, one for each server, and set up subscriptions so that notifications from different projects go to different email servers. Likewise for different Slack workspaces, Teams channel connectors and so on.</p> <p>We have also improved the XMPP publisher to support sending notifications to rooms. Subscriptions have been improved, allowing you to specify a room and/or channel for this and other publishers.</p> <p><img alt="" src="/blogimages/dave/Subscription.png" style="display: block; margin-left: auto; margin-right: auto; width: 625px; height: 733px;" /></p> <p>User preferences have been updated allowing each user to specify a recipient id, username or channel per publisher.</p> <p><img alt="" src="/blogimages/dave/UserPreferences.png" style="width: 726px; height: 751px; display: block; margin-left: auto; margin-right: auto; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);" /></p> <p>You can see some metrics on the throughput of each publisher (number of messages on queue, messages sent per second, average send time, etc.) on the Publishers page in the Administration area. This also shows real-time counts of any errors occurring while sending messages and also any messages waiting on a retry queue due to rate limiting or service outages. This allows you to know when you need to upgrade rate limits or make other service changes.</p> <p><img alt="" src="/blogimages/dave/PublisherMetrics.png" style="width: 990px; height: 306px; display: block; margin-left: auto; margin-right: auto; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);" /></p> <p>The Templates page has been updated. Templates are now divided into a tab per publisher. The list of available variables for each event type has been moved to a expandable side panel.</p> <p><img alt="" src="/blogimages/dave/NotificationTemplates.png" style="width: 564px; height: 707px; display: block; margin-left: auto; margin-right: auto; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);" /></p> <p>This release is built on .Net Framework version 4.7.2, which has allowed us to upgrade a number of third party libraries, including the database ORM and PostgreSQL drivers. This has noticeably improved performance, as well as providing us with a richer platform to build future features on. The setup wizard will prompt for you to install .Net Framework version 4.7.2, before continuing with the installation.</p> <p><img alt="" src="/blogimages/dave/InstallerFrameworkRequirement.PNG" style="width: 503px; height: 391px; display: block; margin-left: auto; margin-right: auto;" /></p> <p>Note that applications running on .Net 4.7.2 do not run on versions of Windows prior to Windows Server 2008R2 and Windows 7 SP1. We are also dropping the 32-bit server installer. This is mainly to reduce testing overheads. We will still be releasing 32-bit agents for those who are using 16-bit compilers.</p> <p>We will continue to provide bug fixes to Continua CI version 1.8.1 for while to give you time to migrate from older platforms.</p> <p> </p> <p> </p> 782Automise 5 Released!https://www.finalbuilder.com/resources/blogs/postid/744/automise-5-releasedAutomise,Chocolatey,GeneralMon, 28 Mar 2016 14:32:13 GMT<p>Today we are delighted to release the Automise 5, which now includes a gift. Automise Run-time is now free.</p> <p>As explained in the Beta announcement, our continuous delivery cycle has worked well for Automise 4. Producing constant stream of updates and fixes. Now, with significant updates to the internal workings for Automise today we are releasing Automise 5. </p> <h2>What's new in Automise 5</h2> <h3>Stepping Engine</h3> <p>We have undertaken a major rewrite of the internal stepping engine for Automise 5. This has reduced the moving parts, while also enabling extra features to be implemented. In the end this will mean your projects will run faster, consume less resources, and also providing some extra tools for debugging projects.</p> <h3>Action List Dependencies</h3> <p>Action Lists can now list other action lists that they depend on. For example this allows specifying a UploadAndClean Action List that depends on the Clean and Upload Action Lists. When UploadAndClean is run, if the Clean and Upload Action Lists have not been run they will be. </p> <p style="text-align: center;"><img alt="Action List Dependencies" src="/blogimages/jason/Automise5-beta-release/at5_actionlist_dependencies.png" style="text-align: center;" /></p> <h3>Step into included projects</h3> <p>Previously, debugging include project actions meant running the entire included project when stepping over the action. In Automise 5, debugging allows for stepping into the included project. This will open the included project, if is not already open, and start to debug that project. </p> <h3>Breakpoint Conditions</h3> <p>We have also added to the debugging experience with breakpoint conditions. These work like break point conditions in Visual Studio. They present options for stopping the executing of a script when variables have certain values, or a condition specified becomes true. Conditions can also be the number of passes over the breakpoint.</p> <p style="text-align: center;"><img alt="Action List Dependencies" src="https://www.finalbuilder.com/blogimages/jason/Automise5-beta-release/at5_breakpoint_properties.png" style="text-align: center;" /></p> <h3>IDE Themes (Light and Dark)</h3> <p>After five years we thought it was time Automise got a new coat of paint. We have implemented two new themes, a light and dark theme (defaulting to the dark on first run up). Choose your side wisely&hellip;</p> <table style="border: none; width: 100%;"> <tbody> <tr> <td style="width: 50%;"> <img alt="Action List Dependencies" src="https://www.finalbuilder.com/blogimages/jason/Automise5-beta-release/at5_dark_theme.png" style="text-align: center;" /> </td> <td style="width: 50%;"> <img alt="Action List Dependencies" src="https://www.finalbuilder.com/blogimages/jason/Automise5-beta-release/at5_light_theme.png" style="text-align: center;" /> </td> </tr> </tbody> </table> <h3>Action List Out Parameters</h3> <p>Action Lists parameters can now be defined as an out parameter. These parameters can have their value set inside the action list. On exiting the action list the calling Run Action List action will set the variable assigned as the out variable with that value. This effectively adds the ability to have action lists work as functions and return values calculated in the action list.</p> <h3>Project Formats</h3> <p>Let&rsquo;s face it, xml files are difficult to diff. To make diffs easier Automise 5 has introduce two major updates to the Automise project file structure.</p> <p>&nbsp; &nbsp;1. A new DSL project file format (the new default format) (atp5)</p> <p>&nbsp; &nbsp;2. A new XML project file format (atx5)</p> <p><span style="font-size: 1.4em; font-weight: normal; line-height: 36px; font-family: 'Open Sans', Arial, Helvetica, sans-serif; color: #555555;">New Actions</span></p> <p>We have done some major work to bring new Azure and Amazon S3 actions to you. Some of these being:</p> <ul> <li>Amazon S3 - Added bucket delete object, bucket list objects, bucket list, upload directory, and download folder actions.</li> <li>Azure Actions - Added Login, Logout, Config Mode actions.</li> <li>Azure Group Actions - Added Group Create, Group Delete, Group List, Group Log Show, Group Set, Group Show actions.</li> <li>Azure VM - Added VM Capture, VM Create, VM Deallocate, VM Delete, VM List, VM List, VM Quick Create, VM Restart, VM Start, VM Stop actions.</li> <li>Azure Storage - Added Storage File Copy Show, Storage File Copy Start, Storage File Copy Stop, Storage File Delete, Storage File Download, Storage File List, Storage File Upload actions.</li> </ul> <h3>New License Manager</h3> <p>Automise 5 introduces a new license manager that allows you to download licenses directly from the store. It will be presented to you on first load, or when no valid license has been found. You can also get to it from the Help menu.</p> <p>All that you will require to download a license from the store is your store credentials. It will then log in for you, and download a list of licenses that will work for the current version of Automise. If you had a current Automise 4 subscription as of 28 March 2016, you will already have an Automise 5 license waiting for you in your store account.</p> <p>In addition there is a simpler way to get Trial license, all that you require is a valid email address to receive a verification code on.</p>744Modifying XML Manifest files with FinalBuilderhttps://www.finalbuilder.com/resources/blogs/postid/739/modifying-xml-manifest-files-with-finalbuilder.NET,DelphiFinalBuilder,General,XMLMon, 07 Dec 2015 11:37:47 GMTThis topic is something that I pulled from our support system, it's something we get asked about more that once a year, that is, how do I modify the xml manifest file using FinalBuilder. Typically its the assembly version attribute that users want to modify, so that's what I'll show here, but you can use the same technique to edit other parts of the manifest file.&nbsp;<br /> <br /> So lets define our XML Document by adding an <a href="http://wiki.finalbuilder.com/display/FB8/XML+Document+Define+Action" target="_blank" title="XML Document Define Action Documentation">XML Document Define Action</a>, and point it at our manifest file.<br /> <br /> <p style="text-align: center;"> <img src="/blogimages/vincent/manifest/manifest-xml-doc.png" alt="Define XML Document" /> </p> <br /> If you open your manifest file in notpad, you will notice assembly element looks something like this :<br /> <br /> <pre class="brush:xml; toolbar:true;">&lt;assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" &gt; </pre> <br /> Note the xmlns attribute, this is what causes users problems with the xml actions in FinalBuilder, XML Namespaces. The MXSML Parser is very strict when it comes to namespaces, and it requires that we make use of them when using XPath to select nodes.&nbsp;On the XML Document action, switch to the MSXML Parser tab and in the Extra Namespaces grid, add the following.&nbsp;<br /> <br /> <p style="text-align: center;"> <img src="/blogimages/vincent/manifest/manifest-xml-doc2.png" alt="Namespace Prefix" /> </p> <br /> What we are doing here is assigning a prefix (x in this case) to the namespace. This prefix will be used in our XPath statements.<br /> <br /> Add an<a href="http://wiki.finalbuilder.com/display/FB8/Edit+XML+File+Action" target="_blank" title="Edit XML File Action documentation"> Edit XML File action</a> - set the XML File to use an XML Document and select the document we defined with the previous action. Now we need to define the XPath statement to the version attribute that we are going to modify.<br /> <br /> <p style="text-align: center;"> <img src="/blogimages/vincent/manifest/manifest-xml-edit-version.png" alt="Edit XML" /> </p> <br /> And finally, add a Save XML Document Action to save our changes to the file. Note that if you are editing other parts of the manifest file, make sure you add the namespaces and different prefixes, and use this prefixes appropriately in your XPath statements.<br /> <br /> Note, all of this could be done in a single Edit XML File action, however, if you want to make more than one modification to the manifest file then it's more efficient to use the xml document define action to avoid loading/parsing/saving the document for each edit.&nbsp;<br />739Delphi-Mocks Parameter Matchershttps://www.finalbuilder.com/resources/blogs/postid/737/delphi-mocks-parameter-matchersDelphi,GeneralGit,Open SourceTue, 22 Sep 2015 10:15:11 GMT<p> We recently updated Delphi Mocks to allow for better parameter matching on Expectations registered with the Mock. This allows the developer to place tighter controls on verifying that a mocked interface/object method is called. Below is a simple example of when the parameter matchers can be used. </p> <pre class="brush:delphi; toolbar:true; highlight:[14,15,16,17]">procedure TExample_InterfaceImplementTests.Implement_Multiple_Interfaces; var sutProjectSaver : IProjectSaveCheck; mockProject : TMock&lt;IProject&gt;; begin //Test that when we check and save a project, and its dirty, we save. //CREATE - The project saver under test. sutProjectSaver := TProjectSaveCheck.Create; //CREATE - Mock project to control our testing. mockProject := TMock&lt;IProject&gt;.Create; //SETUP - Mock project will show as dirty and will expect to be saved. mockProject.Setup.WillReturn(true).When.IsDirty; //NEW! - Add expectation that the save will be called as dirty is returning true. // As we don't care about the filename value passed to us we // allow any string to be passed to report this expectation as met. mockProject.Setup.Expect.Once.When.Save(It(0).IsAny&lt;string&gt;()); //TEST - Visit the mock element to see if our test works. sutProjectSaver.Execute(mockProject); //VERIFY - Make sure that save was indeed called. mockProject.VerifyAll; end; </pre> <p> Previously the developer writing this test would have to provide the exact filename to be passed to the mocked Save method. As we don't know what the projects filename is going to be (in our example case), we would either have to; 1. Forgo doing this test. 2. Implement a project object to test with. Both of these options are not ideal. </p> <p>Parameter matchers resolve this situation. It is now simple to either restrict or broaden the parameters passed to mocked methods that will satisfy the expectation defined. To achieve this Delphi-Mocks offers eleven new functions; </p> <pre class="brush:delphi; toolbar:true;">function It(const AParamIndx : Integer) : ItRec; function It0 : ItRec; function It1 : ItRec; function It2 : ItRec; function It3 : ItRec; function It4 : ItRec; function It5 : ItRec; function It6 : ItRec; function It7 : ItRec; function It8 : ItRec; function It9 : ItRec; </pre> <p>The first "function It(const AParamIndx : Integer) : ItRec;" allows the developer to specify the index of the parameter they wish to set for the next expectation setup of a mock method. It(0) will refer to the first parameter, It(1) the second and so forth. Note that the reason for specifying the parameter index is that Delphi's parameter evaluation order is not defined, so we could not rely on the parameters being evaluated in order (which is what we did when we initially wrote this feature). Interestingly, with the 64 bit Delphi compiler, parameter evaluation does appear to happen in order, but we could not be certain this will always be the case.&nbsp;</p> <p>The other ten functions It0 through to It9 are simply wrappers of the index call passing the index in their name. All these functions return an ItRec. The ItRec has the function structure;</p> <pre class="brush:delphi; toolbar:true;">ItRec = record var ParamIndex : cardinal; constructor Create(const AParamIndex : Integer); function IsAny&lt;T&gt;() : T ; function Matches&lt;T&gt;(const predicate: TPredicate&lt;T&gt;) : T; function IsNotNil&lt;T&gt; : T; function IsEqualTo&lt;T&gt;(const value : T) : T; function IsInRange&lt;T&gt;(const fromValue : T; const toValue : T) : T; function IsIn&lt;T&gt;(const values : TArray&lt;T&gt;) : T; overload; function IsIn&lt;T&gt;(const values : IEnumerable&lt;T&gt;) : T; overload; function IsNotIn&lt;T&gt;(const values : TArray&lt;T&gt;) : T; overload; function IsNotIn&lt;T&gt;(const values : IEnumerable&lt;T&gt;) : T; overload; {$IFDEF SUPPORTS_REGEX} //XE2 or later function IsRegex(const regex : string; const options : TRegExOptions = []) : string; {$ENDIF} end; </pre> <p>Each of the functions creates a different matcher. For example the IsAny&lt;T&gt; will cause the expectation to be met when the parameter passed to the mock is of any value that has the type T. In the example above this type would be a string. You will also notice that each function returns the type T. This is so that each call can be placed within the mock methods call directly. Doing so helps with making sure parameter types match the testing value.</p> <p>IsEqualTo&lt;T&gt; requires that the parameter matches exactly to the value passed into the IsEqualTo&lt;T&gt;. This could be used to restrict the expectation to a tighter test of the functionality under test.</p> <pre class="brush:delphi; toolbar:true;">//Match on the filename being "temp.txt" only. mockProject.Setup.Expect.Once.When.Save(It(0).IsEqualTo&lt;string&gt;('temp.txt')); //VERIFY - Make sure that save was indeed called. mockProject.VerifyAll; </pre> <p>In the future we are looking to provide &ldquo;And&rdquo;\&rdquo;Or&rdquo; operators. These operators might also live on the ItRec and allow combining with as many other matchers using the same type.</p> <pre class="brush:delphi; toolbar:true;">//Match on the filename being "temp.txt" or "temp.doc" only. mockProject.Setup.Expect.Once.When.Save( It(0).Or(It(0).IsEqualTo&lt;string&gt;('temp.txt'), It(0).IsEqualTo&lt;string&gt;('temp.doc')); //VERIFY - Make sure that save was indeed called. mockProject.VerifyAll; </pre> <p>There might be a better way to make the resulting code a bit cleaner. It would make the tests easier to read, instead of using regex which is also possible in this case. As a result we believe this would be a good edition to the library.</p> <p><a href="https://github.com/VSoftTechnologies/Delphi-Mocks">Feel free to clone the repository from GitHub</a>. If you have some time to spare submit a pull requests or two with your ideas/improvements. We believe this is a great little project worthy of some attention. Let us know what you think of the changes so far.</p>737FinalBuilder 8 Betahttps://www.finalbuilder.com/resources/blogs/postid/729/finalbuilder-8-beta.NET,Delphi,FinalBuilder,GeneralTue, 05 May 2015 20:06:36 GMT<p>It's almost 5 years since FinalBuilder 7 was released. Since it's release we have shipped <a href="/downloads/finalbuilder/finalbuilder-7-version-history">44 official updates</a>, 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. </p> <h2>What's new in FinalBuilder 8</h2> <h3>IDE Themes</h3> <p>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.</p> <table style="border: none; width: 100%;"> <tbody> <tr> <td style="width: 50%;"><img alt="IDE Light theme" height="276" src="/blogImages/vincent/fb8-beta/fb8-ide-light-small.png" width="400" /></td> <td style="width: 50%;"><img alt="IDE Light theme" height="276" src="/blogImages/vincent/fb8-beta/fb8-ide-dark-small.png" width="400" /></td> </tr> </tbody> </table> <p> </p> <h3>Debugger</h3> <p>One of the most asked for features now available in FinalBuilder 8, <strong>stepping into included projects</strong>. 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).<br /> <br /> Debugger breakpoints now have conditions :</p> <p style="text-align: center;"><img alt="IDE Light theme" height="276" src="/blogImages/vincent/fb8-beta/fb8-breakpoint-props.png" style="text-align: center;" width="400" /></p> <h3>Actionlists renamed to Targets</h3> <p>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.</p> <p style="text-align: center;"><img alt="IDE Light theme" height="276" src="/blogImages/vincent/fb8-beta/fb8-target-depend.png" style="text-align: center;" width="400" /></p> <p> </p> <p>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.</p> <p> </p> <h3>Run Target Action</h3> <p>You can now return values from Targets (ie out parameters) .</p> <p style="text-align: center;"><img alt="IDE Light theme" height="276" src="/blogImages/vincent/fb8-beta/fb8-target-outparams.png" style="text-align: center;" width="400" /></p> <h3>New Help System</h3> <p>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.. </p> <h2>Non Visible Changes</h2> <h3>Stepping Engine</h3> <p>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.</p> <h3>Variables Architecture</h3> <p>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.</p> <h3>Core Messaging</h3> <p>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.</p> <h3>CLR Hosting</h3> <p>The minimum CLR version is now .NET 4.0 (ie FinalBuilder requires .net 4.0 to be installed).</p> <h3>Code Changes</h3> <p>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 <a href="https://github.com/VSoftTechnologies/DUnitX" target="_blank">unit test framework</a> to suite our needs!) and creating a suite of integration tests. </p> <h3>FBCmd</h3> <p>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).</p> <h3>New Project File Formats</h3> <p>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.</p> <p>A new DSL style project file format (.fbp8) is now the default format, it is very easy to diff.</p> <pre class="brush:delphi; toolbar:true;"> 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 </pre> <p>A new xml format (.fbx8), much less verbose than the old format.<span style="white-space: pre-wrap;"> </span></p> <pre class="brush:xml; toolbar:true;"> <!--?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> </pre> <p>Compressed project files (.fbz8) use the dsl format internally (compressed projects are just a zip file with a project.fbp8 inside it).</p> <p>The default project file encoding is now UTF-8, which is more version control friendly (some version control systems treat utf-16 as binaries).</p> <h3>New Actions</h3> <p>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. </p> <h3>How do I get the Beta?</h3> <p>Links to the beta downloads will be published to the <a href="https://www.finalbuilder.com/downloads/finalbuilder">FinalBuilder Downloads</a> page. <br />  </p> <h3>What if I find a bug?</h3> <p>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. <br /> <br /> 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. <br />  </p> <h3>When will it be released?</h3> <h3> </h3> <p>When it's ready ;)</p> 729How to Fix your system path after installing Delphihttps://www.finalbuilder.com/resources/blogs/postid/722/how-to-fix-your-system-path-after-installing-delphiContinua CI,Delphi,FinalBuilder,GeneralTue, 23 Sep 2014 17:00:35 GMT<span><strong><span style="color: #ff0000;">Update : Still the same situation with XE8, Rad Studio 10 Seattle, Rad Studio 10.1 Berlin.&nbsp;</span></strong><br /> <br /> The Windows Path environment variable has a limit of <span style="text-decoration: line-through; color: #ff0000;">1023</span>&nbsp;<sup>*</sup>&nbsp;<span style="color: #333333; background: #ffffff;"><strong>2,048</strong>&nbsp;</span>characters, a stupidly short limit in this day and age, and when this limit is exceeded the path is truncated. Why this limit still exists on windows I have no idea.. for that matter why it ever existed... anyway, we're stuck with it (along with it's best buddy, MAX_PATH).&nbsp;</span><br /> <br /> Each version of Delphi adds over 200 characters to your system path. Worst still, they add those 200+ characters to the front of the path, not the end. What happens, is that eventually, important entries get truncated off end of the path, and <strong>strange things happen</strong>. You will find programs will not run, the task bar displays the wrong icons for programs, even getting to the control panel can be problematic.&nbsp;<br /> <br /> If you look at the entries that XE7 added to the start of your path you will see something like this :<br /> <br /> C:\Program Files (x86)\Embarcadero\Studio\15.0\bin;<br /> <span>C:\Program Files (x86)\Embarcadero\Studio\15.0\bin64;<br /> </span>C:\Users\Public\Documents\Embarcadero\Studio\15.0\Bpl;<br /> C:\Users\Public\Documents\Embarcadero\Studio\15.0\Bpl\Win64;<br /> <br /> Fortunately this can be shortened by the use of junction points. Sadly, this will polute your C: drive with new folders but it's better than the alternative.<br /> <br /> The trick is to create links for the most common paths, so on mine I created these<br /> For XE5 and earlier :<br /> mklink /j RS C:\Program Files (x86)\Embarcadero\RAD Studio<br /> mklink /j rspub&nbsp;C:\Users\Public\Documents\RAD Studio<br /> <br /> XE6 and above&nbsp;<br /> <br /> mklink /j Studio&nbsp;C:\Program Files (x86)\Embarcadero\Studio<br /> <span>mklink /j spub&nbsp;</span><span>C:\Users\Public\Documents\Embarcadero\Studio</span><br /> <br /> Once you have those junction points, you can then edit your path and replace the long paths, for example (for XE7) :<br /> <br /> <span>C:\Program Files (x86)\Embarcadero\Studio\15.0\bin -&gt;&nbsp;</span><span>C:\Studio\15.0\bin<br /> </span><span>C:\Program Files (x86)\Embarcadero\Studio\15.0\bin64 -&gt;&nbsp;C:\Studio\15.0\bin64</span><br /> <span>C:\Users\Public\Documents\Embarcadero\Studio\15.0\Bpl&nbsp;-&gt;&nbsp;C:\spub\15.0\Bpl</span><br /> <span>C:\Users\Public\Documents\Embarcadero\Studio\15.0\Bpl\Win64 - &gt; c:\spub\15.0\Bpl\Win64<br /> </span><br /> So for XE7, that cuts it down from 218 to 80 characters, if like me you also have multiple versions of Rad Studio installed, this can be a big saving.<br /> <br /> As for Rad Studio, it's extremely rude to add things to the start of the path, the truncation it causes can ruin a machine.. I wasted several hours again today after installing XE7. Embarcadero were told about this issue many times over several releases.. according to the <a href="http://docwiki.embarcadero.com/RADStudio/XE7/en/Installation_Path_Length_Problem">doco</a>, XE7 will popup a message about this.. I didn't see it so not sure when that is supposed to appear, but in any event, if your installer or progam needs to add something to the path environment variable, <strong>PLEASE ADD IT TO THE END!!</strong> and save us all a bunch of time.&nbsp;<br /> <br /> <sup>*</sup>&nbsp;Correction, max path length is 2048 - very difficult to find a difinitive source of this information on the microsoft site - the max size of an env variable is 2048, however I have seen the path variable truncated at 1024 many times.722Continua 1.5 releasedhttps://www.finalbuilder.com/resources/blogs/postid/721/continua-15-released.NET,Continua CI,GeneralTue, 09 Sep 2014 11:13:57 GMT<br /> <br /> <h2>Continua Version 1.5 is now <a target="_blank" href="https://www.finalbuilder.com/downloads/continuaci">available for download</a></h2> <p>Today marks a milestone in Continua CI as we release version 1.5 of the product. Its been many months in the making, we hope you enjoy the update as much as we enjoyed making it.</p> <p>There are many features that we think you'll benefit from by updating to v1.5, some of these include: </p> <h3>Reworked UI:</h3> <ul> <li>Now using bootstrap framework for styling</li> <li>Redesigned <a target="_blank" href="http://wiki.finalbuilder.com/display/continua/dashboards">dashboards</a> that show more information including graphs.</li> <li>Added stages information to the Project tile and list views</li> <li>Disabled configurations are now displayed as faded</li> </ul> <br /> <h3>Cloning:</h3> <ul> <li>Can now clone whole projects and clone configurations between projects.</li> </ul> <br /> <h3>Stage Conditions:</h3> <ul> <li>Auto Promote conditions - stages can now use conditions to control whether to auto-promote to the next stage.</li> <li>Skip conditions - you can now provide conditions for skipping stages or disable a stage completely.</li> </ul> <br /> <h3>New Actions:</h3> <ul> <li>Update GitHub Status Action is now deprecated (use event handler instead - see below).</li> <li><a target="_blank" href="http://wiki.finalbuilder.com/display/continua/NuGet+Restore+Action">NuGet restore action</a>.</li> <li><a target="_blank" href="http://wiki.finalbuilder.com/display/continua/Fake+Action">Fake (F#) build runner.</a></li> </ul> <br /> <h3>Repository Tags: (Git, Mercurial and Subversion repositories only)</h3> <ul> <li>Continua CI can now detect and list repository tags.</li> <li>Tags are now displayed in changeset tabs on configuration and build views.</li> <li>Repository trigger can now be set to trigger on tag changes (new tags, edits and deletions) changes).</li> <li>You can now run a build on a <a target="_blank" href="http://wiki.finalbuilder.com/display/continua/Builds#Builds-RepositoryBranch/Tag">tagged changeset</a>.</li> </ul> <br /> <h3><a target="_blank" href="http://wiki.finalbuilder.com/display/continua/Build+Event+Handlers">Build Event Handlers:</a></h3> <ul> <li> Octopus Deploy: Create/Deploy/Promote Octopus Deploy releases. </li> <li> Tag Repository Changesets: Apply tags to a repository changeset (Git, Mercurial and Subversion repositories only) </li> <li> <a target="_blank" href="http://wiki.finalbuilder.com/display/continua/Update+GitHub+Status">Update GitHub Status: replaces the Update GitHub Status action</a>.</li> </ul> <br /> <h3>and many more changes including:</h3> <ul> <li> Styling changes for improved handling on small screen sizes</li> <li> Report ordering: you can choose which one is displayed first on the build view.</li> <li> New expression functions: Utils.NewGuid() and Utils.RandomNumber() can be used for generation of temporary paths for example</li> <li> Additional LatestChangeset object within the repository object with Branch, BranchName, Comment, CommitterUserName, CommitterFullName, Created, FileCount, Id and RepositoryUsername properties to use in expressions</li> <li> Continua now supports DUnitX enhanced Command Line Options</li> </ul> <h2>Updating</h2> <p>Updating to this new release is the same regardless if you are using v1.0.X or a recent build from the beta or release candidate. Simply download the installer and run it, the setup will guide you through the install process. As usual we are available on <a href="mailto:support@finalbuilder.com">support@finalbuilder.com</a> if you run into any troubles.</p> <p>For this release you will need to update both the server and agents.</p> <h2>A word of thanks</h2> <p>The team wishes to thank everyone who has participated in the beta and release candidate stages for this release. Your positive feedback has been invaluable in shaping the features and functionality of the product. Thank you for your continued support.</p>721ContinuaCI Version 1.5 - New Dashboardshttps://www.finalbuilder.com/resources/blogs/postid/711/continua-15-new-dashboardsContinua CI,GeneralSun, 29 Jun 2014 16:38:17 GMT<br /> <br /> <br /> <br /> With the upcoming 1.5 release of ContinuaCI &nbsp;we have made a number of enhancements to the dashboards, we think you'll love them! &nbsp;Here is a peek at what's coming soon.<br /> <br /> <h4>The New List View</h4> <img src="/portals/0/articleimages/blogimages/peter/dashboards/all-projects.png" alt="all-projects-listview" /><br /> <br /> <strong>Improvements:</strong><br /> <ul> <li>- Stage indicator blocks provide quick drill-down into the build log.</li> <li>- Improved viability and responsiveness of build actions buttons.</li> <li>- Build action buttons moved to the left for easier access.</li> <li>- Viability enhancements around projects.</li> <li>- Improved Responsiveness and performance tweeks.</li> </ul> <br /> <h4>List View: With Builds Completed</h4> <img src="/portals/0/articleimages/blogimages/peter/dashboards/all-projects-completed-build.png" alt="all-projects-listview-completed-builds" /><br /> <br /> <h4>List View: With Builds Running</h4> <img src="/portals/0/articleimages/blogimages/peter/dashboards/all-projects-multibuild.png" alt="all-projects-listview-completed-multibuilds" /><br /> <br /> <h4>The New Details View</h4> <img src="/portals/0/articleimages/blogimages/peter/dashboards/detail-view.png" alt="details-view" /><br /> <br /> <strong>Improvements:</strong><br /> <ul> <li>- Build and Queue times now have graphs!</li> <li>- Build status card on the left hand side displays the status of the build as it progresses.</li> <li>- Build action buttons are more obvious and responsive.</li> <li>- Stage indicator blocks (present on the build status cards) provide quick drill-down into the build log.</li> <li>- Improved Responsiveness and performance tweeks.</li> </ul> <br /> <h4>Details View: with Builds Queued</h4> <img src="/portals/0/articleimages/blogimages/peter/dashboards/detail-view-queued.png" alt="details-view-queued" /><br /> <br /> <h4>Details View: with Builds Executing</h4> <img src="/portals/0/articleimages/blogimages/peter/dashboards/detail-view-building.png" alt="details-view-building" /><br /> <br /> <h4>Details View: with Builds Finished</h4> <img src="/portals/0/articleimages/blogimages/peter/dashboards/detail-view-finished.png" alt="details-view-finished" /><br /> <br /> Stay tuned for more exciting details regarding the version 1.5 release!711Automated UI Testing with ContinuaCI and Seleniumhttps://www.finalbuilder.com/resources/blogs/postid/709/automated-ui-testing-done-right-with-continuaci.NET,Continua CI,GeneralOpen SourceTue, 20 May 2014 11:46:00 GMT<p>You have just completed an awesomely complex change to your shinny new webapp! After running all your unit tests things are in the green and looking clean.</p> <p>Very satisfied at the quality of your work you fire up the application to verify that everything is still working as advertised. Below is what greets you on the root path of your app</p> <p><img alt="Funny error" src="/blogimages/peter/404-notfound-ie5.gif" /></p> <p>We have all been here at some time or another! What happened! Perhaps it was not your code that broke it! Maybe the issue originated from another part of your organisation, or maybe it came from somewhere on the "inter-webs".</p> <p>Its time to look at the underlying problem however ..... testing web user interfaces is hard! Its time consuming and difficult to get right. Manual clicks, much typing, cross referencing client specifications etc, surely there must be an easier way. At the end of the day we DO need to test our user interfaces!></p> <h2>Automated Web UI Testing</h2> <p>Thankfully UI testing today can be Automated, running real browsers in real end to end functional tests, to ensure our results meet (and continue to meet) expectations.</p> <p>For the sake of brevity and clarity in this demonstration we will focus on testing an existing endpoint. It is considered common place to find functional tests included as part of a wider build pipeline, which may consist of such steps as:</p> <ul> <li>Build</li> <li>Unit Test</li> <li>Deploy to Test Environment</li> <li>Perform Functional Tests</li> <li>Deploy to Production</li> </ul> <p> </p> <p>In this article we will be focusing on the functional testing component of this pipeline. We will proceed on the assumption that your code has already been, built unit tested and deployed to a Functional Test environment. Today we will :</p> <ul> <li>Add Automated UI testing to an existing endpoint google.com</li> <li>Configure ContinuaCI to automatically build our project, and perform the tests</li> </ul> <p> </p> <h3>Software Requirements:</h3> <p> </p> <ul> <li>Visual Studio 2010 Express Edition SP1 or greater (<a href="http://visualstudio.com/">visualstudio.com</a>)</li> <li>Microsoft Dot Net Framework version 4 or greater</li> <li>Java JRE (<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">http://www.oracle.com/technetwork/java/javase/downloads/index.html</a>)</li> <li>Mercurial (<a href="https://mercurial-scm.org">https://mercurial-scm.org</a>)</li> <li>Mozilla Firefox (<a href="http://getfirefox.com/">getfirefox.com</a>)</li> <li>Nuget (<a href="http://docs.nuget.org/docs/start-here/installing-nuget">docs.nuget.org/docs/start-here/installing-nuget</a>)</li> </ul> <p> </p> <h3>Step1: Prepare a Selenium endpoint</h3> <p>Firstly we will prepare for our UI tests by setting up a Selenium server. <span><a href="http://docs.seleniumhq.org/">Selenium</a> is a browser automation framework which will be used to 'remote control' a real browser. </span>This machine will be designated for performing the UI tests against, preferably this will be a machine separate from your ContinuaCI server.<br /> <br /> Log into the machine you have chosen for the Selenium server with administrator privileges<br /> Download and install Mozilla Firefox (getfirefox.com), this will be the browser that we target as part of this example, however Selenium can target lots of other browsers. For a full breakdown please <a href="http://docs.seleniumhq.org/about/platforms.jsp"> see the docs page</a>: .<br /> Download Selenium Server (<a href="http://docs.seleniumhq.org/download">docs.seleniumhq.org/download</a>), at the time of writing the latest version is 2.41.0.<br /> <br /> Place it into a permanent location of you choosing, in our example ("C:\Program Files (x86)\SeleniumServer")<br /> Download NSSM (<a href="http://nssm.cc/download">nssm.cc/download</a>), unzip it and place into a permanent location of you choosing "C:\Program Files (x86)\nssm-2.22\"<br /> <br /> Ensure that port 4444 is set to allow traffic (this is the default communicationsport for Selenium)<br /> <br /> Open a console and run the following commands:<br /> <span style="font-family: 'Courier New';">"C:\Program Files (x86)\nssm-2.22\win64\nssm.exe" install Selenium-Server "java" "-jar \"C:\Program Files (x86)\SeleniumServer\selenium-server-standalone-2.41.0.jar\""<br /> net start Selenium-Server</span><br /> <br /> <img alt="name project" src="/blogimages/peter/install-sel-1.png" /><br /> <br /> In order to uninstall the Selenium server service, the following commands can be run:<br /> <span style="font-family: 'Courier New';">net stop Selenium-Server<br /> "C:\Program Files (x86)\nssm-2.22\win64\nssm.exe" remove Selenium-Server </span><br /> <br /> <img alt="name project" src="/blogimages/peter/install-sel-2.png" /></p> <h3>Step2: Create a test class and add it to source control</h3> <p>Create a new class library project in Visual Studio, lets call it 'tests'<br /> Open the Nuget Package Manager Console window (tools menu-> library package manager -> package manager console), select the test project as the default project and run the following script:<br /> <br /> Install-Package Selenium.Automation.Framework<br /> Install-Package Selenium.WebDriver<br /> Install-Package Selenium.Support<br /> Install-Package NUnit<br /> Install-Package NUnit.Runners<br /> <br /> Create a new class called within the tests project (lets call it tests) and place the below code (Note: line 23 should be changed with location to the Selenium-Server we setup in the previous step):</p> <pre class="brush: c#; toolbar:true"> using System; using System.Text; using NUnit.Framework; using OpenQA.Selenium.Firefox; using OpenQA.Selenium; using OpenQA.Selenium.Remote; using OpenQA.Selenium.Support.UI; namespace SeleniumTests { [TestFixture] public class test { private RemoteWebDriver driver; [SetUp] public void SetupTest() { // Look for an environment variable string server = null; server = System.Environment.GetEnvironmentVariable("SELENIUM_SERVER"); if (server == null) { server = "http:// *** PUT THE NAME OF YOUR SERVER HERE ***:4444/wd/hub"; } // Remote testing driver = new RemoteWebDriver(new Uri(server), DesiredCapabilities.Firefox()); } [TearDown] public void TeardownTest() { try { driver.Quit(); } catch (Exception) { // Ignore errors if unable to close the browser } } [Test] public void FirstSeleniumTest() { driver.Navigate().GoToUrl("http://www.google.com/"); IWebElement query = driver.FindElement(By.Name("q")); query.SendKeys("a test"); Assert.AreEqual(driver.Title, "Google"); } } } </pre> <h3>Step3: Test the test!</h3> <p>Build the solution<br /> Open NUnit build runner (by default this is located at ~\packages\NUnit.Runners.2.6.3\tools\nunit.exe) , Select file -> Open Project, and locate the tests dll that you have build in the previous step<br /> click the run button<br /> ~ 15 seconds or so you should have one green test!<br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-17.png" /><br /> <br /> So what just happened? Behind the scenes an instance of firefox was opened (on the Selenium Server), perform a simple google search query and undertook a simple Nunit assertion has verified the name of the window was equal to "Google", very cool!.<br /> <br /> Now lets make the test fail, go ahead and change line 78, lets say "zzGoogle", build, and rerun the test. We now have a failing test. Go ahead and change it back so that we have a single passing test.<br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-18.png" /></p> <h4>Create a source control repository</h4> <p>In this example, we're using mercurial</p> <p><span>open a command prompt at ~\</span><br /> <span>type "hg init"</span><br /> <span>add a .hgignore file into the directory. Forconveniencewe have prepared one for you</span><a href="/blogimages/peter/.hgignore.txt">here</a><br /> <span>type "hg add"</span><br /> <span>type "hg commit -m "initial commit""</span></p> <p> </p> <h3>Step 4: Setting up Automated UI testing in ContinuaCI</h3> <p>Navigate to the ContinuaCI web interface</p> <p> </p> <h4>Create a project</h4> <p><br /> Open ContinuaCI<br /> Select "Create Project" from the top tasks dropdown menu<br /> <br /> <img alt="create project" src="/blogimages/peter/create-project-1.png" /><br /> <br /> Name the project something memerable; In our case: "pete sel test 1"<br /> <img alt="name project" src="/blogimages/peter/create-project-3.png" /><br /> Click the "Save & Complete Wizard" button</p> <p> </p> <h4>Create a configuration for this project</h4> <p><br /> Click "Create a Configuration"<br /> Name the config something memorable; in our case "sel-testconfig-1"<br /> Click save & Continue<br /> Click the 'Enable now' link at the bottom of the page to enable this configuration</p> <p> </p> <h4>Point to our Repository</h4> <p><br /> under the section "Configuration Repositories", select the "Create" link<br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-4.png" /><br /> <br /> Name the repository "test_repo"<br /> Select "Mercurial" from the "type" dropdown list<br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-6.png" /><br /> <br /> Select the Mercurial" tab from the top of the dialogue box<br /> Enter the repository location under "source path" in our case '\\machinename\c$\sel-blog-final'<br /> Click validate to ensure all is well<br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-8.png" /><br /> <br /> Click save, your repository is now ready to go!<br /> <img alt="name project" src="/blogimages/peter/create-project-9.png" /></p> <p> </p> <h4>Add actions to our build</h4> <p><br /> Click on the Stages tab<br /> We will add a nuget restore action, click on the "Nuget" section from the categories on the left<br /> Drag and drop the action "Nuget Restore" onto the design surface<br /> Enter the location of the solution file: "$Source.test_repo$\tests.sln"<br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-11.png" /><br /> <br /> Click Save</p> <h4>Build our tests</h4> <p><br /> Click on the "Build runners" category from the categories on the left hand menu<br /> Drag and drop a Visual Studio action onto the design surface (note that the same outcome can be achieved here with an MSBuild action).<br /> <br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-19.png" /><br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-13.png" /><br /> <br /> Enter the name of the solution file: "$Source.test_repo$\tests.sln"<br /> Specify that this should be a 'Release' build under the configuration option<br /> Click save</p> <p> </p> <h4>Setup ContinuaCI to run our Nunit tests</h4> <p><br /> Select the 'unit testing' category from the left hand menu<br /> Drag and drop an NUnit action onto the design surface<br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-20.png" /><br /> <br /> Name our action 'run UI tests'<br /> Within the files: option, specify the name of the tests project '$Source.test_repo$\tests\tests.csproj'<br /> Within the Project Configuration section specify 'Release'<br /> Specify which version of NUnit<br /> In order to provide greater configuration flexibility we can pass in the location of our Selenium server to the tests at runtime. This is done within the 'Environments' tab. In our case the location of the Selenium server is<span></span><span>http://SELSERVER:4444/wd/hub</span><span>.</span><br /> <br /> <img alt="environment tab" src="/blogimages/peter/create-project-24.png" /><br /> <br /> Click Save<br /> <br /> Click save and complete Wizard<br /> We are now ready to build!<br /> <br /> Start a build immediately by clicking the top right hand side fast forward icon<br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-14.png" /><br /> A build will start, and complete!<br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-15.png" /><br /> When viewing the build log (this can be done by clicking on the green build number, then selecting the log tab) we can see that our UI tests have been run successfully. They are also visible within the 'Unit Tests' tab which displays further metrics around the tests.<br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-23.png" /><br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-22.png" /></p> <p> </p> <p> </p> <h3>Step 5: Getting more advanced</h3> <p>Lets try a slightly more advanced example. This time we will examine a common use case. A physical visual inspection test needs to be conducted before a release can progress in the pipeline.<br /> <br /> Place the following code within our test class.</p> <pre class="brush: c#; toolbar:true"> using System; using System.Text; using NUnit.Framework; using OpenQA.Selenium.Firefox; using OpenQA.Selenium; using OpenQA.Selenium.Remote; using OpenQA.Selenium.Support.UI; namespace SeleniumTests { [TestFixture] public class test { private RemoteWebDriver driver; [SetUp] public void SetupTest() { // Look for an environment variable string server = null; server = System.Environment.GetEnvironmentVariable("SELENIUM_SERVER"); if (server == null) { server = "http:// *** PUT THE NAME OF YOUR SERVER HERE ***:4444/wd/hub"; } // Remote testing driver = new RemoteWebDriver(new Uri(server), DesiredCapabilities.Firefox()); } [TearDown] public void TeardownTest() { try { driver.Quit(); } catch (Exception) { // Ignore errors if unable to close the browser } } [Test] public void FirstSeleniumTest() { driver.Navigate().GoToUrl("http://www.google.com/"); IWebElement query = driver.FindElement(By.Name("q")); query.SendKeys("a test"); Assert.AreEqual(driver.Title, "Google"); } [Test] public void MySecondSeleniumTest() { // Navigate to google driver.Navigate().GoToUrl("http://www.google.com/"); IWebElement query = driver.FindElement(By.Name("q")); // Write a query into the window query.SendKeys("a test"); // wait at maximum ten seconds for results to display var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); IWebElement myDynamicElement = wait.Until< IWebElement >((d) => { return d.FindElement(By.Id("ires")); }); // take a screenshot of the result for visual verification var fileName = TestContext.CurrentContext.Test.Name + "-" + string.Format("{0:yyyyMMddHHmmss}", DateTime.Now) + ".png"; driver.GetScreenshot().SaveAsFile(fileName, System.Drawing.Imaging.ImageFormat.Png); // perform an code assertion Assert.AreEqual(driver.Title, "Google"); } } } </pre> <p> </p> <p><br /> Build, and run the test.<br /> <br /> In this example we added an additional test to perform a google search, wait at maximum 10 seconds for results to display, take a screenshot (stored it to disk), and perform an NUnit assertion. The screenshot output from the test can be made available as an artifact within Continua!<br /> <br /> Firstly lets commit our changes; "hg commit -m "added a more advanced test""<br /> <br /> Open the configuration in Continua CI (clicking the pencil icon)<br /> Navigate to the stages section<br /> Double click on the stage name (which will bring up the edit stage Dialogue box)<br /> Click on the Workspace rules tab<br /> Add the following line to the bottom of the text area: "/ < $Source.test_repo$/tests/bin/Release/**.png". This will tell Continua to return any .png files that we produced from this test back to the ContinuaCI Server.<br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-25.png" /><br /> <br /> Click on the artifacts tab.<br /> Add the following line : **.png" This will enable any .png files within the workspace to be picked up and displayed within the Artifacts tab.<br /> **.png<br /> <img alt="name project" src="/blogimages/peter/create-project-26.png" /><br /> <br /> Click save<br /> Click Save & Complete Wizard<br /> Start a new build<br /> <br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-14.png" /><br /> <br /> Sweet! A screenshot of our test was produced, and can be seen within the Artifacts tab!<br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-27.png" /><br /> Clicking on 'View' will display the image:<br /> <br /> <img alt="name project" src="/blogimages/peter/create-project-28.png" /><br /> <br /> <span>We have put the sourcecode of this article up on</span><a href="https://github.com/VSoftTechnologies/Automated-UI-Testing">Github</a><span>.</span><br /> <br /> Please subscribe and comment! We are very excited to see what you guys come up with on Continua, happy testing!</p> <p> </p> <h4>Some additional considerations:</h4> <ul> <li>The user which the Selenium service runs under should have correct privileges</li> <li>The machine designated as the Selenium server may require access to the internet if your webapp has upstream dependencies (eg third party API's like github)</li> </ul> 709Seeking FinalBuilder experts available for contractinghttps://www.finalbuilder.com/resources/blogs/postid/685/seeking-finalbuilder-experts-available-for-contraGeneralSun, 07 Dec 2008 03:00:00 GMT<p><span class="DNNAligncenter" id="dnn_ctr365_ContentPane">Kirk Marple, the Chief Software Architect at RadiantGrid Technologies, contacted me recently to find a contractor to help set up </span><span class="DNNAligncenter" id="dnn_ctr365_ContentPane">RadiantGrid's</span><span class="DNNAligncenter" id="dnn_ctr365_ContentPane"> build process. If you're a FinalBuilder expert and available in Janurary 2009 why not contact Kirk?</span></p> <p>You can learn more about the position in Kirk's forum post <a href="https://forums.finalbuilder.com/t/job-looking-to-bootstrap-our-fb-build-process-vs-net-sourcegear-vault/1050">here</a>.</p> <p><span class="DNNAligncenter" id="dnn_ctr365_ContentPane">If you aren't available in January, but are a FinalBuilder professional who would like to offer your skills in future, </span>please also <a href="/company/contact">contact us</a> so we can keep you up to date when positions like these become available. <img alt="" src="/Providers/HtmlEditorProviders/Fck/FCKeditor/editor/images/smiley/msn/regular_smile.gif" /></p> 685We're looking for a sales and marketing personhttps://www.finalbuilder.com/resources/blogs/postid/596/were-looking-for-a-sales-and-marketing-personGeneralWed, 21 Feb 2007 03:00:00 GMT<p><br /> The job market (well, at least in Canberra and Australia) is generally pretty, ummm... tight.  Good for people looking for jobs, but we're finding it hard to find a sales and marketing person.  Please pass this on if you know anyone that might be interested - <a href="/company/careers">https://www.finalbuilder.com/company/careers</a></p> 596Simplicity ain't so simplehttps://www.finalbuilder.com/resources/blogs/postid/591/simplicity-aint-so-simpleGeneralMon, 18 Dec 2006 03:00:00 GMTI've been reading Nick Bradbury's series of posts about simplicity vs. features.&nbsp; Definitely worth a read, here's the links:<br /> <br /> <a href="http://nick.typepad.com/blog/2006/12/simplicity_aint.html">Simplicity Ain't So Simple, Part I: Decide What to Hide</a><br /> <a href="http://nick.typepad.com/blog/2006/12/simplicity_aint_1.html">Simplicity Ain't So Simple, Part II: Stop Showing Off</a><br /> <a href="http://nick.typepad.com/blog/2006/12/simplicity_aint_2.html">Simplicity Ain't So Simple, Part III: Don't Add Features You Can't Support</a><br /> <a href="http://nick.typepad.com/blog/2006/12/simplicity_aint_3.html">Simplicity Ain't So Simple, Part IV: The Blessed Curse of Power Users</a><br /> <a href="http://nick.typepad.com/blog/2006/12/simplicity_aint_4.html">Simplicity Ain't So Simple, Part V: Combine Features</a><br /> <a href="http://nick.typepad.com/blog/2006/12/simplicity_aint_5.html">Simplicity Ain't So Simple, Part VI: Simple = Secure</a><br /> <a href="http://nick.typepad.com/blog/2006/12/simplicity_aint_6.html">Simplicity Ain't So Simple, Part VII: Know When to Stop</a><br /> <br /> So... you've just read all of them I hope?&nbsp; Good.&nbsp; Here's some of my comments in relation to FinalBuilder and Automise :)<br /> <br /> Firstly, I reckon it's a great series of posts - definitely some great advice in there to stop featuritis creeping in... which bring me to FinalBuilder and Automise...&nbsp; FB and AT have so many features that we loose track of them ourselves.&nbsp; I'm not joking either.&nbsp; And I don't know whether we should be ashamed or proud... (probably ashamed after reading that above post).&nbsp; Sometimes a user will ask "can I do X?" and we have to ask around if anyone knows if we've implemented that or not...&nbsp; But, more features can make a wider audience of users satisfied.<br /> <br /> It's a fine line of course.&nbsp; You need to put features in to keep people happy, but you must present them so they don't get in the way during day-to-day use.&nbsp; It's also interesting to note that FinalBuilder has gone through a long growing phase of about 6 years with a huge amount of features added each release.&nbsp; We take a lot of suggestions (and opinions) from our users, and will generally add a new feature or option as opposed to not adding it in for the sake of simplicity.&nbsp; But, we tend to be quite careful of where we add the option, and to make it obvious from the icon or wording or placement of what the option is for.&nbsp; Plus we think hard about the default behaviour.<br /> <br /> One interesting example that we added in for FinalBuilder 4 is a Build Summary screen.&nbsp; It's implemented as a tab which changes the main view from the "Design and Debugging" of your project into a view designed to show overall progress.&nbsp; It was a major new feature for FB4, and it has some advantages over the old way of watching a build.&nbsp; But, we knew a lot of existing customers would hate it.&nbsp; The default behaviour is that the IDE will automatically switch to the Build Summary screen when a build starts.&nbsp; <br /> <br /> These are the options we added to make everyone happy:<br /> <br /> A set of radio buttons (only one option can be chosen, top one is the default):<br /> <ul> <li>Always show build summary (Run, Run from Current, Run Selected, etc)</li> <li>Only show build summary on Run</li> <li>Show Build Summary when build completes</li> <li>Never show build summary</li> </ul> And some checkboxes (either, both or none can be turned on):<br /> <ul> <li>Always show build summary if auto build</li> <li>Show build summary on startup</li> </ul> So, quite a lot of options, and you have to access them via the Tools menu | Options | FinalBuilder category | General IDE Options | Runtime Options tab.&nbsp; Pretty hidden away - maybe we'll get a tick for that :)&nbsp; But self explanatory - it's unlikely you need to read the help file to understand what those options are going to do.<br /> <br /> Another interesting graph I came across a few weeks ago is the <a href="http://headrush.typepad.com/creating_passionate_users/2005/06/featuritis_vs_t.html">Featuritis vs. the Happy User Peak graph</a>.&nbsp; Somebody mentioned that they thought FinalBuilder was on the top - thanks for that!&nbsp; But, the perception of a product is different for every person.&nbsp; FinalBuilder is the type of product where there will *always* be users who need more (eg. please support completely unknown product X - our forums are full of people asking for new features EVERY DAY), whereas other people get lost in the sea of configuration options. <br /> <br /> If I was to choose an application with too few options or too many, I reckon I'd choose the one with too many (most of the time)!<br /> <br />591What we drink...https://www.finalbuilder.com/resources/blogs/postid/570/what-we-drinkGeneralThu, 28 Sep 2006 04:00:00 GMT<p>A couple of weeks ago we got a small bar fridge for the office... and it's stocked with a variety of drinks (non-alcoholic unfortunately...).  And what do you do with empties before you recycle them? Well, you build a pyramid, right?<br /> <img alt="FinalBuilderDrinkingHabits" border="0" height="453" src="/blogimages/FinalBuilderDrinkingHabits.jpg" width="244" /><br /> <br /> I'm responsible for the Lemonade and some of the Solo<br /> Vincent drinks Solo and some Coke<br /> Angus goes for Coke and sometimes Solo<br /> And Paul drinks Diet Coke<br /> <br /> Anyway, it's time to recycle now, and begin the rebuild ;)</p> 570FinalBuilder Ratingshttps://www.finalbuilder.com/resources/blogs/postid/565/finalbuilder-ratingsFinalBuilder,GeneralTue, 19 Sep 2006 19:00:00 GMT<p>Here's the next installment of some of the statistics we got from the customer survey.<br /> <br /> <img border="1" src="/blogimages/FinalBuilder_Overall_Rating.png" /><br /> <br /> <img border="1" src="/blogimages/FinalBuilder_Stability_Rating.png" /><br /> <br /> <img border="1" src="/blogimages/FinalBuilder_Support_Rating.png" /><br /> <br /> <img border="1" src="/blogimages/FinalBuilder_HelpFiles_Rating.png" /><br /> <br /> <img border="1" src="/blogimages/FinalBuilder_Website_Rating.png" /><br /> <br /> There you have it.  We're very happy with the rating people have given us, and it's an improvement on last year.  And obviously our customers are pretty happy with FinalBuilder - that's the main thing!  The website rating has improved a lot over last years results, so the choice to go with <a href="http://www.dotnetnuke.com/">DotNetNuke</a> has been a good one.<br /> <br /> So, where to from here?<br /> <br /> Well, the worst of the ratings was the Help files and other Documentation.  This has always been the worst part of FinalBuilder (and we have always freely admitted this), mainly because the documentation is written by us (the programmers) and not dedicated technical writers.  I am pleased to say though, that we are taking the documentation a lot more seriously now.  For example, we have recently generated a report on which actions don't have a quick help file or a help topic and after a few weeks work every action now has a help topic and a quick help file.  Plus we're more conscious of writing better quality help and we make sure that an action is properly documented before it's released to the public.<br /> <br /> Other than that, we obviously want more dark green (excellent) than light green (good and average) - it's hard work making people happy with a product, but that's our ultimate goal.  <a href="/finalbuilder">FinalBuilder</a> certainly isn't one of those products that you write and let it rot while a new product is being developed.  Our todo list seems to get longer every day instead of shorter.  The next major version is in the pipeline with some very cool new features.  Stay tuned :)</p> 565Stardock's 10 rules for successhttps://www.finalbuilder.com/resources/blogs/postid/402/stardocks-10-rules-for-successGeneralWed, 03 May 2006 19:00:00 GMTBrad Wardell's 10 rules for success... a very interesting read. <br /> <span class="Normal"><br /> <a href="http://draginol.joeuser.com/articles.asp?c=1&amp;AID=114319">http://draginol.joeuser.com/articles.asp?c=1&amp;AID=114319</a><br /> <br /> I'd like to think that we live up to most if not all of those rules, it's certainly something worth aspiring to.<br /> <br /> v.<br /> </span>402New aggregate RSS feedhttps://www.finalbuilder.com/resources/blogs/postid/418/new-aggregate-rss-feedGeneralTue, 18 Apr 2006 14:00:00 GMTHere's our new VSoft Technologies aggregate RSS feed:<br /> <a href="http://www.vsoft-tech.com.au/blogs.aspx?rssid=0">http://www.vsoft-tech.com.au/blogs.aspx?rssid=0</a>418New website, new blogshttps://www.finalbuilder.com/resources/blogs/postid/540/new-website-new-blogsGeneralThu, 13 Apr 2006 16:59:00 GMT<p>New website, check it out: <a href="https://www.finalbuilder.com/">https://www.finalbuilder.com/</a></p> <p>Based on <a href="http://www.dotnetnuke.com/">DotNetNuke</a> - some pretty awesome things you can get happening with DNN, not perfect, but overall the experience has been quite good.</p> <p> </p> <p>And our blogs have moved too... here's the new links:</p> <p>www: <a href="https://www.finalbuilder.com/resources/blogs">https://www.finalbuilder.com/resources/blogs</a></p> 540FinalBuilder blogs have moved.https://www.finalbuilder.com/resources/blogs/postid/419/finalbuilder-blogs-have-movedGeneralMon, 03 Apr 2006 14:00:00 GMTOur blogs have moved.&nbsp; Please update your reader.<br /> <br /> We have just converted our entire website over to <a href="http://www.dotnetnuke.com/">DotNetNuke</a>, and with it&nbsp;our blogs.&nbsp; The old .Text based blog will continue to be available for now, but new content will only appear here.419