Monday, March 25, 2019

Speaking at Louisville .NET meetup,remotely speak and presenting Best practice of .NET Core CI/CD on Azure DevOps

Hi my blog audiences! Oh boy, another speaking time!

In February, I had speaking arrangements with Louisville .NET meetup, and Chad Green, the meetup's owner. Since December 2018, he had announced opportunity to speak for his meetup.

This is the Louisville .NET meetup page on

I'm honored, and at the same time feel so privileged to speak for his meetup, particularly knowing that English is not my first language. The topic I presented was about "Best practices of .NET Core 2.1 CI/CD using Azure DevOps".

This is the landing page of the event:

In this context, I focused on Azure DevOps Service. Yes, Azure DevOps Service is a rebrand from VSTS (also known before as Visual Studio Online).

NOTE: For those who wonders, the on-premise TFS will be named as Azure DevOps Server, and it will be released under the name of Azure DevOps Server 2019.

Thanks to Chad, he agreed to use Skype to speak and present for them (by sharing my desktop screen).

Here is the audience at that time (taken from my desktop screen: (on Skype)

The presentation

I had prepared the material and the talk before, including a github repo (link below) to specifically contain the presentation, the sample and demo.

The best practices for .NET Core 2.1 CI/CD are mostly concluded into these 3 main ideas (and also topics):

  1. Build and test locally first, without Visual Studio 2017 at all. It is recommended to use command prompt. Then use the knowledge and experience later to create CI on Azure DevOps
  2. Prepare and Implement Azure DevOps CI/CD.
  3. DOs and DON'Ts of Azure DevOps CI/CD 

The first topic is important, because Visual Studio 2017 always hides all of the mechanics that happened when you compile a solution. It is using MSBUILD, but the actual running sequence is always this:

  1. Restore and resolve all nuget packages using the .NET TFM information. For example: .NET Core 2.1 TFM is "netcoreapp2.1". The restore and resolve done at each project. The way nuget execute is closely related to the MSBUILD version used AND the VS 2017 used.
  2. Compile the projects in the solution, and check with resolved nuget packages
  3. If the RID specified, then "dotnet build" will tell MSBUILD to generate the necessary RID as well. Often, RID is liked with the OS used as target runtime OS.

Point #1 is important, because Nuget-MSBUILD-.NETCoreSDK-VS2017 usually has linked "train release" toolchain that we can't ignore.

For example:

Also getting used to know TFM is important, because .NET Core SDK project is editable from Visual Studio, and many tutorials from Microsoft shown these.

For more information on list of .NET Core TFM, please visit this official documentation:

By default, "dotnet build"  always use the latest SDK to compile. This will cause problem if you have many versions of .NET Core 2.1 SDK on your machine! The reason is quite trivial: the compilation and the assembly resolution will be different with your targeted TFM.

The way to minimize this is using "global.json" file that contains the .NET Core SDK you want to use, and put this on the solution folder.

For example:

  "sdk": {
    "version": "2.1.503"

For more information on global.json syntax and usage, visit this official documentation:

For more on my presentation, visit my repo of dotnetcore CI/CD sample:

Get the code

In my own Azure DevOps account, I have setup a sample CI to be shown as public, so the audience can follow my demo and presentation later.

The Azure Pipelines builds log for this meetup is available at:

So? Fork my repo and start doing DevOps now! :)

Friday, February 22, 2019

Speaking and organizing Azure DevOps Launch Jakarta on February 18, 2019

Hi guys! New year of 2019, and also new speaking engagements Smile
This 18th February 2019, I not just delivered speaking, but also organized the event of Azure DevOps Launch Jakarta. In Indonesia, we have 2 separate same events but in different cities, one in Yogyakarta that came before the Jakarta event.
It is the same, because the theme of the event is the same, initially organized by Microsoft on 2018 on September, including the recorded video sessions:
The main theme of this event is 75% to 90% technical, and less emphasize on marketing product. Yes, the event is targeted to more for technical and management that have concerns on DevOps.
The Jakarta event is organized by MUGI Jadetabek, chaired by me with the help from the crew members, Leo, Hendra, and others.
Thanks to Microsoft Indonesia, they had provided the venue and also other necessary support such as wifi. Logistic was provided by Microsoft directly, with the help of Microsoft Asia people such as Annie Matthew and Sarah Thiam.
Big thanks to local Microsoft Indonesia and Microsoft!
The event announcement is on MUGI’s page:
Here is the registration link:

The speakers were many, thanks to Microsoft especially Ashwani, my MUGI Jadetabek crew, and also special thanks to Riza Marhaban, Singaporean MVP and DevOps-ID with Made Mulia Indrajaya as speakers!
These are the speaking materials:
  1. DevOps at Microsoft (Ashwani)
  2. Adopting DevOps as culture using Azure DevOps and Azure (Eriawan Kusumawardhono, me)
  3. Journey from Monolithic to Modern application using Containers, Serverless and achieve the CI/CD using Azure DevOps (Riza Marhaban)
  4. DevOps monitoring (Leonardo Irawan and Hendra Pratama)
  5. Optimize DevOps in your organizations (Made Mulia)
Here are the pictures:

Starting from me deliver the opening and general overview of DevOps:

And here are the speaking sessions photos!

We have Ashwani:

And me speaking:

Here are the lunch break photos:

Here is Riza Marhaban:

Leo and Hendra, hardcore duo to deliver DevOps monitoring:

And here are Made Mulia's session:

And last but not least, here all of the speakers, MUGI crews, and the audiences had photo session:

Saturday, December 22, 2018

[ADVENT 2018] Current state of F# 4.x tooling and IDE ecosystem on December 2017

Hi my dear blog readers!

First of all, happy holidays! Now I’m back to joining Sergey Tihon’s  F# advent blog 2018 gathering! Smile

My past 2017 advent blog is available here:

In this blog entry, I bring you the states of F# news and updates in two major subtopics: the tooling ecosystem, and the community surroundings.

F# state in December 2018

A lot has happened in 2018, particularly the progress that has been made from Microsoft, F# communities, and the whole cool participations on F# github repo.

To increase clarity, let’s start discussing F# tooling ecosystem.

F# tooling ecosystem updates

The F# tooling is basically evolved since 2005 (as research project before integrated in Visual Studio) into these components:

  1. F# Language Specification
  2. F# Compiler
  3. F# Core libraries
  4. F# Compiler Services (since 2013)

Note that although F# Compiler Services derives from F# Compiler, the F# Compiler Services is very important. Because it brings parity with Roslyn as compiler service. It is also a good sample of having the compiler created with the language you want to compile.

Thanks to its flexibility and power, F# Compiler Services can be used as true component, and it is suitable to be used as language services.

Ionide use F# Compiler Services heavily to provide F# support in Visual Studio Code, and it enjoys many features available in Visual Studio.

Now in Visual Studio 2017 from 15.6, these are the noteworthy F# updates:

  1. Versioning model has been changed to decouple from Visual Studio version releases. This brings F# tooling more freedom and flexibility to progress further, although F# tooling is closely related to a VS release, as described in this RFC of F# versioning plan on GitHub. A follow up article by Phillip Carter brings more detail that VS 2017 15.7.x has F# 4.4, and 15.8.x has F# 4.5, like the captured table below. Note: there will be no 4.2, 4.3 version, it will be version 4.5 or later.
  2. Related to previous point, VS 2017 15.7 will have F# 4.5. And this version will be the same version as F# Compiler Service related iteration.
  3. F# supports the same semantic of ValueTuple as Struct tuple (since 15.6). This brings closer compatibility with the .NET class library of ValueTuple in .NET Framework 4.7.
  4. F# supports full file ordering for .NET Core 2.0 or later project (since 15.6)
  5. Realtime multi TFM targeting (a.k.a. multi targeting in .NET team blog, since 15.6). This brings unique experience compared to other language tooling such as C#/VB, because C#/VB doesn’t have this yet!
  6. Go to definition from the member tooltip (since 15.6)
  7. Removal of dependency to Windows 10 SDK (since 15.6). This brings less size and leaner requirement to have F# development.
  8. ..and many more in 15.6! For more detail, please visit this official blog post:

This is the versioning illustration:


This is nicely documented as RFC in F# Language Design repo in

In 15.7, F# tooling keeps updated too. These are the noticeable updates:

  1. New F# template for ASP.NET Core 2.0 project! This is a very amazing progress since 15.5, because now we could create ASP.NET Core using F# Open-mouthed smile
  2. Enabled generating F# AssemblyInfo from properties with the F# compiler in the .NET SDK. This is not trivial but it is closer to C#/VB feature to support common AssemblyInfo infrastructure that common in C#/VB project.

A quick hands-on sample to use F# new ASP.NET Core template is by executing “dotnet new web –lang f#” like this illustration: (I run against .NET Core 3.0 Preview 1)


Now let’s see what’s inside this folder:


Looking at the content of Program.fs, we now see that we have the same quick start from C# template:


This code implies that we use Kestrel by default.

To be maximally applicable to use F# with ASP.NET Core, I recommend to use Visual Studio Code 1.28 with the updated Ionide.

Now, the other wonderful things happened since July 2018 are the updates from communities!

Bonus fun fact of Microsoft F# repo: it uses Azure DevOps since June as the main CIs!


F# community tooling update

These are the best updates from community so far:

  1. Paket now supports .NET Core 2.2 and .NET Core 3.0 as one of its TFM support since 5.181.0.
  2. Fable is reaching version 2.1, and it has tons of bug fixes

That’s it folks!!

Happy holiday and Merry Christmas!

Saturday, December 15, 2018

Speaking at DevOps ID event on Shopee, presenting DevOps culture adaptation and quick demo of Azure DevOps

Yes, another speaking opportunities in the last month of 2018! The date was 13th December, 2018.

In this event, I was invited by Hananto, leader of DevOps Indonesia community (also commonly called DevOps-ID). This is the first time I was asked to participate to speak for community beyond or outside my own community!

Therefore, I feel grateful and many thanks to Hananto for this opportunity! Of course, I always welcome for invitations from other community, not just from my own such as MUGI and Lambda Jakarta.

The host, Shopee, has nice arrangements of materials and speakers, not just me. I am glad that I could see one of their engineer presenting the experiences on optimizing internal’s Shopee apps, with basic telemetry and logging.

I bring the topic of having gentle intro on DevOps, not just as concept but also a culture.

It is common in Indonesia that most companies see DevOps as a dedicated team that oversees both Development (Dev) and Operations (Ops), without actually trying to ensure collaborations and interactions between those two. Therefore, frictions are often seen later instead of continuous communication and collaboration.

I also gave quick intros on how easy Azure DevOps to use with Azure using free basic app services, so dev and ops can have the same streamline experience on how basic cycle of DevOps can be simplified but still applicable on both Dev and Ops department.

Here’s the pictorials from the event:

And this is me, delivering the presentation:

And demo time using Azure DevOps project on Azure!

Then we have fun wrapping up and photo session:

Thanks to DevOps ID community and Shopee, of course!

My slide deck is available here:!Ak-RlH5R7H66hrZEY8kd9mrGkIVobA