🤔

GitHub Actionsのsecretsをdecodeしたら0byteのファイルになる問題

2021/12/11に公開

経緯

SecureなファイルをGitHub Actions上で扱う際、secrets経由で渡すことがあると思うが、secretsでは文字列しか扱えないのでBASE64でencodeして設定することになる。
そのBASE64をGitHub Actions上でdecodeしてファイルとして扱う。

FlutterでAndroidのapk生成をGitHub Actionsで行おうとした際、諸事情によりkeystoreとそのkeystoreのパスワードとかの情報を持つgradleを、BASE64でsecretsに配置した。
このkeystoregradleをdecodeする際にエラーとか起きず、ファイル化も出来ているものの0byteファイルになっていて、apk生成に失敗していたため、調べたり解決方法を探ってみた。

確認環境

  • GitHub Actionsでubuntu-latestを使用

結論

× (Here Strings方式)
base64 --decode <<< ${{ secrets.KEYSTORE_BASE64 }} > test.keystore
○ (echo & pipe方式)
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 --decode > test.keystore

一時、前者のHere Strings方式で正常にdecode&ファイル化出来ていたので、そのように記述していたのだが、今回何故か0byteファイルになる事象に遭遇したので、解決方法を探ってみたところ、後者のecho & pipe方式で正常にできることを確認できた。

また、GitHub ActionsのMarketplaceにあるDecode base64 into a file.でも、正常にdecode&ファイル化できることを確認した。(1 line commandで、出来ることをわざわざMarketplaceのAction使いたくなかった)

原因

原因は正直全くわかっていないです。
というのも、

  • Here Strings方式で正常に動いている時もあった
  • Here Strings方式echo & pipe方式でtextファイルにBASE64の文字列を吐き出させて比較したが差が一切ない

参考

https://github.community/t/how-to-pipe-a-github-secret-variable-into-a-file/116863
https://blog.hanhans.net/2018/12/11/bash-redirection/

Discussion