Márcio Azevedo

Knowledge is Power!


A few weeks ago I’ve had the opportunity to explore a little bit more Medium, a new kind of social network where you get the opportunity to exposed your ideas, thoughts and promote discussions around them.

It’s actually amazing to see that, despite all the social networks that already exist, there’s always room for more options, more innovation and and more sharing.

Today I’ve found the The Stack That Helped Medium Drive 2.6 Millennia of Reading Time really interesting.

Automating release notes with Git, TFS, Build vNext and Octopus Deploy

These days, it’s quite easy to have a fully automated continuous integration and deployment process. If you’re developing in the .NET stack, things like TFS Build vNext, NuGet feeds and Octopus Deploy make the automation process even easier, and for the common cases, it doesn’t require any custom development – just proper tool configuration, it fits really well!

But, when it comes to release notes, the scenario is a little bit different. Producing release notes for each product increment is not an easy task, the more you depend on manual processes, more exposed to human errors you will be, not to mention the inefficiency of all the process. Therefore the challenges are:

  • How can we produce releases notes in an automated and accurate way with minimal impact in the development process?
  • How can we established a relation between a deployed version and the release notes of that same version?


Here, at Celfinet, we’re developing a Network Configuration Management product for several customers, which, in most cases, it imply having to deal with different versions for different customers.

It’s hard to ensure that the latest stable version is deployed to all of our customers at the same time and even harder to keep track of the release notes. We needed to find out a solution that fitted our needs and took advantage of the tools for the several scenarios:

  • Getting the release notes from a known release number
  • Getting the release notes from a known build number
  • Compare releases and get the additional release notes


So, basically, the solution was establishing a relation between Release number, Build number, Deployment package number and the Product Features / Bug Fixes (and, if we needed, even the source code changes between releases).

Knowing a Release number, we were able to determine the build number, and knowing the build number we could track to the source code committed changes and associated work items (Features, Backlog Items, Bugs, etc).

