【新機能】Digdag v0.9.42でシンボリックリンクを含むプロジェクトでpush時に再帰的なコピーをするようになりました!

こんにちは。DA事業本部の春田です。

先週Digdagのバージョン0.9.42がリリースされ、シンボリックリンクの再帰的コピーの機能が追加されました!個人的にかなり待望していた機能です。

CLI: push command supports symbolic links outside of project. [#1199]

Add option to copy symbolic links pointing outside of project directo… · treasure-data/digdag@5a72fa0 · GitHub

この記事では、本機能の解説と検証をしていきます。

従来までの課題

例えば、以下のような階層構造のDigdagプロジェクトがあるとします。projectA/A.digprojectB/B.digで、共通のpython/print.pyを使用している場合、従来ではA.digあるいはB.digは、同じディレクトリ階層かそれ以下のスクリプトまでしか読み込めなかったため、digdag pushをする時にpython/print.pyprojectA/projectB/配下へいちいちコピーする必要がありました。

gitrepo/
├ projects/
│ ├ projectA/
│ │ └ A.dig
│ └ projectB/
│   └ B.dig
└ python/
  └ print.py

それが今回のアップデートによって、projectAprojectBpythonディレクトリへのシンボリックリンクを貼ることによって、push時に内部で自動的にコピーしてくれるようになったのです。シンボリックリンクを再帰的にコピーするには、以下のように--copy-outgoing-symlinksオプションを付与します。

$ cd gitrepo
$ digdag push projectA --project projects/projectA --copy-outgoing-symlinks

検証

環境はDockerで整えているので、詳細に知りたい方は以下のリポジトリを落としてみてください。

ディレクトリ構造は、以下のようになっています。project配下には、python/print_var.pyを使用するparam_server.digparams_file.digがあり、相対パスでproject外のpythonディレクトリを指したシンボリックリンクも合わせて配置しています。ちなみに相対パスで指定する時は、以下のようにリンクを貼るディレクトリに入ってから作成する必要があります。

$ cd digdag_params/digdag/project
$ ln -s ../python python
digdag_params/
├ digdag/
| ├ project/
│ │ ├ export_local_store.dig
│ │ ├ param_server.dig
│ │ ├ params_file.dig
│ │ └ python@ -> ../python
│ └ python/
│   └ print_var.py
└ postgres/

コンテナを立ち上げてdigdag push --copy-outgoing-symlinksを実行すると、実行ログ上にもコピーされていることが確認できます。

$ docker-compose up -d
Creating network "digdag_params_default" with the default driver
Creating digdag_params_postgresql_1 ... done
Creating digdag_params_digdag_1     ... done
$ docker exec -it $(docker-compose ps -q digdag) bash
root@e3e5787473b3:/# digdag push test --project /opt/etc/digdag/project/ --copy-outgoing-symlinks
2020-07-07 09:15:13 +0000: Digdag v0.9.42
Creating .digdag/tmp/archive-7459060208874350976.tar.gz...
  Archiving export_local_store.dig
  Archiving params_file.dig
  Archiving python/print_var.py
  Archiving param_server.dig
Workflows:
  export_local_store.dig
  params_file.dig
  param_server.dig
Uploaded:
  id: 1
  name: test
  revision: 39a88e6d-51c5-48c0-a70b-51f90b1ac7d0
  archive type: db
  project created at: 2020-07-07T08:31:09Z
  revision updated at: 2020-07-07T09:15:14Z

Use `digdag workflows` to show all workflows.

WebUI上からもスクリプトの存在が確認できました。

まとめ

Digdag v0.9.42以降では、シンボリックリンクをあるプロジェクト配下に貼れば、以下のコマンドで再帰的なコピーが可能です。

digdag push hoge --copy-outgoing-symlinks

お手製のデプロイスクリプトを使用していた方、ぜひ試してみてください!