Computação sem servidor baseada no OpenWhisk, parte 2


Este artigo continua a série de notas traduzidas sobre o OpenWhisk por Priti Desai . Hoje, veremos exemplos de implantação de webhook do GitHub, sinais periódicos e o aplicativo mais simples para enviar mensagens ao Slack.


Webhook do Github


As funções do OpenWhisk podem ser acionadas por vários eventos (por exemplo, solicitação push, pull, etc.) do repositório GitHub .


Vamos ver como você pode implantar uma função para lidar com o webhook do GitHub usando o wskdeploy .


Primeiro passo


Crie um arquivo de manifesto:


Para manipular eventos com o GitHub, você precisa especificar a fonte de eventos /whisk.system/github/webhook como uma condição para acionar:


 packages: helloworld: actions: helloworld: location: src/hello.js runtime: nodejs:6 inputs: name: type: string description: name of a person place: type: string description: location of a person outputs: payload: type: string description: a simple greeting message, Hello World! triggers: GitHubWebhookTrigger: feed: /whisk.system/github/webhook rules: helloworldOnWebhook: action: helloworld trigger: GitHubWebhookTrigger 

Segundo passo


Criamos um arquivo para implantação, no qual definimos os valores dos parâmetros de entrada username , repository , accessToken e events para processamento condicional da fonte de eventos GitHubWebhookTrigger :


 application: name: SampleHelloWorld namespace: _ packages: helloworld: actions: helloworld: inputs: name: Amy place: Paris triggers: GitHubWebhookTrigger: inputs: username: pritidesai repository: pritidesai/helloworld accessToken: <accessToken> events: push 

Passo três


Expanda a função:


 ./wskdeploy -p ~/SampleHelloWorldApp/ ____ ___ _ _ _ _ _ /\ \ / _ \ _ __ ___ _ __ | | | | |__ (_)___| | __ /\ /__\ \ | | | | '_ \ / _ \ '_ \| | | | '_ \| / __| |/ / / \____ \ / | |_| | |_) | __/ | | | |/\| | | | | \__ \ < \ \ / \/ \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\ \___\/ |_| Packages: Name: helloworld bindings: * action: helloworld bindings: - name: name value: Amy - name: place value: Paris Triggers: * trigger: GitHubWebhookTrigger bindings: - name: accessToken value: **** - name: events value: push - name: username value: pritidesai - name: repository value: pritidesai/helloworld annotations: - name: feed value: /whisk.system/github/webhook Rules * rule: helloworldOnWebhook - trigger: GitHubWebhookTrigger - action: helloworld Do you really want to deploy this? (y/N): y Deploying package helloworld ... Done! Deploying action helloworld/helloworld ... Done! Deploying trigger feed GitHubWebhookTrigger ... Done! Deploying rule helloworldOnWebhook ... Done! Deployment completed successfully. 

Implantamos a função hello world , chamada do GitHub toda vez que atualizamos o código no repositório do GitHub e usamos o webhook para isso:



Podemos verificar a função implementada criando novas alterações de código no repositório GitHub. Nesse caso, mensagens simples de boas-vindas serão retornadas. Vamos tentar usar a carga útil ao atualizar o código enviado do GitHub por meio de uma solicitação POST. Esses dados estão disponíveis como parâmetros de função, por exemplo:


 function main(params) { console.log("GitHub repository is at ", params.repository.url); return {commits: params.commits}; } 

Aqui está um trecho da carga útil obtida pela edição normal do README.md:


 "commits" : [ { "author" : { "name" : Priti Desai, "username" : pritidesai }, "timestamp" : 2017-03-20T12:54:41-07:00, "removed" : [ ], "modified" : [ README.md ], "added" : [ ], "message" : Update README.md, "committer" : { "name" : GitHub, "email" : noreply@github.com, "username" : web-flow } } ], 

Você pode aprender uma descrição detalhada de como o webhook do GitHub é acionado aqui.


Signals


As funções do OpenWhisk podem ser ativadas periodicamente por um sinal interno (algo como tarefas cron). Vamos tentar adicionar um gatilho condicional em um sinal através do wskdeploy .


Primeiro passo


Para processar sinais, você precisa especificar a fonte de eventos /whisk.system/alarms/alarm como uma condição para acionar o manifesto:


 packages: helloworld: actions: helloworld: location: src/hello.js runtime: nodejs:6 inputs: name: type: string description: name of a person place: type: string description: location of a person outputs: payload: type: string description: a simple greeting message, Hello World! triggers: Every12Hours: feed: /whisk.system/alarms/alarm rules: hellowroldOnCron: action: helloworld trigger: Every12Hours 

Segundo passo


Crie um arquivo para implementação, especifique cron como uma condição de entrada, com um valor de Every12Hours . Você também pode usar as duas opções usadas no cron, tradicional e aprimorada:


 <Minute> <Hour> <Day_of_the_Month> <Month_of_the_Year> <Day_of_the_Week>  <Minute> <Hour> <Day_of_the_Month> <Month_of_the_Year> <Day_of_the_Week> <Year> 

Conteúdo do arquivo deployment.yaml:


 application: name: SampleHelloWorld namespace: _ packages: helloworld: actions: helloworld: inputs: name: Amy place: Paris triggers: Every12Hours: inputs: cron: "0 */12 * * *" 

