目的
業務のワークフロー単位でdigファイルで利用する変数を集約して使いたかった時に対応したメモです。
以下のように、業務ごとにymlファイルを定義して起動時に渡していたのですが、
# 開発環境で実行する場合の業務1のワークフロー
digdag run domain01_workflow.dig -P settings/domain01/development.yml
# 開発環境で実行する場合の業務2のワークフロー
digdag run domain02_workflow.dig -P settings/domain02/development.yml
# 本番環境で実行する場合の業務1のワークフロー
digdag run domain01_workflow.dig -P settings/domain01/production.yml
# 本番環境で実行する場合の業務2のワークフロー
digdag run domain02_workflow.dig -P settings/domain02/production.yml
スクリプトの中でymlをロードしてdigファイルに変数を渡すようにしたメモになります。
こんな感じで起動したくて、試してみました。
# 開発環境で実行する場合の業務1のワークフロー
digdag run domain01_workflow.dig
# 開発環境で実行する場合の業務2のワークフロー
digdag run domain02_workflow.dig
# 本番環境で実行する場合の業務1のワークフロー
digdag run domain01_workflow.dig
# 本番環境で実行する場合の業務2のワークフロー
digdag run domain02_workflow.dig
ディレクトリ構成
とりあえずこんな感じです。
.
|-- domain01_workflow.dig
|-- script
| `-- variables_aggregation.rb
`-- settings
`-- domain01
`-- development.yml
dig内で呼び出すymlをロードするスクリプト
script/variables_aggregation.rb
require 'yaml'
# 変数集約用のクラス
class VariablesAggregation
ENVIRONMENT = ENV['MODE']
# 業務1のワークフローで使う変数をセット
def domain01
path = "./settings/#{__method__}/#{ENVIRONMENT}.yml"
set_variables(path)
end
# 業務2のワークフローで使う変数をセット
def domain02
path = "./settings/#{__method__}/#{ENVIRONMENT}.yml"
set_variables(path)
end
private
def set_variables(path)
variables = YAML.load_file(path).map{ |k, v| [k.to_sym, v] }.to_h
Digdag.env.store(variables)
end
end
ymlファイルの定義
適当に以下のように作成しました。
環境ごとに作成するようにしています。
settings/domain01/development.yml
# 業務1で使う変数定義ファイル
MARIADB_HOST: 192.168.100.100
MARIADB_USER: 48hands
digファイルの定義と起動確認
こんな感じでymlをロードするスクリプトを呼び出すようにして、変数がdigファイルに引き渡されているか確認します。
domain01_workflow.dig
_export:
rb:
require: 'script/variables_aggregation'
+set_env:
rb>: VariablesAggregation.domain01
+task1:
echo>: My Setting variables: ${MARIADB_HOST} ${MARIADB_USER}
起動して以下のように実行できるか確認します。
今回は、開発用として実行したいので、環境変数MODE
をdevelopment
でセットしておきます。
export MODE=development
実行します。こんな感じで出力されるはず。
digdag run domain01_workflow.dig
2018-08-10 16:01:38 +0900: Digdag v0.9.27
...
My Setting variables 192.168.100.100 48hands
Success. Task state is saved at /tmp/hoge/.digdag/status/20180810T000000+0000 directory.
* Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
* Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.