テスト用の Geth(go-ethereum) を用意する GitHub Actions を作った

1 min read読了の目安(約1700字

モチベーション

Ethereum を使ったアプリケーションの開発用のノードの選択肢として ganache-cliHardhat Network などがあります。これらは @ethereumjs/vm をバックエンドにした実装です。@ethereumjs/vm は Ethereum VM の TypeScript 実装です。npm パッケージであるため JS/TS からの取り回しやすさは利点なのですが、この実装はメインネットで運用されているわけではなく、実装の再現度に不安が残ります。
理想は Geth や Parity などをノードにしてテストを実行してアプリケーションの挙動を担保することです。そこで、今回は Geth を簡単に用意できる GitHub Actions を作りました。

使い方

https://github.com/odanado/geth-action

以下はノードの RPC のエンドポイントに curl でリクエストを投げる例です。

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest
    name: test
    steps:
    - uses: actions/checkout@v2
    - name: Geth Action
      uses: odanado/geth-action@v0.0.10
      id: geth
    - name: curl
      run: |
        curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' ${{ steps.geth.outputs.rpc_url }} -H "Content-Type: application/json"
      shell: bash

outputsrpc_url があり、ここにエンドポイントが指定されています。outputs にはこれ以外に ETH を持っているアカウントの address/private_key/passwordnetwork_id/chain_id などがあります。テストに必要であれば適宜これらの値を使うことができます。

作る上で得た知見

複合実行ステップアクションには pre/post オプションを指定できない

今回は 複合実行ステップ アクション を使って GitHub Actions を作成しました。これはコマンド列を GitHub Actions として公開できる機能です。
Docker コンテナのアクションや JavaScript アクションでは pre-entrypoint/post-entrypoint や pre/post オプションを指定して、アクションの実行前や実行後に任意の処理を実行できます。当初はこの機能を使ってテスト後に自動的に Geth を終了させるようにしようと考えていました。
しかし、複合実行ステップアクションにはこれに該当するオプションは存在しないようでした。
今回は GitHub Actions の VM が落ちると同時に Geth 自動的に落ちてくれるので問題ないと考えて、JavaScript アクションへの移行は行いませんでしたが、なにか問題が発生したら移行しようと考えています。