June 25, 2017

Go言語製 Digdag Client (mog) をリリースしました #digdag

こんばんは!久しぶりの更新となりましたが…
またしてもDigdagネタです。

以前 Workflow Engines Night という名の勉強会で登壇させてただく機会があり、
社内におけるDigdagの導入事例を紹介させていただきました!

その時の資料がこちら↓


こちらのセッションの中でスライドの48枚目~出ています
mog というGo言語製のツールを事例紹介させていただいたのですが、
意外と好評だったこともありまして、本日Githubにてリリースをいたしました!

mogのリポジトリはこちらです。

特徴

  • Go言語製でJavaがなくても動かすことができるクライアントです
    • ただし、Digdagはサーバ / クライアント構成を前提としています
  • ビルド済みのバイナリを配布しているので、Goがなくても動きます!
  • 2017-06-25 現在できることとして…
    • 既にpushされたプロジェクトのワークフローをスタート・リトライすることができます
    • 特定のプロジェクト / ワークフローのタスクステータスが取得できます
    • タスクのステータスポーリングする機能もあります

使い方

使い方の詳細に関しては、READMEも合わせてご覧ください。

下記の1コマンドでインストールができます。 ダウンロードされるバイナリは /usr/local/bin にダウンロードされます。

$ curl https://raw.githubusercontent.com/szyn/mog/master/_tool/get | sh

Mac / Linux / Windowsに対応しています (※ 64bitのみ)

mogのデモ

紹介がてら、 mog のデモをやってみることとします。

  • demo プロジェクトの sample ワークフロー
  • サーバ=localhost、PORT=65432 で稼働中
# sample ワークフローを作成
$ digdag init -t ruby sample
2017-06-25 23:35:08 +0900: Digdag v0.9.9
  Creating sample/scripts/myclass.rb
  Creating sample/sample.dig
  Creating sample/.gitignore
Done. Type `cd sample` and then `digdag run sample.dig` to run the workflow. Enjoy!

# 作成したsampleディレクトリにcd
$ cd sample

# Digdagをサーバモードで起動し、demo ワークフローとしpush
$ digdag push demo
2017-06-25 14:41:30 +0000: Digdag v0.9.12
Creating /src/.digdag/tmp/archive-4893107422066944587.tar.gz...
  Archiving sample.dig
  Archiving scripts/myclass.rb
Workflows:
  sample.dig
Uploaded:
  id: 1
  name: demo
  revision: 41db9056-80bd-4716-8245-611ec02fd95b
  archive type: db
  project created at: 2017-06-25T14:41:33Z
  revision updated at: 2017-06-25T14:41:33Z

Use `digdag workflows` to show all workflows.

ここまでで、WEB UI上からはこうなっているはずです。
digdag-webui

ワークフローの定義はこんな感じ。
digdag-webui

ワークフローをスタートしてみる

それでは、mogを利用してワークフローをスタートしてみます。

$ mog start --project demo --workflow sample
{
    "id": "1",
    "index": 1,
    "project": {
        "id": "1",
        "name": "demo"
    },
    "workflow": {
        "name": "sample",
        "id": "1"
    },
    "sessionId": "1",
    "sessionUuid": "bcb6fb0c-1268-44e8-8af5-2ff5aefed861",
    "done": false,
    "success": false,
    "cancelRequested": false,
    "createdAt": "2017-06-25T14:42:34Z",
    "finishedAt": "",
    "workflowId": "1",
    "sessionTime": "2017-06-25T00:00:00+00:00",
    "params": {}
}

すると、mog経由でワークフローが実行されます。
digdag-webui

ステータスを取得してみる
# 試しに先程実行したタスクのステータスを確認
$ mog status --project demo --workflow sample +sample+teardown
{
   "id": "4",
   "fullName": "+sample+teardown",
   "parentId": "1",
   "config": {
       "label": "finish",
       "rb>": "MyClass.print_time",
       "time": "${session_time}"
   },
   "upstreams": [
       "3"
   ],
   "state": "success", # stateがsuccessになっている
   "exportParams": {},
   "storeParams": {},
   "stateParams": {},
   "updatedAt": "2017-06-25T14:42:42Z",
   "retryAt": null,
   "startedAt": "2017-06-25T14:42:41Z",
   "isGroup": false
}

現状はsuccessになると終了ステータスが0になります。 jqなどで、ゴニョゴニョすることも可能です。

基本的にはこんな感じになります。

また会社のチームの方に polling status を実装していただきましたので、
特定のタスクをpollingすることもできます(๑•̀ㅂ•́)و✧ (この場を借りまして…本当に感謝です!)

一言

まだまだ機能が少なかったり、物足りない部分があるのが事実です。
…が!そこは Gopherの皆さまやDigdagのコミュニティー皆さまのお力添えを受けつつ、
どんどん良いものとしていきたいなと考えています(๑•̀ㅂ•́)و✧

今後の展望とか

直近やりたいこととしてはCLI周りのテスト改善・機能追加を継続してやっていきたいな〜と考えています。

ぜひ検証目的でも良いので、使っていただいてフィードバックがもらえたら嬉しいです。
何か気がついたことがあれば、Issue・PRをよろしくお願いします!

© szyn 2017