É possível especificar a carga útil transmitida quando o sinal é acionado (transmitido como um parâmetro de função toda vez que é acionado) como o parâmetro trigger_payload :


 application: name: SampleHelloWorld namespace: _ packages: helloworld: actions: helloworld: inputs: name: Amy place: Paris triggers: Every12Hours: inputs: cron: "0 */12 * * * *" trigger_payload: "{\"name\":\"Mark\", \"place\":\"Barcelona\"}" 

Passo três


Expanda a função:


 ./wskdeploy -p ~/SampleHelloWorldApp/ ____ ___ _ _ _ _ _ /\ \ / _ \ _ __ ___ _ __ | | | | |__ (_)___| | __ /\ /__\ \ | | | | '_ \ / _ \ '_ \| | | | '_ \| / __| |/ / / \____ \ / | |_| | |_) | __/ | | | |/\| | | | | \__ \ < \ \ / \/ \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\ \___\/ |_| Packages: Name: helloworld bindings: * action: helloworld bindings: - name: name value: Amy - name: place value: Paris Triggers: * trigger: Every12Hours bindings: - name: cron value: 0 */12 * * * * annotations: - name: feed value: /whisk.system/alarms/alarm Rules * rule: helloworldEvery12Hours - trigger: Every12Hours - action: helloworld Do you really want to deploy this? (y/N): y Deploying package helloworld ... Done! Deploying action helloworld/helloworld ... Done! Deploying trigger feed Every12Hours ... Done! Deploying rule helloworldEvery12Hours ... Done! Deployment completed successfully. 

A partir de agora, o AC tem uma função hello world que é executada a cada 12 horas. Podemos verificar ativando a condição, como mostrado anteriormente


Pacote para Slack


Para enviar mensagens para o Slack , é oferecido um pacote para o Slack . Vejamos a ligação de pacotes usando o wskdeploy .


Primeiro passo


Crie um arquivo de manifesto com uma ligação de pacote para o Slack. Para fazer isso, especifique-o como uma dependência, configurando o valor do local como /whisk.system/slack :


 packages: SlackPackage: dependencies: slack-package-to-post-messages: location: /whisk.system/slack inputs: username: $SLACK_USERNAME url: $SLACK_URL channel: $SLACK_CHANNEL 

Primeiro, precisamos configurar o suporte para o webhook de entrada em nosso ambiente de trabalho do Slack. Você pode configurar um novo webhook para enviar mensagens para o canal Slack usando esta instrução passo a passo .


Agora, adicionamos o pacote para o Slack ao nosso aplicativo para enviar mensagens para o canal Slack a cada hora usando este manifesto:


 packages: SlackPackage: dependencies: slack-package-to-post-messages: location: /whisk.system/slack inputs: username: $SLACK_USERNAME url: $SLACK_URL channel: $SLACK_CHANNEL actions: post-to-slack: function: actions/post-to-slack.js runtime: nodejs:6 inputs: message: type: string description: message to post on slack slack_package: type: string description: slack package name triggers: everyhour: feed: /whisk.system/alarms/alarm rules: post-to-slack-every-hour: action: post-to-slack trigger: everyhour 

O conteúdo da função post-to-slack.js pode ser visualizado aqui .


Segundo passo


Crie um arquivo para implantação:


 application: name: AppToPostToSlack packages: SlackPackage: actions: post-to-slack: inputs: message: "Hello from WskDeploy!" slack_package: slack-package-to-post-messages triggers: everyhour: inputs: cron: "0 */1 * * *" 

Passo três


Expanda a função:


 ./wskdeploy -p ~/AppToPostToSlack/ ____ ___ _ _ _ _ _ /\ \ / _ \ _ __ ___ _ __ | | | | |__ (_)___| | __ /\ /__\ \ | | | | '_ \ / _ \ '_ \| | | | '_ \| / __| |/ / / \____ \ / | |_| | |_) | __/ | | | |/\| | | | | \__ \ < \ \ / \/ \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\ \ __\/ |_| Packages: Name: SlackPackage bindings: * dependency: slack-package-to-post-messages location: /whisk.system/slack * action: post-to-slack bindings: - message : "Hello from WskDeploy!" - slack_package : "slack-package-to-post-messages" annotations: Triggers: * trigger: everyhour bindings: - cron : "0 */1 * * *" annotations: - name: feed value: /whisk.system/alarms/alarm Rules * rule: post-to-slack-every-hour - trigger: everyhour - action: SlackPackage/post-to-slack Do you really want to deploy this? (y/N): y Deployment completed successfully. 

Nesta etapa, já temos uma função pós-folga que executa 1 vez por hora. Você pode verificá-lo ativando a condição, como mostrado anteriormente . Após a ativação, devemos receber uma nova mensagem no canal Slack:


 Activation: post-to-slack (9909dd5229e84526bff9902a2cd860df) [ "2017-09-12T23:05:17.17872899Z stdout: Hello from WskDeploy!", "2017-09-12T23:05:17.549177677Z stdout: Posted message to slack" ] 

Outros artigos do ciclo


Computação sem servidor baseada no OpenWhisk, parte 1
Computação sem servidor baseada no OpenWhisk, parte 2
Computação sem servidor baseada no OpenWhisk, parte 3
Computação sem servidor baseada no OpenWhisk, parte 4

Source: https://habr.com/ru/post/pt477628/


All Articles