vim-jp / ekiden

vim-jp記事執筆企画「駅伝」の管理リポジトリ
https://vim-jp.org/ekiden/
Creative Commons Attribution 4.0 International
49 stars 19 forks source link

Fix error handling in update-article #440

Closed thinca closed 1 month ago

thinca commented 1 month ago

If the command fails, a step fails immediately. In this case, MESSAGE does not output. As a result, the job fails due to malformed output file. To prevent this, change the command so that it always succeeds.

staticWagomU commented 1 month ago

私よくわからないのでどなたかレビューできる方お願いしますー

k-takata commented 1 month ago

あれ? || true では?

monaqa commented 1 month ago

あれ?たしかに。 && true だと意味なさそうですね

thinca commented 1 month ago

今回の場合はどちらでも大丈夫ですね。

背景について詳しく説明します。 このスクリプトは ${GITHUB_OUTPUT} ファイルに対して以下のフォーマットで書き込みをして、次の step でエラーメッセージを表示します。

ERROR_MESSAGE<<MESSAGE
エラーメッセージ
この部分のメッセージが次のステップで `ERROR_MESSAGE` の名前で参照できる
MESSAGE

ここで、run で実行されるスクリプトは shell が未指定の場合は -e 付きで実行されるため、中央のコマンド実行がエラーで終了するとスクリプト全体が終了してしまい、最後の MESSAGE が出力されないため ${GITHUB_OUTPUT} ファイルがフォーマットエラーになって後続の処理も失敗してしまいます。

そこで中央のコマンドが失敗しないようにしたいわけなんですが、Bash の -e については以下の仕様があります。

https://ja.manpages.org/bash

ただし、失敗したコマンドが、キーワード while または until の直後のコマンドの一部である場合、予約語 if または elif に続く条件式の一部である場合、 && または || によるコマンドのリストの一部である場合 (最後の && や || の後のコマンドを除く)、 パイプラインの中の最後のコマンド以外である、 コマンドの返り値が ! で反転されている場合、のいずれかであれば、シェルは終了しません。

つまり && true で最後のコマンドを成功にすればシェルが終了することはありません。

今回のケースにおいては || true でも結果はまったく同じなのですが、「シェルは終了したくないけど失敗したかどうかどうかで処理を分けたい」というケースにおいては && を使っておくと $? にちゃんとエラーが残っている、みたいな使い方ができたりします(|| を使うと $?0 になってしまう)。|| は握り潰す感じが強く出てしまうので私は割と && を使いがちです。

k-takata commented 1 month ago

なるほど 👍

thinca commented 1 month ago

たぶん問題なさそう、かつ Approve ももらっているのでひとまずマージしちゃいます。懸念があったら再度教えてもらえると!