How to make your deployments successful every time
Tags: azure, devops, tutorial, cloud
Published: 2019-05-23 17:24:19

---
title: How to make your deployments successful every time
published: true
description: In this post, I will show you a simple way to look like a boss and make your deployment working all the time.
tags: azure,devops,tutorial,cloud
cover_image: https://thepracticaldev.s3.amazonaws.com/i/ik8ub4klals4jk89qevt.jpg
canonical_url: http://www.frankysnotes.com/2019/05/how-to-make-your-deployment-successful.html
---

You are done with your code and you are ready to deploy it in Azure. You execute the PowerShell or Bash script you have and BOOM! The error message saying that this name is already taken. In this post, I will show you a simple way to look like a boss and make your deployment working all the time.

French version [here](http://www.cloudenfrancais.com/posts/Comment%20faire%20en%20sorte%20que%20vos%20d%C3%A9ploiement%20fonctionne%20%C3%A0%20tout%20coup.html)

> ____ with given name ____ already exists.

The tricks other use
--------------------

You could try to add a digit at the end of the resource name (ex: demo-app1, demo-app2, demo-app123...), but that’s not really professional. You could create a random string and append it to the name. Yes, that will works, once. If you are trying to redeploy your resources that value will change, therefore it will never be the same.

The solution would be to have a unique string that is constant in our environment.

The solution
------------

The solution is to use the function `UniqueString()` part of the Azure Resource Manager (ARM) template. If we look in the [documentation](https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-template-functions-string#uniquestring?WT.mc_id=cloud5mins-youtube-frbouche), UniqueString *creates a deterministic hash string based on the values provided as parameters.*  Let’s see a quick example of an ARM template to deploy a website named `demo-app`.

```json
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {
        "webAppName": "demo-app"
    },
    "resources": [
        {
            "type": "Microsoft.Web/sites",
            "apiVersion": "2015-08-01",
            "name": "[variables('webAppName')]",
            "location": "[resourceGroup().location]",
            "tags": {
                "[concat('hidden-related:', resourceGroup().id, '/providers/Microsoft.Web/serverfarms/frankdemo-plan')]": "Resource",
                "displayName": "[variables('webAppName')]"
            },
            "dependsOn": [
                "Microsoft.Web/serverfarms/frankdemo-plan"
            ],
            "properties": {
                "name": "[variables('webAppName')]",
                "serverFarmId": "[resourceId('Microsoft.Web/serverfarms/', 'frankdemo-plan')]"
            }
        },
        {
            "type": "Microsoft.Web/serverfarms",
            "apiVersion": "2016-09-01",
            "name": "frankdemo-plan",
            "location": "[resourceGroup().location]",
            "sku": {
                "name": "F1",
                "capacity": 1
            },
            "tags": {
                "displayName": "frankdemo-plan"
            },
            "properties": {
                "name": "frankdemo-plan"
            }
        }
    ],
    "outputs": {}
}
```

If you try to deploy this template, you will have an error because the name `demo-app` is already taken... no surprise here.  

Let’s create a new variable `suffix` and we will use the **Resource Group Id** and **Location** as values. Then we just need to append this value to our name using the function `concat()`.

```json
    "variables": {
        "suffix": "[uniqueString(resourceGroup().id, resourceGroup().location)]",
        "webAppName": "[concat('demo-app', variables('suffix'))]"
    }
```

It’s that simple! Now every time you will deploy a unique string will be added to your resource name. That string will always be the same for a Resource Group-Location deployment.

Because some resource types are more restrictive than others you may need adapt your new name. Maybe the name of your resource plus those thirteen characters hash will be too long... No problem, you can easily make it shorter and all lower case just by using `substring()` and `toLower()`.

```json
 "parameters": {},
    "variables": {
        "suffix": "[substring(toLower(uniqueString(resourceGroup().id, resourceGroup().location)),0,5)]",
        "webAppName": "[concat('demo-app', variables('suffix'))]"
    }
```

Voila, and now by using ARM template you can deploy and redeploy without any problem reproducing the same solution you built. To learn move about the ARM template you can jump in the [documentation](https://docs.microsoft.com/en-us/azure/azure-resource-manager/?WT.mc_id=cloud5mins-youtube-frbouche), where you will find samples, step-by-step tutorials and more. 

If you have a specific question about ARM templates or if you would like to see more tips like this one, don’t hesitate to ask in the comments section or reach out on social media!

In a video, please!
-------------------

I also have a video of this post if you prefer.

{% youtube dnb-f4C052w %}