
Este art铆culo contin煤a la serie de notas traducidas sobre OpenWhisk por Priti Desai . Hoy veremos ejemplos de implementaci贸n de webhook de GitHub, se帽ales peri贸dicas, as铆 como la aplicaci贸n m谩s simple para enviar mensajes a Slack.
Webhook de Github
Las funciones de OpenWhisk pueden ser activadas por varios eventos (por ejemplo, solicitud de inserci贸n, extracci贸n, etc.) desde el repositorio de GitHub .
Veamos c贸mo puede implementar una funci贸n para manejar el webhook de GitHub usando wskdeploy .
Primer paso
Crea un archivo de manifiesto:
Para manejar eventos con GitHub, debe especificar el origen del evento /whisk.system/github/webhook
como condici贸n para desencadenar:
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 paso
Creamos un archivo para la implementaci贸n, en el que establecemos los valores de los par谩metros de entrada username
, repository
, accessToken
y events
para el procesamiento condicional del origen del evento 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
Paso tres
Expande la funci贸n:
./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.
Implementamos la funci贸n hello world , llamada desde GitHub cada vez que actualizamos el c贸digo en el repositorio de GitHub, y utilizamos el webhook para esto:

Podemos verificar la funci贸n desplegada creando nuevos cambios de c贸digo en el repositorio de GitHub. En este caso, se devolver谩n simples mensajes de bienvenida. Intentemos usar la carga 煤til al actualizar el c贸digo enviado desde GitHub a trav茅s de una solicitud POST. Estos datos est谩n disponibles como par谩metros de funci贸n, por ejemplo:
function main(params) { console.log("GitHub repository is at ", params.repository.url); return {commits: params.commits}; }
Aqu铆 hay un fragmento de la carga 煤til obtenida por la edici贸n normal de 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 } } ],
Puede estudiar la descripci贸n detallada de la operaci贸n de webhook de GitHub aqu铆
Se帽ales
Las funciones de OpenWhisk se pueden activar peri贸dicamente mediante una se帽al interna (algo as铆 como tareas cron). Intentemos agregar un activador condicional en una se帽al a trav茅s de wskdeploy
.
Primer paso
Para procesar se帽ales, debe especificar el origen del evento /whisk.system/alarms/alarm
como condici贸n para desencadenar en el manifiesto:
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 paso
Cree un archivo para la implementaci贸n, especifique cron como condici贸n de entrada, con un valor de Every12Hours . Tambi茅n puede usar ambas opciones usadas en cron, tradicional y mejorado:
<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>
Contenido del archivo deploy.yaml:
application: name: SampleHelloWorld namespace: _ packages: helloworld: actions: helloworld: inputs: name: Amy place: Paris triggers: Every12Hours: inputs: cron: "0 */12 * * *"
Es posible especificar la carga 煤til transmitida cuando se activa la se帽al (transmitida como un par谩metro de funci贸n cada vez que se activa) como el 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\"}"
Paso tres
Expande la funci贸n:
./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.
De ahora en adelante, ac tiene una funci贸n hello world que se ejecuta cada 12 horas. Podemos verificarlo activando la condici贸n, como se muestra anteriormente
Paquete para holgura
Para enviar mensajes a Slack , se ofrece un paquete para Slack . Veamos el enlace del paquete usando wskdeploy
.
Primer paso
Cree un archivo de manifiesto con un enlace de paquete para Slack. Para hacer esto, especif铆quelo como una dependencia, estableciendo el valor de ubicaci贸n en /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
En primer lugar, debemos configurar el soporte para el webhook entrante en nuestro entorno de trabajo Slack. Puede configurar un nuevo webhook para enviar mensajes al canal Slack usando esta instrucci贸n paso a paso .
Ahora agregamos el paquete para Slack a nuestra aplicaci贸n para enviar mensajes al canal Slack cada hora usando este manifiesto:
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
El contenido de la funci贸n post-s-slack.js se puede ver aqu铆 .
Segundo paso
Cree un archivo para la implementaci贸n:
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 * * *"
Paso tres
Expande la funci贸n:
./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.
En este paso, ya tenemos una funci贸n posterior a la holgura que se ejecuta 1 vez por hora. Puede verificarlo activando la condici贸n, como se mostr贸 anteriormente . Despu茅s de la activaci贸n, deber铆amos recibir un nuevo mensaje en el 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" ]
Otros art铆culos de ciclo
Computaci贸n sin servidor basada en OpenWhisk, parte 1
Computaci贸n sin servidor basada en OpenWhisk, parte 2
Computaci贸n sin servidor basada en OpenWhisk, parte 3
Computaci贸n sin servidor basada en OpenWhisk, parte 4