🔑

actを使用したGitHub Actionsのローカル実行でコンテナにログインする

2023/09/04に公開

はじめに

actの特定のステップ実行時にログイン出来たら、デバッグに便利だなと思い、方法を探していたところ以下のissueに出会いました。

https://github.com/nektos/act/issues/1050
原文

It would be really useful to have a way to connect to a workflow with an interactive shell at a designated breakpoint for debugging purposes.


日本語

それはデバッグ目的のために指定されたブレークポイントでインタラクティブシェルに接続する方法があると非常に便利です。

このissueをざっと眺めたところ、方法を考案したので紹介します。

概要

先程のissueでも@dheerajbhaskarさんが、考案された方法として以下のような方法がありますが、敢えて行いません。

  1. step 3"で止めたい場合は、その"step 3"の後のすべての手順をコメントアウトしてください
  2. オプションact -rを使用してactを実行します。
  3. Actは手順を実行し、コンテナを動作中の状態で残しました。コンテナ内のシェルを取得して、あなたの作業を行ってください:docker exec -it <container> /bin/bash

注意: -rオプションを使用すると、actはコンテナを再利用します。GitHubはコンテナを再利用しません。したがって、-rオプションなしでワークフローをテストすることを忘れないでください。

私の方法としては、ややhack的ですが、リバースシェルを使います。
以下の3つメリットが有ります。

  1. stopさせたいステップに挿入するだけで良い。(先のstepをコメントアウトする必要はない)
  2. GitHub Actionsで使用される環境変数を使用できる。
  3. sshdなどをrunnerにインストールする必要がない。

ちなみにリバースシェルとは

以下を参照して下さい。
https://mymanfile.com/?p=1543
しかしながら、悪用するわけではないので安心して下さい。上に挙げた3つのメリットから敢えて使用しています。

やり方

使用するのは、以下のデモリポジトリとします。
https://github.com/cplee/github-actions-demo
テキトーにローカルにcloneしてきて下さい。

  1. まず、ホストPCでターミナルを開き、以下のコマンドを実行し、接続を待機します。
    <Port>はお好みで、私は8000番を使用しました。
nc -nlvp <Port>
  1. 次に、以下のstepをデバッグしたいstepの直前に挿入します。
    <HostIP>はdocker hostのipアドレス、<Port>は1で待機させているポート番号を使用して下さい。
name: CI
on: push

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - run: npm install
+   - name: Reverse shell for Debug
+     shell: bash
+     run: |
+       bash -i >& /dev/tcp/<HostIP>/<Port> 0>&1
+     env: 
+       ENV_1: chiwawa123
    - run: npm test

  1. workflowを実行します。
act -j test
  1. そうするとworkflowが動き、2で挿入したtaskで停止します。その際に1で接続を待機したターミナル上でrunnerのshellが開かれていて操作が可能になります。
$ nc -nlvp 8000
Listening on 0.0.0.0 8000
Connection received on 192.168.1.134 60758
root@chiwawa-desktop:/home/chiwawa/repo# echo "${TEST_ENV}"
chiwawa123

Discussion