GitHub Actions で apt/perl/node/python/ruby ツールをインストールしてキャッシュする

# Summary

This is an article about GitHub action to automate apt/perl/node tool installation.  Installed files are cached for later use.  `use-apt-tools` and `use-perl-tools` are for apt/perl tools.  `use-any-tools` is for both.  `install-node-modules` is for node package installation and cache all `node_modules` under the specified directory.  Read each repository's README.  Visit https://github.com/tecolicom/actions.

# 必要なツールを簡単にインストールしたい

ある作業で GitHub Actions を使おうとしていて、その中で apt と perl と node のツールが必要になったので、とりあえず bash action で工夫してみたという話。結論としては、こんな action を書くだけで、必要なツールがすべて使えるようにしました。最初の実行にはインストールのための時間がかかるけど、2回目からはキャッシュが効くので数秒で終わります。

追記： その後、Homebrew、Python、Ruby のツールをインストールするアクションを追加しています。また、`use-x-tools` は `use-any-tools` という名前に変えました。

```yaml
- uses: tecolicom/actions-use-any-tools@v1
  with:
    apt-tools:  bmake
    perl-tools: App::Greple App::optex::textconv
```

node については、作業ディレクトリ以下に lock ファイルがあると、そこでインストールコマンドを実行して `node_modules` ディレクトリをキャッシュします。

```yaml
- uses: tecolicom/actions-install-node-modules@v1
  with:
    root: Script/lib/node
```

## [actions-use-apt-tools](https://github.com/tecolicom/actions-use-apt-tools)

`tools` に使いたいツール名を書くだけ。

```yaml
- uses: tecolicom/actions-use-apt-tools@v1
  with:
    tools: bmake
```

## [actions-use-perl-tools](https://github.com/tecolicom/actions-use-perl-tools)

同じく `tools` に、CPAN モジュールを並べるだけ。

```yaml
- uses: tecolicom/actions-use-perl-tools@v1
  with:
    tools: App::Greple App::optex::textconv App::sdif
```

## [actions-use-any-tools](https://github.com/tecoli-com/actions-use-any-tools)

`apt` と `perl` のツールを一度に指定できるようにしたもの。各ツール固有のパラメータを指定することはできないけど、普通はそんな必要はないはず。

```yaml
- uses: tecolicom/actions-use-any-tools@v1
  with:
    apt-tools:  >-
      bmake
    perl-tools: >-
      App::Greple
      App::optex::textconv
      App::sdif
```

## [actions-install-node-modules](https://github.com/tecolicom/actions-install-node-modules)

node のツールは、作業ディレクトリにあるので、`lock` ファイルを探して、発見したらでパッケージをインストールします。使っているのは `package-lock.json` だけなんですが、見様見真似で `yarn.lock` にも対応してあります。`root` パラメータを指定すればそのディレクトリを対象にして、指定がなければカレントディレクトリの下をすべて検索します。

```yaml
- uses: tecolicom/actions-install-node-modules@v1
  with:
    root: Script/lib/node
```

## 諸々

- Docker イメージ作れよという意見はあると思います。
- ubuntu-latest でしか試してません。
- 処理系はシステム標準のものを使います。特別なバージョンが必要な場合には、別途インストールします。一度、バージョンを指定するパラメータを入れたけど、無駄なので抜きました。
- 実用目的で、マトリックステストみたいのは想定していませんが、環境毎にキャッシュは有効になるはずです。
- 環境や対象ツールが変わった場合には、全部インストールしなおします。
- 再インストールを強制するためには `cache-gen` という世代番号を更新します。
- キャッシュヒットした場合の挙動はツールによって違います。perl は、キャッシュがあっても cpanm を実行するので、より新しいバージョンがあればインストールして、キャッシュを更新します。apt は更新しません。
- `cache: no` と指定すればキャッシュしません。だったらあまり使う必要ないけど。
- `cache: workflow` と指定すると、ワークフロー内のみでキャッシュが有効になります。テスト用です。
- perl のツールは `~/perl5` にインストールします。`install-base:` で変更できます。`PATH` とかそういうのはよろしく設定します。
- node は、ほとんど知りません。改善点などあればご提案ください。
- GitHub Actions も、はじめて使ったのでよくわかってません。変なところがあったら教えてください。
- はじめて、個人ではなく会社のリポジトリで公開してみました。社員一人ですがw

## メモ

- [`hashFiles`](https://docs.github.com/en/actions/learn-github-actions/expressions#hashfiles) には複数のパスが指定できる。
- 文字列を連結するには [`format`](https://docs.github.com/en/actions/learn-github-actions/expressions#format)を使う。