Digdagで環境毎に設定値を変える（RubyOnRails）

# Digdagについて
[Getting started](https://qiita.com/amagasu/items/92ad70c33f73ab613d08)
[Architecture](https://qiita.com/amagasu/items/572075dcc8b3c8640072)
[Concepts](https://qiita.com/amagasu/items/c850db3b564a7d6dc99c)
[Workflow definition](https://qiita.com/amagasu/items/2a8b84ac8fb4da2d9968)
[Scheduling workflow](https://qiita.com/amagasu/items/9f47a34884ba06d93264)
[Operators](https://qiita.com/amagasu/items/1f9b26a71c86fc9d4607)
Command reference
[Language API -Ruby](https://qiita.com/amagasu/items/b11527d92d259bd3ab48)
[Digdagで環境毎に設定値を変える（RubyOnRails）](https://qiita.com/HavenSpring/items/bb1c7fbae9175c1f9479)
[Digdagを用いてRubyOnRails環境でバッチ実装](https://qiita.com/HavenSpring/items/b3c3e26ef868f8d5eaf4)

# やること
Ruby on Rails チュートリアルのサンプルアプリケーションにDigdag用YAML形式の環境設定ファイルを作ってRubyタスクから環境変数を取得しDigdag環境変数に設定、別のRubyタスクからDigdag環境変数を取得できるまで確認しようと思います。

今回の説明にはRuby on Rails チュートリアルのサンプルアプリケーショコードは関係ありませんが次回のバッチ実装で使うため、タウンロードしてそのフロジェクトにDigdagのWorkflowを追加します。

# Ruby on Rails チュートリアルのサンプルアプリケーションダウンロード
https://github.com/yasslab/sample_app
![スクリーンショット 2020-07-15 23.06.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108475/43a1cd77-9f55-3be3-9956-5db704cf4e34.png)

# workflow生成
```
$ digdag init workflow
$ cd workflow
$ digdag run workflow.dig
```

以下のような結果が表示されればDigdagのWorkflow環境は問題なし〜

```rb:結果
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のタスクから参照します。

```iml:environment.yml
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
```

```rb:environment.rb
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``` で自動生成されたコードは削除して以下のコードを追加


```rb:workflow.dig
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

```

```rb:development環境で実行結果
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

```

```rb:staging環境で実行結果
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

```


```rb:production環境で実行結果
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のチュートリアルアプリのデータでバッチを作ってみようと思います。