Digdagについて
Getting started
Architecture
Concepts
Workflow definition
Scheduling workflow
Operators
Command reference
Language API -Ruby
Digdagで環境毎に設定値を変える(RubyOnRails)
Digdagを用いてRubyOnRails環境でバッチ実装
やること
Ruby on Rails チュートリアルのサンプルアプリケーションにDigdag用YAML形式の環境設定ファイルを作ってRubyタスクから環境変数を取得しDigdag環境変数に設定、別のRubyタスクからDigdag環境変数を取得できるまで確認しようと思います。
今回の説明にはRuby on Rails チュートリアルのサンプルアプリケーショコードは関係ありませんが次回のバッチ実装で使うため、タウンロードしてそのフロジェクトにDigdagのWorkflowを追加します。
Ruby on Rails チュートリアルのサンプルアプリケーションダウンロード
https://github.com/yasslab/sample_app
workflow生成
$ digdag init workflow
$ cd workflow
$ digdag run workflow.dig
以下のような結果が表示されればDigdagのWorkflow環境は問題なし〜
2020-07-15 22:01:56 +0900 [INFO] (0017@[0:default]+workflow+setup): echo>: start 2020-07-15T00:00:00+00:00
start 2020-07-15T00:00:00+00:00
2020-07-15 22:01:57 +0900 [INFO] (0017@[0:default]+workflow+disp_current_date): echo>: 2020-07-15 00:00:00 +00:00
2020-07-15 00:00:00 +00:00
2020-07-15 22:01:57 +0900 [INFO] (0017@[0:default]+workflow+repeat): for_each>: {order=[first, second, third], animal=[dog, cat]}
2020-07-15 22:01:57 +0900 [INFO] (0018@[0:default]+workflow+repeat^sub+for-0=order=0=first&1=animal=1=cat): echo>: first cat
first cat
2020-07-15 22:01:57 +0900 [INFO] (0019@[0:default]+workflow+repeat^sub+for-0=order=1=second&1=animal=0=dog): echo>: second dog
second dog
2020-07-15 22:01:58 +0900 [INFO] (0020@[0:default]+workflow+repeat^sub+for-0=order=1=second&1=animal=1=cat): echo>: second cat
second cat
2020-07-15 22:01:58 +0900 [INFO] (0022@[0:default]+workflow+repeat^sub+for-0=order=2=third&1=animal=1=cat): echo>: third cat
third cat
2020-07-15 22:01:58 +0900 [INFO] (0021@[0:default]+workflow+repeat^sub+for-0=order=2=third&1=animal=0=dog): echo>: third dog
third dog
2020-07-15 22:01:58 +0900 [INFO] (0017@[0:default]+workflow+repeat^sub+for-0=order=0=first&1=animal=0=dog): echo>: first dog
first dog
2020-07-15 22:01:58 +0900 [INFO] (0017@[0:default]+workflow+teardown): echo>: finish 2020-07-15T00:00:00+00:00
finish 2020-07-15T00:00:00+00:00
YAML形式の環境変数ファイル作成
$ cd workflow
$ mkdir config
$ vi environment.yml
development, staging, production別にurl, user,passwordを設定しました。
この環境変数をDigdagのタスクから参照します。
development:
url: development.jp
user: development_user
password: development_password
staging:
url: staging.jp
user: staging_user
password: staging_password
production:
url: procuction.jp
user: procuction_user
password: procuction_password
YAMLファイルの環境変数をDigdagの環境変数に設定するRubyクラスを作ります。
workflow
フォルダの下にtasks
フォルダを作ります
そこにenvironment.rbを作ります。こちらのクラスがYAMLファイルから環境変数を読み取ってDigdagの環境変数に保存します。
$ cd workflow
$ mkdir tasks
require 'yaml'
class Environment
def load
environment = Digdag.env.params['environment']
environment = case environment
when 'stg'
'staging'
when 'prd'
'production'
else
'development'
end
# 該当する環境の環境変数を取得
config = YAML.load_file('config/environment.yml')[environment]
config.each do |key, value|
# Digdag環境変数に保存
Digdag.env.store(key.to_sym => value)
end
end
end
Workflow.digにタスク追加
$ digdag init workflow
で自動生成されたコードは削除して以下のコードを追加
timezone: UTC
+load_environment:
rb>: Environment.load
require: 'tasks/environment'
+print_environment_value:
sh>: echo url:${url} user:${user} password:${password}
+print_ruby:
rb>: DigdagEnvironment.show
require: 'tasks/digdag_environment'
■load_environmentタスク:Digdag実行の時の環境パラメーターから該当する環境変数をDigdag環境変数に設定するタスク
■print_environment_value:Digdag環境変数をシェルタスクから出力するタスク
■print_ruby:RubyクラスからDigdag環境変数を出力するタスク
development環境から実行してみます。
$digdag run workflow.dig -p environment=development --rerun
2020-07-15 22:49:35 +0900 [INFO] (0017@[0:default]+workflow+load_environment): rb>: Environment.load
2020-07-15 22:49:35 +0900 [INFO] (0017@[0:default]+workflow+print_environment_value): sh>: echo url:development.jp user:development_user password:development_password
url:development.jp user:development_user password:development_password
2020-07-15 22:49:36 +0900 [INFO] (0017@[0:default]+workflow+print_ruby): rb>: DigdagEnvironment.show
url: development.jp
user: development_user
password: development_password
次はStaging環境
$digdag run workflow.dig -p environment=stg --rerun
2020-07-15 22:55:33 +0900 [INFO] (0017@[0:default]+workflow+load_environment): rb>: Environment.load
2020-07-15 22:55:33 +0900 [INFO] (0017@[0:default]+workflow+print_environment_value): sh>: echo url:staging.jp user:staging_user password:staging_password
url:staging.jp user:staging_user password:staging_password
2020-07-15 22:55:34 +0900 [INFO] (0017@[0:default]+workflow+print_ruby): rb>: DigdagEnvironment.show
url: staging.jp
user: staging_user
password: staging_password
最後にProduction環境
$digdag run workflow.dig -p environment=prd --rerun
2020-07-15 22:56:30 +0900 [INFO] (0017@[0:default]+workflow+load_environment): rb>: Environment.load
2020-07-15 22:56:30 +0900 [INFO] (0017@[0:default]+workflow+print_environment_value): sh>: echo url:procuction.jp user:procuction_user password:procuction_password
url:procuction.jp user:procuction_user password:procuction_password
2020-07-15 22:56:31 +0900 [INFO] (0017@[0:default]+workflow+print_ruby): rb>: DigdagEnvironment.show
これで環境変数設定が終わったので次回からはRubyOnRailsのチュートリアルアプリのデータでバッチを作ってみようと思います。