GitHub Actions で SSH デバッグ! (debugging-with-tmate)


tl;dr

失敗したステップの次に #スニペット を貼って workflow 発火します。おわり!

導入

みなさん、GitHub Actions 使っていますか。他 CI サービスと比べていくつか機能が間に合ってなくて移行できない、みたいな人たちも結構いるんじゃないかと思います。今回は Circle CI などではできていた SSH デバッグができるよさそうな Actions をみつけたので、その方法を紹介しようと思います。(技術的には昔からできたが、その決定的な方法がなかった。)

今回紹介する Actions は debugging-with-tmate です。以下ではそのおすすめの使い方を紹介します。

https://github.com/marketplace/actions/debugging-with-tmate

SSH デバッグのおすすめ手順

  1. あるブランチでの、ある workflow のある step が失敗した
  2. そのブランチからデバッグ用のブランチを切る
  3. その step の次に debugging-with-tmateif: ${{ always() }} で差し込む。必要であれば on: を書き換えて workflow が発火する用にする。
  4. push して workflow を動かす。失敗した step の次で止まる。
  5. Actions のログが SSH する方法を教えてくれるので、それで SSH ログインする。
    • ssh *****@***.tmate.io するか、 Web 上で https://tmate.io/***** にアクセスする方法がある。ログに出力されるインストラクションに従えばいい。
  6. 💪デバッグ、原因究明
  7. 作業が終わったら、 touch continue ( cd してない場合 ) か sudo touch /continue で workflow を続行させるか、Web 上から Cancel Workflow する。

スニペット

    - name: Debug
      if: ${{ always() }}
      uses: mxschmitt/action-tmate@v3

必要であれば debugging-with-tmate の最新版がでていないか確認してください。

Web 上での手順

  1. ある workflow のある step が失敗した
  2. そのブランチからデバッグ用のブランチを切る
  3. その step の次に debugging-with-tmate を差し込む。
    1. 間違ってマージしないように draft にしておこう。
  4. ユーザー名がそのままワンタイムパスワードのよう。他人に教えないように!
  5. 例えば Web 版で入るとこんなかんじ。 ( checkout すらしてなくてなにもないけど! )

終わるときは、sudo touch /continue か、 cd していなければ touch continue で workflow を続行できます。
GitHub のリソース ( と private なら時間 ) を消費過ぎないためにも、作業が終わったら上記のようにするか、Web上で Cancel Workflow するようにしましょう。

どこの step で落ちるかわからない場合とかは各ステップに挟み込めばいいと思います。

セキュリティ

  • private repo なら、すべての情報が見れてしまうので他人に ssh 先のユーザー名を見せないこと、終わったらすぐ終了させることです。
  • public でも、SECRET が直接見れるってことはなさそうですが、SECRET にもとづいた step のあとに動かせるので、自分で フォークして duplicate して (フォークだと private にできなくてみんなで ssh できる地獄になりそう、) ためしてね、とするのが正しいかな。リポジトリオーナー含めて。めんどくさいな…仕方なし…
  • tmate.io は DigitalOcean によってホストされている。
  • サードパーティの Actions なので必要な範囲でチェックしてください。

まとめ

GHA 最高!