tmate を使って GitHub Actions の環境に ssh またはブラウザーから端末のシェルに繋いで、調査やデバッグなどができます。

環境

最初に試した時は macos には対応していなかったのですが、今は対応していました。 Windows は対応していません。

概要

tmate という tmux のセッションを公開してリモートから接続できるものがあって、 そのサーバー側を GitHub Actions 側で動かしてくれる Debugging with tmate があります。

それを steps に追加すると URL にログが出てくるので、それを開くとシェルに接続できます。 (ssh 接続もできるようですが使ったことがないのでどういう感じかはわかりません。)

問題点

GitHub Actions のログ表示部分の挙動が微妙で URL が見えないままログ表示が更新されずに止まってしまうことがあります。 そういう時は諦めてキャンセルして再実行するしかなさそうです。

セッションは共有のようなので、複数のブラウザーで同じ URL を開くと同じシェルに繋がって、片方で入力したものが他方にも見えるなど、 操作が混ざっていました。

公認?

Marketplace に登録されていて、 Streamline your workflow with GitHub Actions from open source maintainers - The GitHub Blog でも紹介されているので、 シェルアクセスは許可されていないのに無理やり穴を開けている、という扱いにはならなさそうなので、 そのあたりは心配しなくても良さそうです。

Actions のログに残らないからといって、マイニングとかに使うのは当然ダメだと思います。

使用例

実用的に使った例としては ruby/ruby の macos.yml から slack 通知などを削ったものを自分のレポジトリに置いて以下のように書き換えて試していました。

name: ruby-macos
on:
  repository_dispatch:
    types:
      - ruby-macos

jobs:
  latest:
    runs-on: macos-latest
    strategy:
      matrix:
        test_task: [ "check", "test-bundler", "test-bundled-gems" ]
      fail-fast: false
    if: "!contains(github.event.head_commit.message, '[ci skip]')"
    steps:
      - name: Disable Firewall
        run: |
          sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate off
          sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
      # Not using official actions/checkout because it's unstable and sometimes doesn't work for a fork.
      - name: Checkout ruby/ruby
        run: |
          git clone --depth=50 https://github.com/ruby/ruby src
      - name: Install libraries
        run: |
          export WAITS='5 60'
          cd src
          tool/travis_retry.sh brew update
          tool/travis_retry.sh brew install gdbm gmp libffi openssl@1.1 zlib autoconf automake libtool readline
      - name: Set ENV
        run: |
          echo '##[set-env name=JOBS]'-j$((1 + $(sysctl -n hw.activecpu)))
      - name: Autoconf
        run: |
          cd src
          autoconf
      - name: Configure
        run: |
          mkdir build
          cd build
          ../src/configure -C --disable-install-doc --with-openssl-dir=$(brew --prefix openssl@1.1) --with-readline-dir=$(brew --prefix readline)
      - name: Make
        run: make -C build $JOBS
      - name: Tests
        run: make -C build $JOBS -s $
        env:
          MSPECOPT: "-ff" # not using `-j` because sometimes `mspec -j` silently dies
          RUBY_TESTOPTS: "-q --tty=no"
          # Remove minitest from TEST_BUNDLED_GEMS_ALLOW_FAILURES if https://github.com/seattlerb/minitest/pull/798 is resolved
          TEST_BUNDLED_GEMS_ALLOW_FAILURES: "minitest"
      - name: Setup tmate session
        uses: mxschmitt/action-tmate@v1
        if: always()
Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published