Azure Functions Deployment

Octopus.TentaclePackage exported 2020-03-15 by twerthi belongs to ‘Azurefunctions’ category.

Deploys Azure Functions via the Kudu API to an Azure Function App.

DO NOT RUN THIS STEP ON AN AZURE WEB APP TARGET. USE A PLAIN TENTACLE TARGET ONLY.

Process:

  1. Deploys the package to a tentacle.
  2. Zips up the deployment artefacts and uploads the resulting zip file.

This process enables the following:

  • Config and variable transform
  • Package type agnostic (i.e. will work with .nupkg as well as .zip files)
  • Retention policies can be applied to the target in step 1

Notes:

This deployment step requires an available tentacle to deploy the package to before the final package is deployed to Azure. This tentacle does not need to be within the target deployment environment. It is advised to install the tentacle on the Octopus Deploy server, and deploy to that tentacle.

The target Function App will not be purged before deployment. This is by design of the Kudu API. An advantage of this is that multiple deployment packages can be deployed to a single Function App, as long as each function to be deployed has a unique name. However, you should be careful not to expect functions that have been removed from the deployment package to also be removed from the Functions App.

The package to deploy should mirror exactly the file and folder structure that the Functions App expects. A quick and easy way to get this up and running is to download an existing Function App’s content from the Azure portal, and upload the downloaded zip file to Octopus Deploy via the Library > Packages page.

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

Username

Azf.Username =

See Kudu Deployment Credentials for more information.

Password

Azf.Password =

See Kudu Deployment Credentials for more information.

Application Name

Azf.ApplicationName =

This value can be determined from the URL of your application. i.e.: https://{ApplicationName}.azurewebsites.net

Package Name

Azf.PackageName =

The name of the package to deploy.

Json Configuration Files

Azf.JsonConfigFiles =

A comma- or newline-separated list of file names to replace settings in, relative to the package contents. Extended wildcard syntax is supported. E.g., appsettings.json, Config*.json, **\specific-folder*.json.. Configuration values can be replaced using a : separated key, starting from the root of the hierarchy.

Consider the following appsettings.json file:

{
"Data": {
  "DefaultConnection": {
    "ConnectionString": "Server=(localdb)\\SQLEXPRESS;Database=OctoFX;Trusted_Connection=True"
  }
}

}

To replace the value of ConnectionString you would add a variable name Data:DefaultConnection:ConnectionString to your project variables / library variable set. The JSON also supports extended template syntax.

The ‘Target files’ field supports extended template syntax. Conditional if and unless:

#{if MyVar}...#{/if}

Iteration over variable sets or comma-separated values with each:

#{each mv in MyVar}...#{mv}...#{/each}

Script body

Steps based on this template will execute the following undefined script.

