自作CLIツールをGitHub Actions カスタムアクションで利用する

先日投稿した自作CLIツール chiritori をGitHub Actionsで利用するために、カスタムアクションを作りたくなりました。

https://docs.github.com/ja/actions/creating-actions/creating-a-docker-container-action によれば、Dockerコンテナを実行環境としたカスタムアクションを書くことができるようです。バイナリとして公開している自作CLIとの相性がよさそうなので、これを試してみます。

最終的にはカスタムアクションを利用し、リポジトリ内のソースコードに変更を加えるWorkflowを書くことを目指します。

Dockerfileを書く

先のドキュメントのとおり、自作CLIが動くイメージをビルドするDockerfileを書きます。

FROM alpine:3.14

RUN apk add --no-cache wget

# 今回はGitHubのReleasesからCLIのバイナリを取得した
RUN wget https://github.com/piyoppi/chiritori/releases/download/v0.2.0/x86_64-unknown-linux-musl.tar.gz && \
  tar -zxvf x86_64-unknown-linux-musl.tar.gz && \
  rm x86_64-unknown-linux-musl.tar.gz && \
  cp target/x86_64-unknown-linux-musl/release/chiritori /usr/local/bin/chiritori && \
  rm -rf target && \
  apk del wget

COPY entrypoint.sh /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

今回は、CLIのバイナリをGitHubのReleasesから取得しています。 ちなみに、今回の自作CLIではRustで実装しましたが、Alpine Linux上で動かす場合はビルドターゲットを以下のように設定し、ビルドしたものを利用します。

rustup target add x86_64-unknown-linux-musl

cargo build --release --target x86_64-unknown-linux-musl

action.yml を書く

inputs に記述した入力値を runs.args に指定することで、 entrypoint.sh に引数として与えられます。 詳細な書き方については公式ドキュメントを参照します。

name: 'actions-chiritori'
description: 'chiritori for GitHub Actions'
inputs:
  filename:
    description: 'Target file name'
    required: true
runs:
  using: 'docker'
  image: 'Dockerfile'
  args:
    - ${{ inputs.filename }}

エントリポイントを書く

entrypoint.sh に実行したいシェルスクリプトを記述します。

#!/bin/sh

# action.yml の runs.args の項に記述した値が引数として取得できる
FILENAME="$1"

# 自作CLIツールをここで使う (と filename に指定したファイルを加工する)
chiritori --filename=$FILENAME > $file.tmp

mv $file.tmp $file

ここまで来たら、このリポジトリをGitHub上にPushします。

カスタムアクションを使ってみる

実際にこのアクションをつかってみます。アクションを実行する対象のリポジトリには、ルートディレクトリに index.html が存在するとします。

カスタムアクションの entrypoint.sh はDockerfileに基づくコンテナ上で動作しますが、Actionsを実行するワーキングディレクトリ以下のファイルは設定不要でコンテナ内からアクセスできるようになっています。 (ref: https://docs.github.com/ja/actions/creating-actions/dockerfile-support-for-github-actions#workdir)

name: Testing custom-action

on: workflow_dispatch

jobs:
  update-code:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3       # index.htmlが含まれるコードをclone

      - uses: owner/custom-action@main  # カスタムアクションが存在するリポジトリを指定
        with:
          filename: index.html

これでindex.htmlをカスタムアクションで加工できました。

まとめ

自作CLIツール(バイナリ)をGitHub Actionsで利用するためのもろもろを試しました。その成果物として、chiritoriをGitHub Actionsで利用できるようにactions-chiritoriを作っています。

ではではー

このカウンタは @piyoppi/counter-tools を使っています。

クリックすると匿名でいいねできます。