ネットワークエラーが出てもexit statusが0...?
Travis(Ubuntu 16.04.6 LTS)でsfdx force:source:deploy
コマンドを使ってSandboxでテストを実行しているのですが、更新かけたばかりのSandboxだったからかgetaddrinfo ENOTFOUND
が出て失敗していました。
(ホスト名だけ変えてあります)
$ sfdx force:source:deploy -u sandbox -m ApexClass,ApexTrigger --testlevel RunLocalTests --checkonly --verbose --json -w 9
Unhandled rejection Error: getaddrinfo ENOTFOUND hogehoge-sandbox.cs114.my.salesforce.com hogehoge-sandbox.cs114.my.salesforce.com:443
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)
The command "sfdx force:source:deploy -u sandbox -m ApexClass,ApexTrigger --testlevel RunLocalTests --checkonly --verbose --json -w 9" exited with 0.
が、なぜか**exited with 0
を返してくるのでCI的には成功してしまうという...**
結果のJSONでちゃんと判定する
--json
を指定していると、結果をJSONで標準出力に返してくれるので、それでちゃんと判定してみます。
jq --exit-status
で結果のJSON内容で終了コードを変える
デプロイコマンドの後に jq --exit-status .result.success
でパイプしてjq
コマンドで{"result":{...(略)..., "success":false}}
が返ってきたときに失敗させます。
エラー出力に非JSONのエラーメッセージだけ出た場合はjq
がパースに失敗して非0な終了コードにさせるために2>&1
します。
sfdx (略) 2>&1 | jq --exit-status .result.success
参考: http://hoppie.hatenablog.com/entry/2016/07/29/142935
失敗した時は結果のJSONをログとして出力したい
パイプでjq
コマンドに流してしまうと失敗したときもJSONが見れなくなってしまうのでtee
を使って一時的にファイルにもJSONを吐き出しておいて、失敗の場合だけcat
で表示させます。
SUCCESS=$(sfdx (略) 2>&1 | tee result.json | jq --exit-status .result.success)
if [ "$SUCCESS" != "true" ]; then cat result.json; fi
最終的な.travis.yml
の抜粋
- SUCCESS=$(sfdx force:source:deploy -u sandbox -m ApexClass,ApexTrigger --testlevel RunLocalTests --checkonly --verbose --json -w 9 2&>1 | tee result.json | jq --exit-status .result.success)
- if [ "$SUCCESS" != "true" ]; then cat result.json; fi