undefined

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "03bb1a08-52be-43ad-bdfd-117eb562b414",
  "Name": "Azure Functions Deployment",
  "Description": "Deploys Azure Functions via the Kudu API to an Azure Function App.\n\nDO NOT RUN THIS STEP ON AN AZURE WEB APP TARGET. USE A PLAIN TENTACLE TARGET ONLY.\n\nProcess:\n1. Deploys the package to a tentacle.\n2. Zips up the deployment artefacts and uploads the resulting zip file.\n\nThis process enables the following:\n- Config and variable transform \n- Package type agnostic (i.e. will work with .nupkg as well as .zip files)\n- Retention policies can be applied to the target in step 1\n\n**Notes:**\n\nThis deployment step requires an available tentacle to deploy the package to before the final package is deployed to Azure. This tentacle does not need to be within the target deployment environment. It is advised to install the tentacle on the Octopus Deploy server, and deploy to that tentacle.\n\nThe target Function App will not be purged before deployment. This is by design of the Kudu API. An advantage of this is that multiple deployment packages can be deployed to a single Function App, as long as each function to be deployed has a unique name. However, you should be careful not to expect functions that have been removed from the deployment package to also be removed from the Functions App.\n\nThe package to deploy should mirror exactly the file and folder structure that the Functions App expects. A quick and easy way to get this up and running is to download an existing Function App's content from the Azure portal, and upload the downloaded zip file to Octopus Deploy via the Library > Packages page.",
  "Version": 4,
  "ExportedAt": "2020-03-15T18:13:57.632Z",
  "ActionType": "Octopus.TentaclePackage",
  "Author": "twerthi",
  "Parameters": [
    {
      "Id": "538b02c5-ca4c-4bb6-aadc-e46906e69537",
      "Name": "Azf.Username",
      "Label": "Username",
      "HelpText": "See [Kudu Deployment Credentials](https://github.com/projectkudu/kudu/wiki/Deployment-credentials#user-level-credentials-aka-deployment-credentials) for more information.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "5510ce13-6016-471b-a65d-051597c0c972",
      "Name": "Azf.Password",
      "Label": "Password",
      "HelpText": "See [Kudu Deployment Credentials](https://github.com/projectkudu/kudu/wiki/Deployment-credentials#user-level-credentials-aka-deployment-credentials) for more information.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "Sensitive"
      },
      "Links": {}
    },
    {
      "Id": "2bcc2c06-26c7-48c1-9408-1892ecd15910",
      "Name": "Azf.ApplicationName",
      "Label": "Application Name",
      "HelpText": "This value can be determined from the URL of your application. i.e.: https://{ApplicationName}.azurewebsites.net",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "f6ac1609-2cdf-4ba9-a598-6c32df68db85",
      "Name": "Azf.PackageName",
      "Label": "Package Name",
      "HelpText": "The name of the package to deploy.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "0d71cd13-9fb7-4b7f-b352-004a96d6a741",
      "Name": "Azf.JsonConfigFiles",
      "Label": "Json Configuration Files",
      "HelpText": "A comma- or newline-separated list of file names to replace settings in, relative to the package contents. Extended wildcard syntax is supported. E.g., appsettings.json, Config\\*.json, **\\specific-folder\\*.json.. Configuration values can be replaced using a `:` separated key, starting from the root of the hierarchy.\n\nConsider the following appsettings.json file:\n\n    {\n    \"Data\": {\n      \"DefaultConnection\": {\n        \"ConnectionString\": \"Server=(localdb)\\\\SQLEXPRESS;Database=OctoFX;Trusted_Connection=True\"\n      }\n    }\n  }\n\nTo replace the value of `ConnectionString` you would add a variable name `Data:DefaultConnection:ConnectionString` to your project variables / library variable set. The JSON also supports extended template syntax.\n\nThe 'Target files' field supports extended template syntax. Conditional `if` and `unless`:\n\n    #{if MyVar}...#{/if}\n\nIteration over variable sets or comma-separated values with `each`:\n\n    #{each mv in MyVar}...#{mv}...#{/each}",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "MultiLineText"
      },
      "Links": {}
    }
  ],
  "Properties": {
    "Octopus.Action.Package.AutomaticallyRunConfigurationTransformationFiles": "True",
    "Octopus.Action.Package.AutomaticallyUpdateAppSettingsAndConnectionStrings": "True",
    "Octopus.Action.EnabledFeatures": "Octopus.Features.CustomScripts,Octopus.Features.JsonConfigurationVariables",
    "Octopus.Action.Package.DownloadOnTentacle": "False",
    "Octopus.Action.Package.FeedId": "feeds-builtin",
    "Octopus.Action.Package.JsonConfigurationVariablesEnabled": "True",
    "Octopus.Action.CustomScripts.PostDeploy.ps1": "$installationPath = $OctopusParameters[\"Octopus.Action.Package.InstallationDirectoryPath\"]\n$packageId = $OctopusParameters[\"Octopus.Action.Package.PackageId\"]\n$packageVersion = $OctopusParameters[\"Octopus.Action.Package.PackageVersion\"]\n\nWrite-Host \"Installation Path: $($installationPath)\"\nWrite-Host \"Package ID: $($packageId)\"\nWrite-Host \"Package Version: $($packageVersion)\"\n\n$zipFilePath = \"$($installationPath)\\$($packageId).$($packageVersion).zip\"\n\nWrite-Host \"Zip File Path: $($zipFilePath)\"\n\nCompress-Archive -Path \"$($installationPath)\\*\" -DestinationPath $zipFilePath\n\nWrite-Host \"Deployment zip file created\"\n\n$username = $OctopusParameters[\"Azf.Username\"]\n$password = $OctopusParameters[\"Azf.Password\"]\n$appName = $OctopusParameters[\"Azf.ApplicationName\"]\n\nif(!$username){\n    Write-Error \"No Username has been supplied. You can do this from the Step Details page of this step.\"\n    \n    exit 1;\n}\n\n\nif(!$password){\n    Write-Error \"No Password has been supplied. You can do this from the Step Details page of this step.\"\n    \n    exit 1;\n}\n\n\nif(!$appName){\n    Write-Error \"No Application Name has been supplied. You can do this from the Step Details page of this step.\"\n    \n    exit 1;\n}\n\n$authHeader = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes((\"{0}:{1}\" -f $username,$password)))\n\n$apiUrl = \"https://$($appName).scm.azurewebsites.net/api/zipdeploy\"\n\nWrite-Host \"Uploading deployment zip file to $($apiUrl)\"\n\n# Set secure protocols\n[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [System.Net.SecurityProtocolType]::Tls12\n\nInvoke-RestMethod -Uri $apiUrl -Headers @{Authorization=(\"Basic {0}\" -f $authHeader)} -Method POST -InFile $zipFilePath -ContentType \"multipart/form-data\"\n\nWrite-Host \"Upload complete\"\n",
    "Octopus.Action.Package.PackageId": "#{Azf.PackageName}",
    "Octopus.Action.Package.JsonConfigurationVariablesTargets": "#{Azf.JsonConfigFiles}",
    "Octopus.Action.CustomScripts.PreDeploy.ps1": "",
    "Octopus.Action.CustomScripts.Deploy.ps1": ""
  },
  "Category": "Azurefunctions",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/azure-function-deployment.json",
  "Website": "/step-templates/03bb1a08-52be-43ad-bdfd-117eb562b414",
  "Logo": "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",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Sunday, March 15, 2020