Super Linter は Slim Image を使おう

## はじめに

使ってますか Super Linter

https://github.com/github/super-linter

私の記事で何度も紹介していますが、
GitHub Actions でありとあらゆる静的解析を実行してくれる、頼もしいツールです

https://github.co.jp/features/actions

ざっくり説明すると、 
汚いコードや潜在バグらしきコード、リスクのあるインフラ設定などをチェックし、
リポジトリーの品質を保ってくれるツールです

リポジトリーの `.github/workflows/lint.yml` に以下のような設定をすることで、
プルリクエスト作成時に自動チェックが実行され、悪いコードが含まれる場合はマージを阻止できます

```yml
---

name: lint

on: [pull_request]

jobs:
  super-lint:
    name: Lint Code Base
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v3
      - name: Install Modules
        run: yarn
      - name: Lint Code Base
        uses: github/super-linter@v4
        env:
          VALIDATE_ALL_CODEBASE: false
          VALIDATE_ANSIBLE: false
          LINTER_RULES_PATH: .
          DEFAULT_BRANCH: main
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

eslint や pylint などなど、各言語の Linter をどんどん追加しているため、
特に細かい指定をせずとも標準的なチェックを実行してくれます
（必要であれば細かくカスタマイズ可能）

Super Linter を導入しているか否かで、コードの品質（主に可読性）がかなり違ってきます

Public リポジトリーならいくらでも無料で使える上、 Private であっても 毎月 2,000 分までは無料です

宣伝はここまでにして、今回は更にお得に Super Linter を使う方法を紹介したいと思います

## Super Linter の実行時間

プルリクエストや、リポジトリーの Actions タブから Super Linter の実行結果を見ることができます

![スクリーンショット 2022-07-06 13.06.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/23509a24-d4f8-e0f9-28ac-245260b0c069.png)

左にジョブの一覧が表示され、ジョブを選択すると、ジョブ内の各ステップが右側に表示されます

ステップ毎に右端に表示されているのが実行時間です

Super Linter の場合、 `Pull ghcr.io/github/super-linter:xxx` と `Lint Code Base` に時間が掛かっています

`Pull ghcr.io/github/super-linter:xxx` は Super Linter のコンテナ（実行環境）を Pull してきています

`Lint Code Base` がチェックの実行です

「チェック自体」（1m5s）よりも「チェック用のコンテナ準備」(3m27s)の方に多く時間が掛かっています

## なぜ時間が掛かるのか

Super Linter はありとあらゆる言語のチェックを行うため、そのコンテナ内に様々な言語の実行環境を含んでいます

その結果、コンテナのサイズが圧縮状態で 1.91 GB 、展開状態で 6.48 GB と巨大になっており、
それを Pull するだけでもかなり時間が掛かっているのです

https://hub.docker.com/layers/super-linter/github/super-linter/v4.9.4/images/sha256-3c1c407632b833eb83c259ac3c93e62d2077070a10b88ae1941fadba154e1dad?context=explore

毎月 2,000 分は無料で使えますが、それを超過すると追加購入するまで GitHub Actions を動かせません

1回あたり 4 分の場合、 500 回 Super Linter を実行できる計算です

500 回と言うと多いような気がしますが、業務で 10 リポジトリー並列開発している場合、
1ヶ月にそれぞれ 50 回というのは少な過ぎます

1日に 2,3 回しかプルリクエストが投げられません

当然、 GitHub Actions が実行中の間はマージできないため、待ち時間も発生してしまいます

Super Linter の実行時間は短いに越したことはなく、特に Pull している時間はもったいないわけです

## Slim Image

Slim Image はその名の通り、一部の Linter を削ることでスリムになったコンテナイメージです

https://github.com/github/super-linter#slim-image

実際に Docker で Pull してみると、 Slim Image は 2.32 GB も軽量化されています

```bash
$ docker image ls | grep super
github/super-linter   slim-v4.9.4   e0060ce4f379   5 weeks ago     4.16GB
github/super-linter   v4.9.4        d9a6dce41feb   5 weeks ago     6.48GB
```

ただし、削られた Linter を使っているリポジトリーでは、
チェックができなくなるので Slim Image　は使用できません

- rust linters
- dotenv linters
- armttk linters (Azure Resource Manager = Azure の IaC)
- pwsh linters (PowerShell)
- c# linters

私の場合、フロントエンドは JS 、バックエンドは Python がメインなので、
注意するのは Rust を使うときくらいです

ちなみに Elixir はそもそも未対応 :sweat_smile: 
Elixir をチェックする場合は個別に GitHub Actions を組むしかありません

https://github.com/github/super-linter/issues/110

ついでに言うと、 Swift も未対応 :cry: 

https://github.com/github/super-linter/issues/127

## Slim Image の使用方法

使い方は簡単

GitHub Actions の設定ファイルを1行変更するだけです

- 変更前

```yml
        uses: github/super-linter@v4
```

- 変更後

```yml
        uses: github/super-linter/slim@v4
```

`@` の前に `/slim` を追加するだけで、 Slim Image を使用できます

## Slim Image の効果測定

実際に Slim Image を使ってみました

- 通常

![NotSlim.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/170fb603-aecc-1a5d-9cca-2297c517096d.png)

- Slim Image

![Slim.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/8efe5277-59fc-db95-7aad-827c1cc6bf00.png)

なんと 2 分 13 秒も Pull の時間が短縮されました

半減以下です

100 回実行すれば 200 分も差が出ます

チェックを待つ時間が短縮されれば、開発効率も上がります

## おわりに

以前から Slim Image の存在は知っていたものの、まだ使っていなかったので、
今回使ってみて効果の大きさに驚いています

機械を見て既存リポジトリーの Super Linter を Slim に変えていこうと思います