Skip to main content

How my team should access Azure DevOps

I think that the functionality offered by Azure DevOps and how easily it can be configured and used change the way how we build our cloud environments and our solutions. 
The number of projects and companies that are starting to use is higher and higher each day. This is an excellent thing because Azure DevOps allows us to redefine how we build and deploy our solutions and environments. 

Azure DevOps and Visual Studio Benefits
The licensing model for users that can access Azure DevOps seems simple but created a lot of confusion, especially when large organizations start to spin-up projects inside Azure DevOps very fast. It is interesting that during the adoption of Azure DevOps, the number of Visual Studio license requests by the teams grow 3 or 4 times more than the previous year. 
One of the causes could be the Visual Studio benefits package, from which Azure DevOps is part of. The benefit package of a Visual Studio license includes access to one or multiple services that are under Azure DevOps offer (e.g., Azure Boards, Repos, Test Plans and so on), as you can see below.
Initially, you might say that this is a great thing until you review the monthly cost per user of a Visual Studio subscription and the number of users that requested a Visual Studio Subscription. 

The impact 
Let's assume that you are working on an Azure project. You have a team of 12 people, from which 4 of them are developers.
It means that the forecast of the VS subscription is 4 per each month. Once you start to use Azure DevOps, the trend is that each person from the team to request access to VS to be able to access Azure DevOps project. 
You jump from 4 to 12 monthly subscriptions. The standard price is $45 for Visual Studio Professional and $250 for Visual Studio Enterprise. If you multiple this with 100 teams, then the monthly impact is high. 
As we can see, the impact of using Azure DevOps inside the organization is almost half a million dollars per year in Visual Studio subscriptions. 

Wait...
At this moment in time, you might ask yourself if this is the only way how you can get access to Azure DevOps. The response is NO.
Visual Studio subscriptions provide as benefit the access to Azure DevOps besides other benefits. Additional to this, you can buy multiple types of user licenses for the user to access Azure DevOps. 

Why this happens?
Initially, the access was provided based on the Visual Studio subscription. People tend to request access to a service in the same way as the others from the team. Because of this, everybody started to use the Visual Studio subscription to get access to Azure DevOps.  
Because the costs are not visible directly at the project level, there will be a latency until this kind of decision is notified. 

Rework
First of all, we need to understand how users can get access to Azure DevOps. 
(1) Basic Plan user license costs $6/month and provides access to Pipelines, Board, Repos, Artifacts and the ability to run some load tests. 
(2) Basic + Test Plan user license enables the user to run and manage the test plans and it is more expensive ($52/month)
(3) Visual Studio subscription that includes the Basic Plan of Azure DevOps
Additional to this:
(4) First 5 users on an Azure DevOps project have the Basic Plan for free
(5) Stakeholders have free access with some limitations on what they can do inside Azure DevOps. They have the ability to access the board, search for items and view them

Now, that we saw what is the user access model of Azure DevOps, and assuming that there are no needs for test plans, we can do the recalculation of cost per team
(1) Dev 1 - Visual Studio Subscription ($45)
(2) Dev 2 - Visual Studio Subscription ($45)
(3) Dev 3 - Visual Studio Subscription ($45)
(4) Dev 4 - Visual Studio Subscription ($45)
(5) BA - Azure DevOps Basic Plan (1 FREE license)
(6) UX - Azure DevOps Basic Plan (2 FREE license)
(7) UX - Azure DevOps Basic Plan (3 FREE license)
(8) DevOps - Azure DevOps Basic Plan (4 FREE license) | use Visual Studio Code
(8) QA - Azure DevOps Basic Plan (5 FREE license)
(9) QA - Azure DevOps Basic Plan ($6)
(10) PM - Azure DevOps Basic Plan ($6)
(11) Scrum Master - Azure DevOps Basic Plan ($6)
(12) Legacy Support - Azure DevOps Basic Plan ($6)

The total cost per month using the right Azure DevOps user plan is $204/month. The price is more than 50% less than it was initially. There is no magic behind it, just using the right license type.
The monthly cost of users that are accessing Azure DevOps using the User Plans goes inside the monthly fee of Azure Subscription attached to your project. In comparison, the cost of Visual Studio Subscriptions goes in another bucket and are billed differently. 

Tips and Tricks
  • You pay the monthly user access to Azure DevOps even for users that don't access it you provided them a license
  • You can give access to users from other organizations, but the cost of the license will be charged from your subscription. There is no mechanism to move the cost the another organization
  • The monthly Azure credits of a VS subscription cannot be used to buy Azure DevOps credit for user access
  • Azure DevOps is billed all the time thought Azure Subscription, which is mandatory to created before creating an Azure DevOps project. 

Comments

Popular posts from this blog

ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded

Today blog post will be started with the following error when running DB tests on the CI machine:
threw exception: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information. at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName) This error happened only on the Continuous Integration machine. On the devs machines, everything has fine. The classic problem – on my machine it’s working. The CI has the following configuration:

TeamCity.NET 4.51EF 6.0.2VS2013
It seems that there …

Entity Framework (EF) TransactionScope vs Database.BeginTransaction

In today blog post we will talk a little about a new feature that is available on EF6+ related to Transactions.
Until now, when we had to use transaction we used ‘TransactionScope’. It works great and I would say that is something that is now in our blood.
using (var scope = new TransactionScope(TransactionScopeOption.Required)) { using (SqlConnection conn = new SqlConnection("...")) { conn.Open(); SqlCommand sqlCommand = new SqlCommand(); sqlCommand.Connection = conn; sqlCommand.CommandText = ... sqlCommand.ExecuteNonQuery(); ... } scope.Complete(); } Starting with EF6.0 we have a new way to work with transactions. The new approach is based on Database.BeginTransaction(), Database.Rollback(), Database.Commit(). Yes, no more TransactionScope.
In the followi…

GET call of REST API that contains '/'-slash character in the value of a parameter

Let’s assume that we have the following scenario: I have a public HTTP endpoint and I need to post some content using GET command. One of the parameters contains special characters like “\” and “/”. If the endpoint is an ApiController than you may have problems if you encode the parameter using the http encoder.
using (var httpClient = new HttpClient()) { httpClient.BaseAddress = baseUrl; Task<HttpResponseMessage> response = httpClient.GetAsync(string.Format("api/foo/{0}", "qwert/qwerqwer"))); response.Wait(); response.Result.EnsureSuccessStatusCode(); } One possible solution would be to encode the query parameter using UrlTokenEncode method of HttpServerUtility class and GetBytes method ofUTF8. In this way you would get the array of bytes of the parameter and encode them as a url token.
The following code show to you how you could write the encode and decode methods.
publ…