Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Эта статья продолжает цикл переводных заметок об OpenWhisk от автора Priti Desai. Сегодня будут рассмотрены примеры развертывания GitHub webhook, периодических сигналов, а также приведено простейшее приложение для отправки сообщений в Slack.
GitHub webhook
Функции OpenWhisk могут быть запущены разными событиями (к примеру, push, pull request и т.п.) из репозитория GitHub.
Давайте посмотрим, как можно развернуть функцию для обработки GitHub webhook, используя wskdeploy.
Шаг первый
Создаем файл-манифест:
Для обработки событий с GitHub надо указать источник событий /whisk.system/github/webhook
в качестве условия для срабатывания:
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
Шаг второй
Создаем файл для развертывания, в котором выставляем значения входных параметров username
, repository
, accessToken
и events
для условной обработки источника событий 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
Шаг третий
Разворачиваем функцию:
./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.
Мы развернули функцию hello world, вызываемую из GitHub каждый раз при обновлении кода в репозитории GitHub, и использовали для этого webhook:
Можем проверить развернутую функцию, создавая новые правки кода в репозитории GitHub. При этом будут возвращаться простые приветственные сообщения. Попробуем использовать полезную нагрузку при обновлении кода, присылаемую от GitHub через POST запрос. Эти данные доступны в качестве параметров функции, например:
function main(params) {
console.log("GitHub repository is at ", params.repository.url);
return {commits: params.commits};
}
Здесь фрагмент полезной нагрузки, полученной при обычной правке 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
}
}
],
Можно изучить детализированное описание срабатывания GitHub webhook тут
Сигналы
Функции OpenWhisk могут периодически запускаться по внутреннему сигналу (что-то вроде задач cron). Давайте попробуем добавить условное срабатывание по сигналу через wskdeploy
.
Шаг первый
Для обработки сигналов надо указать источник событий /whisk.system/alarms/alarm
в качестве условия для срабатывания в манифесте:
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
Шаг второй
Создаем файл для развертывания, указываем cron в качестве входного условия, со значением Every12Hours. Можно также использовать оба варианта, используемых в cron, традиционный и улучшенный:
<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>
Содержимое файла deployment.yaml:
application:
name: SampleHelloWorld
namespace: _
packages:
helloworld:
actions:
helloworld:
inputs:
name: Amy
place: Paris
triggers:
Every12Hours:
inputs:
cron: "0 */12 * * *"
Есть возможность указать полезную нагрузку, передаваемую при срабатывании сигнала (передается в виде параметра функции при каждом срабатывании) в виде параметра 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\"}"
Шаг третий
Разворачиваем функцию:
./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.
С этого момента у ас есть функция hello world, запускаемая каждые 12 часов. Можем проверить ее путем активации условия, как это было показано ранее
Пакет для Slack
Для отправки сообщений в Slack предлагается пакет для Slack. Давайте рассмотрим привязку пакета с использованием wskdeploy
.
Шаг первый
Создаем файл-манифест с привязкой пакета для Slack. Для этого указываем его в качестве зависимости, задавая в location значение /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
В первую очередь, надо настроить поддержку для входящего webhook в нашем рабочем окружении Slack. Настроить новый webhook для отправки сообщений в канал Slack можно по этой пошаговой инструкции.
Теперь добавляем пакет для Slack в наше приложение для отправки сообщений в канал Slack каждый час с помощью такого манифеста:
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
Содержимое функции post-to-slack.js можно глянуть здесь.
Шаг второй
Создаем файл для развертывания:
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 * * *"
Шаг третий
Разворачиваем функцию:
./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.
На этом шаге у нас уже есть функция post-to-slack, запускаемая 1 раз за час. Можно ее проверить путем активации условия, как это было показано ранее. После активации мы должны получить новое сообщение на канале 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"
]
Другие статьи цикла
Бессерверные вычисления на основе OpenWhisk, часть 1
Бессерверные вычисления на основе OpenWhisk, часть 2
Бессерверные вычисления на основе OpenWhisk, часть 3
Бессерверные вычисления на основе OpenWhisk, часть 4