Release workflow (with help from https://www.gliffy.com)


With this relation between all elements, it’s possible (and easy) to create the right tools to automate the release notes process. It all starts with a feature properly specified and ready to be implemented:

TFS Features

TFS Features

Once the implementation has started, all commits can be linked to that Feature (or any other Work Item such as Product Backlog Item, Bug, etc) – as long as the developer uses the hashtag followed by the id of the Work Item.

TFS Git commit

TFS Git commit

With the Build process triggered by every commit (Continuous Integration), every successful build provides the necessary information between features (or any other work items), source code changes / commits and build number:

TFS Build vNext succeeded

TFS Build vNext succeeded

TFS Build vNext allows full integration with Octopus Deploy, which enables having a step process that triggers the creation of a new release and respective deployment to an environment (or more). By default, this step process adds to the Octopus Deploy Release release notes, a link to the build process that triggered the deploy.

Octopus Deploy Release

Octopus Deploy Release

This way it’s possible, using Octopus Deploy API, to get the relation between an Octopus Deploy Release and the Build Number.

Additional Setup / Code Samples

As mentioned before, having a step process that triggers the creation of a new release is something that you can already benefit because it’s available for the TFS Build vNext process. This step allows you to include, not only the link to the build number, but also the change set comments and related work items:

Octopus Deploy Step

At this point, you can use the API to automate the missing steps and / or built your own release note tools. Here’s a code sample to get the release notes of a specific release version (via Octopus Deploy API):

public string GetReleaseNotesByReleaseVersion(string releaseVersion)
    // Note: It requires Nuget Package https://www.nuget.org/packages/Octopus.Client/.
    // https://github.com/OctopusDeploy/OctopusDeploy-Api/wiki/Releases
    // GET ~/api/projects/{id}/releases{/version}{?skip}

    var endpoint = new OctopusServerEndpoint("Octopus Server Url", "Api Key");
    var octopusRepository = new OctopusRepository(endpoint);
    var release = octopusRepository.Releases.FindOne(resource => resource.Version.Equals(releaseVersion));
    return release.ReleaseNotes;

Regarding Team Foundation Server there’s also available a TFS API (and related TFS API docs) that provides a (programmatic) way of getting the needed information. So, basically, all the relations that I’ve showed before between Product Features and Release Notes are likely to be automated according to your needs (and rules).


With the right process, release notes automation can be done in an effective way, with low impact in the team’s daily tasks and, above all, allowing the team to focus on what really matters: Adding Product Value in an incremented way!

Ten “Laws of the Physics of the People”

Ten “Laws of the Physics of the People” that applies to software development. Very interesting article and important lessons to have in mind.

Amdahl to Zipf: Ten Laws of the Physics of People

Technology Radar November 2015

I’m a big fan of Thought Works and its Technology Radar which is already available (November 2015). It’s important to have a perspective of someone who have already experienced the Tools, Technologies, Frameworks, Languages, etc, before starting to using it in a project.

Five Lessons From Ten Years Of IT Failures.

With the increase of IT projects it seems natural that unsuccessful results from past projects should translate into lessons learned and successful results in the future projects. At this point, it was expected to have a clear evolution with increasing success, but seems that we’re going the other way. Here’s the retrospective:

Five Lessons From Ten Years Of IT Failures

Having doubts about your Career options as a Software Engineer?!

Great talk about some Career options for early Software Engineers / Developers, and the importance of choosing something that you really like to do:

Where Next? Building a Career as a Technologist



There’s a time when we think we can do everything, without limits, embrace all projects, any tasks or challenges, but then, there’s family, friends, typical job issues and we realise that 24 hours isn’t enough. At that point, that’s when you realise the importance of choosing properly which tasks to accomplish – prioritisation, and you starting focusing on the (right) goals and how to achieve them.

That’s productivity!

Human motivation

One of the best motivations humans can have is getting a no! Specially if there’s a big reward accomplishing the task.

GM exec disses the Apple car.

“Developers don’t have to be full-stack but teams should be.”

“One common way I’ve seen this layering lead organizations astray is the AntiPattern of separating development teams by these layers. This looks appealing because front-end and back-end development require different frameworks (or even languages) making it easy for developers to specialize in one or the other. Putting those people with common skills together supports skill sharing and allows the organization to treat the team as a provider of a single, well-delineated type of work. In the same way, putting all the database specialists together fits in with the common centralization of databases and schemas. But the rich interplay between these layers necessitates frequent swapping between them. This isn’t too hard when you have specialists in the same team who can casually collaborate, but team boundaries add considerable friction, as well as reducing an individual’s motivation to develop the important cross-layer understanding of a system. Worse, separating the layers into teams adds distance between developers and users. Developers don’t have to be full-stack (although that is laudable) but teams should be.
in http://martinfowler.com/bliki/PresentationDomainDataLayering.html

TFS Build failed using Git.

Setting up a new Build process using Git in TFS it’s easy but you can face some initial problems, specially if you have been using TFVC.

Problems like this:

Continuous Integration Build of branch-master (MyProduct)
Ran for 0 minutes (Default Controller – name), completed at Thu 04/09/2015 06:20 PM

Request Summary

Request 3788 John Doe Completed


Other Errors

1 error(s)
TF215097: An error occurred while initializing a build for build definition \MyProduct\mybranch-master: Exception Message: One or more errors occurred. (type AggregateException) Exception Stack Trace: at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) at Microsoft.TeamFoundation.Build.Client.FileContainerHelper.GetFile(TfsTeamProjectCollection projectCollection, String itemPath, Stream outputStream) at Microsoft.TeamFoundation.Build.Client.FileContainerHelper.GetFileAsString(TfsTeamProjectCollection projectCollection, String itemPath) at Microsoft.TeamFoundation.Build.Client.ProcessTemplate.Download(String sourceGetVersion) at Microsoft.TeamFoundation.Build.Hosting.BuildControllerWorkflowManager.PrepareRequestForBuild(WorkflowManagerActivity activity, IBuildDetail build, WorkflowRequest request, IDictionary`2 dataContext) at Microsoft.TeamFoundation.Build.Hosting.BuildWorkflowManager.TryStartWorkflow(WorkflowRequest request, WorkflowManagerActivity activity, BuildWorkflowInstance& workflowInstance, Exception& error, Boolean& syncLockTaken) Inner Exception Details: Exception Message: VS30063: You are not authorized to access https://tfs.instance-domain. (type VssUnauthorizedException) Exception Stack Trace: at Microsoft.VisualStudio.Services.Common.VssHttpMessageHandler.<SendAsync>d__0.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult() at Microsoft.VisualStudio.Services.WebApi.VssHttpRetryMessageHandler.<SendAsync>d__1.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult() at Microsoft.VisualStudio.Services.WebApi.HttpClientExtensions.<DownloadFileFromTfsAsync>d__2.MoveNext()

Basically you just need to Download the template:

download template

And add the Build Template Process (for Git) to the source code repository branch – click New:

add template

« Older posts

© 2015 Márcio Azevedo