🐛

GitHub ActionsでSecretが参照できないとき

2024/07/26に公開
4

おきたこと

develop ブランチのときは本番環境とは分けて develop 環境のディレクトリにデプロイしたかった。
でリポジトリで Repository Secret に設定したはずの Secret が GitHub Actions から参照できない。

追加した Secret


Repository Secret

ソースコード

.github/workflows/foo.yaml
name: Release to Develop Environment
on:
  push:
    branches:
      - develop
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
# ---
# ~省略~
# ---
      - name: rsync deploy
        env:
          SSH_HOST: ${{ secrets.SSH_HOST }}
          SSH_USER: ${{ secrets.SSH_USER }}
          PATH: ${{ secrets.PATH_DEVELOP }} # ここのPATHが読めていなかった
        run: |
          rsync -auzrv -e "ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 22" --delete ./out/ $SSH_USER@$SSH_HOST:$PATH --exclude='.htaccess'

エラー内容

rsync: command not found
Error: Process completed with exit code 127.

エラーメッセージから rsync インストールされていないことを疑ったが、rsync をインストールしたりなども試したが違った。GitHub Actions とリモートサーバ両方インストールしても同じエラーが出る。
結論は env に入れた PATH が空になっていて失敗していた。

2024-08-02 追記
正しくは GitHub Actions の環境変数である PATH を上書きしてしまったことが原因でした。

解決方法

.github/workflows/foo.yaml
      - name: rsync deploy
        env:
          SSH_HOST: ${{ secrets.SSH_HOST }}
          SSH_USER: ${{ secrets.SSH_USER }}
-         PATH: ${{ secrets.PATH_DEVELOP }}
+         PATH_DEVELOP: ${{ secrets.PATH_DEVELOP }}
        run: |
-         rsync -auzrv -e "ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 22" --delete ./out/ $SSH_USER@$SSH_HOST:$PATH --exclude='.htaccess'
+         rsync -auzrv -e "ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 22" --delete ./out/ $SSH_USER@$SSH_HOST:$PATH_DEVELOP --exclude='.htaccess'

PATH_DEVELOP: ${{ secrets.PATH_DEVELOP }} と env に入れる変数名を Secret の変数名を揃えたら読み込めた。
公式ドキュメントを見てもなぜこんな動作になるのか分からなかったが、同じエラーが出て解決に困ったらお試しください。
どなたか該当のドキュメントご存じでしたら教えてください。

2024-08-02 追記
PATH を上書きした場合、rsyncssh コマンドを見つけることが出来なくなってしまうようです。
そのためコマンドは /usr/bin/rsync/usr/bin/ssh といったフルパスにする必要があります。
そもそも REMOTE_PATH などの変数にして PATH 環境変数を上書きしないようにするのが良さそうです。


追記部分はコメント欄で re3turn さんに教えていただきました。ありがとうございました。

参考サイト

Discussion

re3turnre3turn

PATH環境変数が PATH_DEVELOPの値で上書きされたことでrsyncコマンドを見つけることができなくなっていると思われます。

PATH_DEVELOP に具体的にどんな値が入っているのかはこの記事からはわかりませんがエラーメッセージや解決方法rsyncコマンドの引数に指定していることから推測するに、PATH_DEVELOPはリモート先のパスであり、rsyncコマンドを実行している環境のPATH環境変数に設定するような値ではないと考えられます。

他の解決方法としては rsync コマンドのフルパスを指定する方法が考えられますが、PATH環境変数をPATH環境変数以外の表記で上書きするのはバグを生みやすいと思われるのでおすすめしません。

      - name: rsync deploy
        env:
          SSH_HOST: ${{ secrets.SSH_HOST }}
          SSH_USER: ${{ secrets.SSH_USER }}
          PATH: ${{ secrets.PATH_DEVELOP }}
        run: |
-          rsync -auzrv -e "ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 22" --delete ./out/ $SSH_USER@$SSH_HOST:$PATH --exclude='.htaccess'
+          /usr/bin/rsync -auzrv -e "ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 22" --delete ./out/ $SSH_USER@$SSH_HOST:$PATH --exclude='.htaccess'
なんとかなんとか

なるほど。上書きしてしまっていたのですね。
PATH_DEVELOPはご推察の通りリモート先のパスです。リモート先でディレクトリごとにprod環境・develop環境が分かれており、PATH_DEVELOPにはdevelop環境のディレクトリPATHを入れていました。

ご提示いただいたrsyncコマンドのフルパスを試したところ、not found path のようなエラーが出てしまったので、上書きされるとき意図しない型で入ってしまったのかもしれません。

いずれにしろPATHは予約済みのように編集不可という理解でいようと思います。

re3turnre3turn

おそらく、ssh コマンドが見つからないのではないでしょうか?sshコマンドについてもフルパスにしてあげる必要がありそうです。

    /usr/bin/rsync -auzrv -e "/usr/bin/ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 22" --delete ./out/ $SSH_USER@$SSH_HOST:$PATH --exclude='.htaccess'

PATH環境変数は編集ができないというわけではありません。
編集することも可能です(GitHub Actionsではあまり上書きするような用途は思いつきませんが)。

シェル(今回の場合はBash)は、外部コマンドを実行する際にそのコマンドの実行ファイルの場所をPATH環境変数にリストされているディレクトリから探します。
https://zenn.dev/masaruxstudy/articles/dba70a964797c4

GitHub Actionsのubuntu-latestのランナーはデフォルトで以下のようなPATH環境変数が定義されています。

$ echo $PATH
/snap/bin:/home/runner/.local/bin:/opt/pipx_bin:/home/runner/.cargo/bin:/home/runner/.config/composer/vendor/bin:/usr/local/.ghcup/bin:/home/runner/.dotnet/tools:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

このPATH環境変数をリモート先のパスで上書きしたことで Bashはrsyncコマンドを見つけることができずrsync: command not found となったということです。

なんとかなんとか

なるほど。rsyncコマンドのフルパスを試したときのnot found path のようなエラーもコマンドのPATHのことだったのですね。リモート先のパスが見つからなかったのかと勘違いしてました。
スッキリです。ありがとうございます。投稿を追記・修正させていただきます。