これは革命が来たのでは? #runn開発者会議https://t.co/5ViOA46e0z
— k1LoW (@k1LoW) February 20, 2024
ふむふむ。
Support Custom runner (using Include runner) by k1LoW · Pull Request #805 · k1LoW/runn
This change allows defining a runner with different syntax while using existing runners.
もともとあるrunnerを使ったカスタム構文を作れる、と。
やってみた
こういうときのお遊びといったら、FizzBuzzと相場が決まっています(髙野調べ)。
まず、カスタムrunnerを定義して呼び出すrunbookを作ります。
custom-practice.yaml
desc: Custom runners
runners:
fizzbuzz:
path: fizz-buzz.yaml
steps:
-
loop: 20
fizzbuzz:
num: "{{ i+1 }}"
20回ループしながら、1→20までの数字を fizzbuzz
という名前で定義したカスタムランナーに、num
という名前で渡します。
ポイントはこちら。
- カスタムランナーは
runners
セクションのキーとして設定する - カスタムランナーの定義は別ファイル(今回は
fizz-buzz.yaml
)に切り出してインクルードする
次にカスタムランナーの定義であるfizz-buzz.yaml
を作ります。
fizz-buzz.yaml
desc: FizzBuzz runner
vars:
num: '{{ parent.nodes.num }}'
if: included
steps:
-
if: 'vars.num % 3 == 0 && vars.num % 5 != 0'
dump: "'fizz'"
-
if: 'vars.num % 3 != 0 && vars.num % 5 == 0'
dump: "'buzz'"
-
if: 'vars.num % 3 == 0 && vars.num % 5 == 0'
dump: "'fizz-buzz'"
-
if: 'vars.num % 3 != 0 && vars.num % 5 != 0'
dump: vars.num
ポイントはこちら
- 引数は
vars
セクションにて、parent.nodes
のmapから、親ファイル(この場合custom-practice.yaml
)のカスタムランナー実行時に指定した値を引っ張り出す - ステップを途中で止めて早期リターンするような機能はないので、愚直に全部に
if
で条件を指定する
実行結果がこちら。
$ runn run custom-practice.yaml
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizz-buzz
16
17
fizz
19
buzz
.
1 scenario, 0 skipped, 0 failures
ちゃんとFizzBuzzができていますね。
まとめ
今回はおふざけのようなカスタムランナーでしたが、記事の最初に紹介したPull Requestに含まれるファイルを見ると、結構柔軟に定義できるようです。 もうちょっとまともなものを作ったら、改めてご紹介しますね。