Open3

GitHub Actionsで使うカスタムアクションを作る

Hirosuke KayabaHirosuke Kayaba

きっかけ

UnityのTest Runner実行/結果表示をGameCIを利用して自動化しようとしていたところ、Apple Silliconのmac(Self-hosted runner)では実行できなくて困ってしまった。
ないのなら、作るしかない。

作りたいもの(随時更新)

要件は以下

共通

  • テスト実行のAction(Test Action)と結果表示のAction(Result Action)は分ける

Test Action

  • inputにPlayMode/EditMode、もしくは両方を取る
  • inputに結果ファイル(.xml)の出力パス、名前を取る

Result Action

  • inputにTest Runnerで出力するxmlのパスを取る
  • Test Runnerの通過数、エラー数、無視数を表示する
  • エラーとなった場合、ログをGitHub上で表示できる
Hirosuke KayabaHirosuke Kayaba

自作Action実装の検討

アクションの種類の選定

Image from Gyazo
参照:
https://docs.github.com/ja/actions/creating-actions/about-custom-actions#types-of-actions

mac, winでも動いてほしいのでDockerは除外する。
複合アクションはかなり応用が効いて、Actionの中身はGoで書いたりしている人がいる。素敵。
https://zenn.dev/keitacoins/articles/5a3a560831e40a
これが出来るということはC#で書いたりも出来そう。
今回まずはオーソドックスな方法を取りたいので複合アクション×JavaScript(TypeScript) を採用。

Hirosuke KayabaHirosuke Kayaba

ChatGPTに作り方を聞いてみよう

作り方が色々あるせいで中々求めている情報を得にくく、ChatGPTに聞いてみることにした。

質問

GitHub ActionsのカスタムアクションをTypeScriptを使って作成したいです。作成までの流れを教えてください。

回答

GitHub Actionsでカスタムアクションを作成するためにTypeScriptを使用する手順を以下に示します。TypeScriptでのカスタムアクションは、公式のテンプレートリポジトリを基にして進めるとスムーズです。

1. リポジトリのセットアップ

1.1. 新しいリポジトリの作成

GitHubで新しいリポジトリを作成します。

1.2. クローン

新しく作成したリポジトリをローカルにクローンします。

git clone https://github.com/YOUR_USERNAME/YOUR_REPOSITORY.git
cd YOUR_REPOSITORY

2. テンプレートのセットアップ

2.1. TypeScriptテンプレートを使用

GitHubのTypeScriptテンプレートを利用するのが便利です。以下のコマンドでテンプレートをクローンします。

git clone https://github.com/actions/typescript-action.git .

2.2. 必要なパッケージのインストール

npm install

3. アクションの作成

3.1. srcディレクトリの編集

src/main.tsにアクションのロジックを実装します。例えば、以下のような簡単な例を作成します。

import * as core from '@actions/core';
import * as github from '@actions/github';

async function run() {
  try {
    const myInput = core.getInput('myInput');
    core.debug(`Hello ${myInput}!`);
    const payload = JSON.stringify(github.context.payload, undefined, 2)
    core.debug(`The event payload: ${payload}`);
  } catch (error) {
    core.setFailed(error.message);
  }
}

run();

3.2. action.ymlの編集

action.ymlファイルを作成し、アクションのメタデータを記述します。

name: 'My Custom Action'
description: 'A custom action using TypeScript'
inputs:
  myInput:
    description: 'An input for the action'
    required: true
outputs:
  myOutput:
    description: 'An output from the action'
runs:
  using: 'node12'
  main: 'lib/main.js'

4. ビルドとデプロイ

4.1. TypeScriptのコンパイル

TypeScriptをJavaScriptにコンパイルします。

npm run build

4.2. distフォルダの作成

コンパイルされたファイルを含むdistフォルダが生成されます。

5. リポジトリへのプッシュ

5.1. コミットとプッシュ

変更をコミットし、リポジトリにプッシュします。

git add .
git commit -m "Create custom GitHub Action with TypeScript"
git push origin main

6. アクションの使用

6.1. ワークフローでの利用

リポジトリ内のワークフローファイル(例えば.github/workflows/main.yml)にアクションを追加します。

name: My Workflow
on: [push]
jobs:
  my_job:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v2
    - name: Run custom action
      uses: YOUR_USERNAME/YOUR_REPOSITORY@main
      with:
        myInput: 'World'

これで、GitHub ActionsでTypeScriptを使用したカスタムアクションの作成が完了です。必要に応じて、さらに詳細な機能やエラーハンドリングを追加してください。