<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ワークフロー on Marketechlabo</title><link>https://www.marketechlabo.com/tags/workflow/</link><description>Recent content in ワークフロー on Marketechlabo</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Mon, 14 Sep 2020 00:00:00 +0900</lastBuildDate><atom:link href="https://www.marketechlabo.com/tags/workflow/index.xml" rel="self" type="application/rss+xml"/><item><title>Digdag / TreasureData Workflowのエラー処理</title><link>https://www.marketechlabo.com/server-infrastructure/digdag-error/</link><pubDate>Mon, 14 Sep 2020 00:00:00 +0900</pubDate><guid>https://www.marketechlabo.com/server-infrastructure/digdag-error/</guid><description>
&lt;p&gt;この記事はDigdag v0.9.41時点の検証結果に基づく。&lt;/p&gt;
&lt;p&gt;Digdag / TreasureData Workflowのエラー処理。エラー時の処理を指定する&lt;code&gt;_error&lt;/code&gt;だけでなく&lt;code&gt;_check&lt;/code&gt;や&lt;code&gt;fail&amp;gt;:&lt;/code&gt;などの処理もあり、エラー発生／成功時の処理をカスタマイズできる。自由度が高く、ワークフローの階層構造とともにうまく使えばワークフローのコードが簡潔になる。公式ドキュメントの説明が不十分なので補足する。&lt;/p&gt;
&lt;h2 id="digdagがエラーと判定して_errorを発動する条件"&gt;Digdagがエラーと判定して&lt;code&gt;_error&lt;/code&gt;を発動する条件&lt;/h2&gt;
&lt;p&gt;コマンドの戻り値が0であれば正常、0でなければエラーとみなす。つまりシェルスクリプト（&lt;code&gt;sh:&amp;gt;&lt;/code&gt;）の場合は&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;であればエラーとなる。&lt;/p&gt;
&lt;h2 id="_errorを複数の階層で記述するとどうなるか"&gt;&lt;code&gt;_error&lt;/code&gt;を複数の階層で記述するとどうなるか&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;_error&lt;/code&gt;は同一階層には複数記述できないが、異なる階層には記述できる。以下のようにワークフローを設定する。
test.dig&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;+task1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;+task2&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;sh&amp;gt;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;exit 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;_error&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;echo&amp;gt;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Task 2 failed.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;_error&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;echo&amp;gt;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Task 1 failed.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;_error&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;echo&amp;gt;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Top failed.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;最上位階層に&lt;code&gt;Top failed.&lt;/code&gt;を表示する&lt;code&gt;_error&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;第2階層（&lt;code&gt;task1&lt;/code&gt;の階層）に&lt;code&gt;Task 1 failed.&lt;/code&gt;を表示する&lt;code&gt;_error&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;第3階層（&lt;code&gt;task2&lt;/code&gt;の階層）に&lt;code&gt;Task 2 failed.&lt;/code&gt;を表示する&lt;code&gt;_error&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;があり、第3階層でエラーを発生させる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell-session" data-lang="shell-session"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ubuntu@c0591acea4ab:~/digdag/wf_cdp$ digdag run -a -L test.log test.dig
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2020-09-13 23:17:39 +0900: Digdag v0.9.41
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Task 2 failed.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Task 1 failed.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Top failed.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;error:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * +test+task1+task2:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Command failed with code 1 (runtime)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Task state is saved at /home/ubuntu/digdag/wf_cdp/.digdag/status/20200912T000000+0000 directory.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * Use --session &amp;lt;daily | hourly | &amp;#34;yyyy-MM-dd[ HH:mm:ss]&amp;#34;&amp;gt; to not reuse the last session time.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第3階層→第2階層→最上位階層と順に動作する。エラー処理を記述した階層だけでなく、上位階層に伝播する。エラーはまとめてSlackに通知したいが細かい処理はワークフローによって分けたい場合などはこの挙動を踏まえておくといい。&lt;/p&gt;</description></item></channel></rss>