YT: Actionsflow
YouTube
actionsflow/actionsflow
Why?
今回は、GitHub Actionsを使ってIFTTT/Zapierのようなワークフロー実行基盤を構築できるという Actionsflow 。
これを知ったきっかけは StackShare からのメール。StackShare のメールを購読しておくと毎週新しめのOSS紹介メールを送ってくれるので結構好き。「GitHub Actions で IFTTT みたいなの組めないか」という話はいくつか見た事があって、まさにドンピシャなものが出てきたので、どこまで使えるものなのかなと。
What?
IFTTT/Zapierのようなサービス間を繋ぐワークフローの実行基盤としてGitHub Actionsを使おうというもの。GitHub Actionsを使っているので、無料で利用できる。(GitHub Actionsにも実行上限
https://actionsflow.github.io/docs/#features
上記の公式サイトの説明を見ると、ワークフロー実行トリガーはコミュニティによって提供されたものが利用可能、ワークフロー内のアクションはGitHub Actionsのものがそのまま使えるらしい。
独自ワークフローの実行には act を利用
Actionsflow uses act (a tool for running GitHub Actions locally) to run the jobs on your workflow file.
Actionsflowはワークフローの実行に act を使っているらしい。act はGitHub Actionsをローカルで実行できるツールで、これをGitHub Actions 上で動かしているので、Actionsflow は Actions(act) on Actions(GitHub Actions) のような形で動いているらしい。なるほど。
Actionsは5分ごとに実行
The workflow can check and run every 5 minutes based on Github actions scheduled events.
Actions(act) on Actions(GitHub Actions) の Actions(GitHub Actions) が5分ごとに実行され、Actions(act) 関連リソースに更新があった場合のみ Actions(act) の方のワークフローが実行される感じらしい。例えば、RSSフィードを取得する Actions(act) を組んでいた場合、新たなフィードがあった場合のみワークフローが実行されるという感じ。(GitHub ActionsのCacheを使って判断してるのかな?)
Webhookによるトリガ
基本的には上述のように5分ごとに更新をチェックする感じで動作が開始されるが、GitHub の Webhook にリクエストを送る事で動作を開始するよう設定することもできるらしい。(今回は使わなかったけど)
https://actionsflow.github.io/docs/concepts/#repository_dispatch-run
GitHub Actions機能である repository_dsipatch
イベントを使ってるらしい。Actionsflowでは、このWebhookへのリクエストを送信しやすくするツールなんかも公開している。
actionsflow/webhook2github: Forward webhook to github repository_dispatch event
あと、データをフィルタリングするためにMongoDBのクエリを使えるという記述もあるけど、これはよくわかりませんでした。
How?
実行手順。 Actionsflow Introduction | Actionsflow Documentation
Actionsflow もテンプレートリポジトリからリポジトリを作成して使い始めるやり方を推奨している模様。テンプレートリポジトリは色んなところで採用されてますね。
実行手順のドキュメントにあるリンクをクリックすると、GitHubにログインしている状態ならそのままリポジトリ作成画面に遷移するので、リポジトリ名を入力するだけ。
テンプレートリポジトリからリポジトリを作成すると、すでにGitHub Actions実行のためのファイルが置いてあるので、そのままActionsの実行が始まってしまいます。本当にリポジトリを作成するだけ。
Actions (GitHub Actions)
Actions(act) on Actions(GitHub Actions) の Actions(GitHub Actions) の方は、下記のような定義。
name: Actionsflow
on:
repository_dispatch:
workflow_dispatch:
schedule:
- cron: "*/5 * * * *" ... [1]
push:
jobs:
run:
runs-on: ubuntu-latest
name: Run
steps:
- uses: actions/checkout@v2
- name: Run Actionsflow
uses: actionsflow/actionsflow-action@v1
with:
args: build
json-secrets: ${{ toJSON(secrets) }}
json-github: ${{ toJSON(github) }}
- name: Setup act ... [2]
uses: actionsflow/setup-act-for-actionsflow@v1
- name: Run act
run: act --workflows ./dist/workflows --secret-file ./dist/.secrets --eventpath ./dist/event.json --env-file ./dist/.env -P ubuntu-latest=actionsflow/act-environment:v1 -P ubuntu-18.04=actionsflow/act-environment:v1
on.schedule.cron
[1] の方で、5分ごとに実行されるよう設定されている。on.repository_dispatch
やon.workflow_dispatch
で、WebhookでやWorkflowからの実行を定義しているんだろうなぁ。
Setup act
[2] や Run act
のあたりで、Actions(act) の部分にあたる act のセットアップや実行を行っている。本当にActionsの上でActionsを動かしてるんだなぁ…。act
は、workflows/
ディレクトリ内のワークフローファイルを実行しているらしい。
リポジトリの workflows/
ディレクトリ配下をみてみると、rss.yml
が置いてあるので、これが act
によって実行されている模様。
Actions (act)
act
によって実行される Actions の定義。
(ドキュメントに書いてある例とは内容が違うけど、動きが早くて直してる暇ないんだろうな)
on:
rss:
url: https://hnrss.org/newest?points=300&count=3 ... [3]
jobs:
print:
name: Print
runs-on: ubuntu-latest
steps:
- name: Print Outputs
env:
title: ${{on.rss.outputs.title}}
contentSnippet: ${{on.rss.outputs.contentSnippet}}
link: ${{on.rss.outputs.link}}
run: |
echo title: $title
echo contentSnippet: $contentSnippet
echo link: $link
こちらでは、on
のところの定義が rss
というものになっているらしい。このrss
のトリガの部分がコミュニティベースで開発されていく部分なんだろうな。
テンプレートリポジトリの例では on.rss.url
にRSS取得元URLが書かれており、このURLの内容がこのワークフロー上で処理されるみたい。実行している処理はフィードからtitle
とかの要素を取ってきてecho
してるだけ。
Workflowの追加
実行方法はわかったので、自分でワークフローを追加してみました。
トリガ一覧を眺めて、簡単そうなAPI polling
のワークフローを組んでみることに。
Actionsflow Triggers | Actionsflow Documentation
(Twitter
使いたかったけど、CONSUMER_KEY
とかの取得が面倒なので…)
作成したワークフローファイルはこちら。
on:
poll:
url: https://ghibliapi.herokuapp.com/locations?limit=5
config:
limit: 5
jobs:
print:
name: Print
runs-on: ubuntu-latest
steps:
- name: Print Outputs
env:
name: ${{ on.poll.outputs.name }}
terrain: ${{ on.poll.outputs.terrain }}
run: |
echo "name: $name"
echo "terrain: $terrain"
なんかrss
とあんま変わらないですね…。
ちょっとハマったのが、JSONを返すAPIでもArray形式で返してくれるAPIじゃないとエラーが出た点([{..},...]
はOKで、{...}
というのはダメ)。e.forEach is not function
というエラーだったので、on.poll.outputs
あたりの指定の仕方次第なのかもしれない。GitHub Actionsあまり分かってない。
追記:
https://youtu.be/nZiP10uqdvE?t=2014
見返してて、ここで ${{ toJSON(on.poll.outputs.raw__body) }}
を使っておけば、Array形式でないJSONも扱えるんじゃ無いかと思った。
再追記:
そんなことなかった。
Impression
使い始めはテンプレートリポジトリからリポジトリを作成するだけなので本当に手軽。
- テンプレートリポジトリからリポジトリを作成した後に、テンプレートリポジトリの更新を取り込む仕組みを用意しているのは優しい
- 5分ごとにActionsが実行されるようになるので、お試しだけならリポジトリの設定からActionsを無効にするのを忘れずに
ドキュメントもしっかり書かれていて頑張ってる感ある
まだまだ情報が少ないので、自分がやりたいワークフローを組むだけならハードルが高いなと感じる気がする
ワークフローの実行基盤を act に依存してるけど、actがどれだけGitHub Actionsとの互換性を維持できるのかというところが少し不安材料か
コミュニティベースのトリガがどれだけ増えるかというのも重要な点だと思うけど、実際多くの人に使われるのは同じワークフローな気もするので、誰にとっても便利なゴールデンパターンが見つかるかどうかが鍵な気がする
吐息が入るの良くない。
Contribution
特になし