YT: Actionsflow

YouTube

actionsflow/actionsflow

actionsflow/actionsflow: The free Zapier/IFTTT alternative for developers to automate your workflows based on Github actions

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-on-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 もテンプレートリポジトリからリポジトリを作成して使い始めるやり方を推奨している模様。テンプレートリポジトリは色んなところで採用されてますね。

actionsflow/actionsflow-workflow-default: Actionsflow workflow template repository. The best Zapier/IFTTT free alternative for developers to automate your workflows based on Github actions

実行手順のドキュメントにあるリンクをクリックすると、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_dispatchon.workflow_dispatchで、WebhookでやWorkflowからの実行を定義しているんだろうなぁ。 Setup act[2] や Run act のあたりで、Actions(act) の部分にあたる act のセットアップや実行を行っている。本当にActionsの上でActionsを動かしてるんだなぁ…。act は、workflows/ディレクトリ内のワークフローファイルを実行しているらしい。

リポジトリの workflows/ ディレクトリ配下をみてみると、rss.yml が置いてあるので、これが act によって実行されている模様。

actions-on-actions-files

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してるだけ。

https://github.com/orta-contrib/actionsflow-workflow-sample/runs/1298845151?check_suite_focus=true#step:5:7 first-run

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も扱えるんじゃ無いかと思った。

再追記:

https://github.com/orta-contrib/actionsflow-workflow-sample/runs/1301386971?check_suite_focus=true#step:3:224

そんなことなかった。

Impression

  • 使い始めはテンプレートリポジトリからリポジトリを作成するだけなので本当に手軽。

    • テンプレートリポジトリからリポジトリを作成した後に、テンプレートリポジトリの更新を取り込む仕組みを用意しているのは優しい
    • 5分ごとにActionsが実行されるようになるので、お試しだけならリポジトリの設定からActionsを無効にするのを忘れずに
  • ドキュメントもしっかり書かれていて頑張ってる感ある

  • まだまだ情報が少ないので、自分がやりたいワークフローを組むだけならハードルが高いなと感じる気がする

  • ワークフローの実行基盤を act に依存してるけど、actがどれだけGitHub Actionsとの互換性を維持できるのかというところが少し不安材料か

  • コミュニティベースのトリガがどれだけ増えるかというのも重要な点だと思うけど、実際多くの人に使われるのは同じワークフローな気もするので、誰にとっても便利なゴールデンパターンが見つかるかどうかが鍵な気がする

  • 吐息が入るの良くない。

Contribution

特になし

comments powered by Disqus