🐛
GitHub ActionsでSecretが参照できないとき
おきたこと
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 を上書きした場合、rsync
や ssh
コマンドを見つけることが出来なくなってしまうようです。
そのためコマンドは /usr/bin/rsync
や /usr/bin/ssh
といったフルパスにする必要があります。
そもそも REMOTE_PATH
などの変数にして PATH 環境変数を上書きしないようにするのが良さそうです。
追記部分はコメント欄で re3turn さんに教えていただきました。ありがとうございました。
Discussion
PATH環境変数が
PATH_DEVELOP
の値で上書きされたことでrsyncコマンドを見つけることができなくなっていると思われます。PATH_DEVELOP
に具体的にどんな値が入っているのかはこの記事からはわかりませんがエラーメッセージや解決方法rsyncコマンドの引数に指定していることから推測するに、PATH_DEVELOP
はリモート先のパスであり、rsyncコマンドを実行している環境のPATH環境変数に設定するような値ではないと考えられます。他の解決方法としては
rsync
コマンドのフルパスを指定する方法が考えられますが、PATH環境変数をPATH環境変数以外の表記で上書きするのはバグを生みやすいと思われるのでおすすめしません。なるほど。上書きしてしまっていたのですね。
PATH_DEVELOP
はご推察の通りリモート先のパスです。リモート先でディレクトリごとにprod環境・develop環境が分かれており、PATH_DEVELOP
にはdevelop環境のディレクトリPATHを入れていました。ご提示いただいたrsyncコマンドのフルパスを試したところ、
not found path
のようなエラーが出てしまったので、上書きされるとき意図しない型で入ってしまったのかもしれません。いずれにしろ
PATH
は予約済みのように編集不可という理解でいようと思います。おそらく、
ssh
コマンドが見つからないのではないでしょうか?sshコマンドについてもフルパスにしてあげる必要がありそうです。PATH環境変数は編集ができないというわけではありません。
編集することも可能です(GitHub Actionsではあまり上書きするような用途は思いつきませんが)。
シェル(今回の場合はBash)は、外部コマンドを実行する際にそのコマンドの実行ファイルの場所をPATH環境変数にリストされているディレクトリから探します。
GitHub Actionsのubuntu-latestのランナーはデフォルトで以下のようなPATH環境変数が定義されています。
このPATH環境変数をリモート先のパスで上書きしたことで Bashはrsyncコマンドを見つけることができず
rsync: command not found
となったということです。なるほど。rsyncコマンドのフルパスを試したときの
not found path
のようなエラーもコマンドのPATHのことだったのですね。リモート先のパスが見つからなかったのかと勘違いしてました。スッキリです。ありがとうございます。投稿を追記・修正させていただきます。