🤯

GitHub Actionsで改行コードにハマった

2024/06/22に公開2

ローカルにある改行を含むファイルをGitHub Actionsで利用しようとしていました。
ところが、スクリプト側で渡された変数を \n で分割したりして処理を進めていたのですが、思うような挙動になりませんでした。
ということで一旦検証してみます。

検証

GitHub ActionsのVariablesに以下のような値を設定してみます。

改行コード入りの文字列を設定

Hello
World

なんの変哲もない改行入りのテキストです。
これを以下のスクリプトで文字コードで出力してみます。

echo $VALUE1 > temp.txt
xxd -p temp.txt

GitHub Actions上で実行してみると

48656c6c6f0d20576f726c640a

という結果になりました。
同じことをローカルでやってみます。

すると

48656c6c6f0a576f726c640a

という値になりました。
分かりづらいですが中央部分が 0d200a という違いがあります。

0d はCR( \r )、 20 はスペースですね。
0a はLF( \n )で改行です。欲しいのはこちら。

僕の設定の仕方が悪いのか分かりませんが、改行コードが変わり、スペースまで埋め込まれていたことが分かりました。

対処方法

いくつか対処方法はあると思います。
\r \n に置換しちゃうというのも手かもしれません。
僕はGitHub Actionsに設定する文字列をBase64でエンコードして、利用する時にデコードするようにして対処しました。
GitHub ActionsのVariablesに改行を含む文字列を設定しようとしている方はお気をつけて ✋

興味があるか分かりませんが検証はこちらで行いました。

https://github.com/fromkk/NewLineTest

Discussion

yorifujiyorifuji

原因としては

  • GitHubのフォームでの改行がCRLFとして扱われている(Webアプリの実装依存)
    • CRLFはWindows系での改行コード
    • LFはUNIX系(macOS含む)の改行コード
  • shellとechoの副作用でLFがスペースに置き換わった

あたりでしょうか。

echo "$VALUE1"とすることでCRLFとして出力させることはできると思いますが元のファイルの改行コードがLFだとすれば厳密には中身が別物になってしまいますね。

結局はbase64に変換するのが最善手ですね!

Kazuya UeokaKazuya Ueoka

ブラウザがPOSTする値もあるかも?と思ったので調べる必要あるかもしれないですね(今回はArcを利用しました)