Github Actionsを利用したデータパックの構文チェック

**Minecraft Command Advent Calendar 2023 12日目の記事です。**

https://qiita.com/advent-calendar/2023/mccmd

# はじめに
メモ帳やGithub上でコード修正したとき、マイクラを起動せずにデータパックの構文チェックを行いたい場面、ありますよね？
~~え？あんまりない？~~
そんな時に便利なのが**Github Actions**を利用した構文チェックです。

:::note warn
この記事はGithubやGithub Actionsを使ったことがある人向けです。
:::

# 利用するAction
[**ChenCMD**](https://github.com/ChenCMD)さんのdatapack-linterを利用します。

https://github.com/ChenCMD/datapack-linter

# 手順

## 1\. Actionの設定

対象リポジトリの**Actions**タブから**set up a workflow yourself**を選び**main.yml**の編集画面を開いてください。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726125/58a27dda-d3f5-2ba1-2f4c-1cf8e0c4ee7c.png width=800>

そして、エディタに以下のコードを貼り付けてください。
```yaml
name: lint-datapack
on:
  push:
  pull_request:
  workflow_dispatch:
jobs:
  lint:
    name: lint
    runs-on: ubuntu-latest
    steps:
      - name: checkout repository
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: lint
        uses: ChenCMD/datapack-linter@v2
```
引用元: [README.md](https://github.com/ChenCMD/datapack-linter/blob/main/README.md)

## 2\. Push
設定完了です。
後はコミットを行うと自動的にチェックが入ります。
構文チェックが問題なく完了するとコミットメッセージの後ろの方に緑色のチェックマークがつきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726125/21b4f89a-9ad7-9759-04f1-20d1fb4d24e1.png)

# 構文チェックの設定
要約して書こうと思ったのですがREADMEに書いてある文章とリストが読みやすかったのでそのまま引用させていただきます。


> Datapack Linter は Datapack Helper Plus に使用されている言語サーバーを使用しており、リポジトリルートに配置された .vscode/setting.json を自動的に読み込み校閲ルールに適用します。
このファイルは VSCode でワークスペースの設定を変更すると生成されます。
また、後述の入力から configPath を指定することで、任意のコンフィグファイルを読み込むことが可能です。

引用元: [README.md](https://github.com/ChenCMD/datapack-linter/tree/main#%E6%A0%A1%E9%96%B2%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6--lint-rules)

|      名前  Name       | 想定する値 / Expect value | 必須 / Require |   デフォルト / Default    | 概要 / About                                                                                                                                                                                                                                                                                                                                                                                                                   |
| :-------------------: | :-----------------------: | :------------: | :-----------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|     lintDirectory     |           path            |       x        |           `"."`           | チェックを行うディレクトリ<br>Directory to lint                                                                                                                                                                                                                                                                                                                                                                                |
|      configPath       |           path            |       x        | `".vscode/settings.json"` | 校閲ルールを記載したコンフィグファイルのパス<br>Path to the config file containing the lint rules                                                                                                                                                                                                                                                                                                                              |
|       forcePass       |          `true`           |       x        |          `false`          | チェックに失敗した Datapack ドキュメントが存在するときに step そのものを失敗させるか否か<br>Whether or not to fail the step itself when there is a Datapack document that fails the lint                                                                                                                                                                                                                                       |
|   muteSuccessResult   |          `true`           |       x        |          `false`          | チェックに成功した Datapack ドキュメントのログを無効化するか否か<br>Whether to disable logging of Datapack documents that have been successfully linted                                                                                                                                                                                                                                                                        |
| ignoreLintPathPattern |   Namespaced ID Pattern   |       x        |           `""`            | チェックを行わない Datapack ドキュメントのリソースパスの[名前空間 ID パターン](https://github.com/ChenCMD/datapack-helper-plus-JP/wiki/Access-Modifiers#%E5%90%8D%E5%89%8D%E7%A9%BA%E9%96%93id%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)<br>[Namespaced ID Pattern](https://github.com/SpyglassMC/Spyglass/wiki/Access-Modifiers#namespaced-id-pattern) of the resource path of the Datapack document whose lints are to be ignored |
|  alwaysCheckAllFile   |          `true`           |       x        |          `false`          | 常にすべての Datapack ドキュメントをチェックするか否か<br>Whether to always lint all Datapack documents                                                                                                                                                                                                                                                                                                                        |

注: `ignoreLintPathPattern` は複数の文字列を入れることが可能です。方法は下記のサンプルを参照してください。

note: `ignoreLintPathPattern` can contain multiple character strings. Please refer to the sample below for the method.
```yaml
         - name: lint
           uses: ChenCMD/datapack-linter@v2
           with:
             ignoreLintPathPattern: |
               ignore:**
               example:ignore/**
               example:data/ignore/**
```

引用元: [README.md](https://github.com/ChenCMD/datapack-linter/tree/main#%E5%85%A5%E5%8A%9B--inputs)


# 役立つ場面
初めに書いた通りマイクラを起動せずに構文チェックを行うといった使い方もありますが、他にも用途はあります。

## 1\. チーム開発
チームでの開発を行っている際、一部のmcfunctionがエラーを吐いていてもデータパック全体としては一見動いている、という状態でPushやPRをするとActionのチェックで引っ掛かるため本番環境にエラーを持ち込むことを未然に防げます。

## 2\. CI/CD
CIの構文チェックに組み込みやすいです。
(他言語のLinterと比べると高機能とは言えませんが選択肢がほぼないのが現状です)

## 3\. リファクタリング
リファクタリング等の大幅なコード変更を行った際に構文ミスを見落としていてもActionが見つけてくれます。

## 4\. スマホデコーディング(!?)
半分ネタです。
ブラウザは使えるけどVSCodeが使えない環境でmcfunctionを書きたい！という場合は使えます。
Githubのリポジトリを開いてキーボードの`.`を押すか、urlを`github.dev`に変更するとブラウザ内でVSCodeが開けます。
ですがこれは不完全なVSCodeなので`DHP(Datapack HelperPlus)`等の便利な拡張機能が使えなかったりします。
色付けだけしてくれる`language-mcfunction`は使えるのでこれを入れましょう。
この状態でコードを書いてコミット&プッシュするとActionが構文チェックを行ってくれます！！

# まとめ
ほぼdatapack-linterの紹介記事になってしまいました。
構文チェックは未然にエラーを防いでくれる手段の一つなのでGithubでデータパックを管理している方は是非使ってみてください。