Slide 1

Slide 1 text

Alexa, please deploy my Azure architecture Andrea Ceroni Rome | March 22 - 23, 2019

Slide 2

Slide 2 text

Andrea Ceroni [email protected] @andrekiba http://www.linkedin.com/in/andreaceroni elfo.net klabcommunity.org

Slide 3

Slide 3 text

Alexa + Azure = voice DevOps

Slide 4

Slide 4 text

Why voice DevOps ? sperimentare un modo diverso di fare qualcosa di ripetitivo, spesse volte quasi annoiante ma si può parlando? ...ci avete mai pensato? come sarebbe se fosse davvero "frictionless" ?

Slide 5

Slide 5 text

Aldo (Alexa DevOps) Aldo Project Deployer Azure Aldo Resource Deployer Aldo Alexa AVS + ASK Alexa Developer Portal Proactive Events Aldo Notifier (build, deploy) Aldo Project Builder Azure DevOps Pipeline Echo

Slide 6

Slide 6 text

Voice command Text to speech wake word triggers listening Alexa apri Aldo e deploya Codemotion N L U Alexa AVS Confermi il deploy di Codemotion? ... Fulfillment device inactive

Slide 7

Slide 7 text

Alexa Developer Console

Slide 8

Slide 8 text

Interaction Model Invocation wake word(s) Slots infromazioni necessarie Intents cosa volete fare Endpoint logica per creare la risposta

Slide 9

Slide 9 text

Intent intent has many has 0 or more sample utterances slot contains 0 or more custom built-in one of type name sample values has a has one has many

Slide 10

Slide 10 text

Coding the fulfillment Device "Alexa, chiedi ad aldo di fare il deploy del progetto Codemotion" AlexaService Intent: Slot: DeployProject ProjectName, Codemotion Confermi il deploy del progetto Codemotion? Text to speech Fulfillment Event request handlres CreatResourceHandler CanHandle() Handle() BuildProjectHandler CanHandle() Handle() DeployProjectHandler CanHandle() Handle() Response ....

Slide 11

Slide 11 text

Cosa si può fare? Per ora 3 cose ... provisioning di un servizio su Azure (app, db, storage...) deploy di un progetto ospitato in Azure DevOps build di un progetto ...

Slide 12

Slide 12 text

Azure Management Libraries (IaaC) public class AzureFunctionDeployment : BaseDeployment { protected override Task ExecuteCreateAsync() { var definition = Azure .WithSubscription(Options.SubscriptionId) .AppServices.FunctionApps .Define(AppName) .WithRegion(Options.Region); var create = definition.WithExistingResourceGroup( Options.ResourceGroupName) return create.CreateAsync(); } } https://github.com/Azure/azure-libraries-for-net

Slide 13

Slide 13 text

Resource Deployer FunctionName("AldoResourceDeployer")] public async Task Run([QueueTrigger("azure-resource-deploy" ... [Queue("project-deploy" ...) { var azure = await azureService.Authenticate(conf.ClientId, conf.ClientSecret, conf.TenantId); var deploy = await deploymentService.Deploy(azure, deployOptions, ard.AzureResource); if(deploy.IsSuccess) { var message = ... await notificationService.SendUserNotification(user,message); } ... }

Slide 14

Slide 14 text

Project Deployer & Builder FunctionName("AldoProjectDeployer")] public async Task Run([QueueTrigger("project-deploy" ...)] ProjectToDeploy pd) { var release = await azureDevOpsService.TriggerRelease(pd); } FunctionName("AldoProjectBuilder")] public async Task Run([QueueTrigger("project-build" ...)] ProjectToBuild pb) { var build = await azureDevOpsService.TriggerBuild(pb); }

Slide 15

Slide 15 text

Azure DevOps Pipelines

Slide 16

Slide 16 text

Proactive Events https://developer.amazon.com/it/docs/smapi/proactive-events-api.html sostituiscono le notifiche esistono diversi schemi tra cui scegliere ma per ora non è possibile definire un proprio evento custom ... possono essere unicast o broadcast tramite l'app Alexa occorre dare consenso alla ricezione

Slide 17

Slide 17 text

Notifier FunctionName("AldoNotifier")] public async Task Run([HttpTrigger(..."post"...)] HttpRequest req) { ... dynamic data = JsonConvert.DeserializeObject(requestBody); string eventType = data.eventType; switch(eventType) { case "ms.vss-release.deployment-completed-event": user = await azureDevOpsService.GetReleaseRequestor(...); message = ... case "build.complete": user = await azureDevOpsService.GetBuildRequestor(...); message = ... } if(user.IsSuccess) await notificationService.SendUserNotification(user,message); ... }

Slide 18

Slide 18 text

Azure DevOps API docs.microsoft.com/en-us/rest/api/azure/devops/?view=azure-devops-rest-5.0

Slide 19

Slide 19 text

Next account linking per integrarsi pienamente con Azure DevOps e personalizzare l'esperienza Durable Function stateful o Akka actor che orchestra gli worker per rendere il flusso più immediato e avere anche altre possibilità aggiungere ulteriori azioni e parametri (nome branch, env...) localizzazione della skill con frasi diverse per le stesse azioni suggerimenti...

Slide 20

Slide 20 text

Grazie! [email protected] [email protected] @andrekiba http://github.com/andrekiba http://www.linkedin.com/in/andreaceroni https://creativecommons.org/licenses/by-nc-sa/3.0/

Slide 21

Slide 21 text

HandleQuestionIntent(IntentRequest request) { if(iKnowTheAnswerJ) return ResponseBuilder.Tell(Answer); return ResponseBuilder.Empty() ; }