mattermost-plugin-demoをビルドしてmattermostに読み込ませる

Mattermostはオープンソースのメッセージングプラットフォームです。
当アプリではプラグインを用いて、基本機能やUIを拡張する事が出来ます。
本記事のゴールは、公式のdemo-pluginをビルドしてプラグインを作成し、mattermostに読み込ませることです。

今回使うのは以下のgitリポジトリです。
https://github.com/mattermost/mattermost-plugin-demo
こちらはmattermostが提供しているフロントサイドのデモプラグインで、
プラグインを使って拡張できるUIを分かりやすく教えてくれるものです。

```
git clone https://github.com/mattermost/mattermost-plugin-demo
```
上記のコマンドでリポジトリをクローンします

Makefileでコマンドが設定されており、gitディレクトリで以下のコマンドを打つだけで、Lintを通した後にビルドが走り、プラグインのファイルを生成してくれます。
```
make
```

このままコマンドを打ってもlintで以下のエラーが起こります。

```
Running golangci-lint
golangci-lint run ./...
WARN [config_reader] The configuration option `linters.govet.check-shadowing` is deprecated. Please enable `shadow` instead, if you are not using `enable-all`. 
server/http_hooks.go:144:14: `Cancelled` is a misspelling of `Canceled` (misspell)
        if !request.Cancelled {
                    ^
server/http_hooks.go:171:13: `Cancelled` is a misspelling of `Canceled` (misspell)
        if request.Cancelled {
                   ^
server/http_hooks.go:185:14: `Cancelled` is a misspelling of `Canceled` (misspell)
        if !request.Cancelled {
                    ^
server/command_hooks.go:228:30: printf: non-constant format string in call to fmt.Sprintf (govet)
                        Text:         fmt.Sprintf("Unknown command: " + args.Command),
                                                  ^
server/command_hooks.go:280:29: printf: non-constant format string in call to fmt.Sprintf (govet)
                Text:         fmt.Sprintf("Unknown command action: " + args.Command),
                                          ^
server/command_hooks.go:381:30: printf: non-constant format string in call to fmt.Sprintf (govet)
                        Text:         fmt.Sprintf("Unknown command: " + command),
                                                  ^
make: *** [Makefile:161: check-style] エラー 1
```

WARNの解決：
　linters.govet.check-shadowing` is deprecated.より
　check-shadowingは非推奨になっていると言われている為、
プロジェクトルートにある .golangci.yml ファイルを開き、以下のように編集してください

misspellの解決：
cancelledはUS表記ではcanceledとあらわす為lintでエラーが起こっています。
場当たり的ですがlintの設定を変更して対応していきます。
```
linters-settings:
  gofmt:
    simplify: true
  goimports:
    local-prefixes: github.com/mattermost/mattermost-plugin-demo
  govet:
>   # check-shadowing: true
    enable-all: true
    disable:
      - fieldalignment
> # misspell:
> #   locale: US
  revive:
    rules:
      - name: unused-parameter
        disabled: true
```

govetの解決：
non-constant format string in call to fmt.Sprintf (govet)
⇒printfでは「変換指定子（%s等）」を使用して文字列を生成するので、printfを使っているのに変換指定子を使っていないのはおかしいのでlintエラーになります。
以下のように修正しました。

```
func (p *Plugin) executeAutocompleteTest(args *model.CommandArgs) *model.CommandResponse {
	return &model.CommandResponse{
		ResponseType: model.CommandResponseTypeEphemeral,
		✕Text:         fmt.Sprintf("Executed command: " + args.Command),
		>Text:         "Executed command: " + args.Command,
	}
}
```
以上の修正が終われば、makeファイルでビルドが通ると思います。

./dist配下に「com.mattermost.demo-plugin-0.10.0.tar.gz」ファイルが出来るので、こちらをmattermostを開くコンピュータにダウンロードしてください。

その後、mattermostアプリのシステムコンソールから、Pluginの設定に遷移し、
ChooseFileから先ほどダウンロードしたプラグインファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923359/39a89617-2bd4-787b-dfbf-a7ed1298733c.png)

Installed Pluginsにプラグインが追加されたことを確認し、enaledを押下して有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923359/827ea634-45dc-e196-80a9-f2d75580be0c.png)

色々な所にUIのボタンが追加されている事が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923359/fda005ea-b44c-0be2-58e3-30e72ee94394.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923359/e1fbbc15-2382-40b7-d087-5e1d9b822428.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923359/78eeed2f-8023-2366-baf2-83fed19f205c.png)

以上になります。
今回はdemo-pluginをビルドして、mattermostに読み込ませるまでを試してみました。
追加できるUIに関してはこのプラグインに集約されていそうなので、
プラグインを作る際はこちらをベースに編集する形で作るのが良いと思いました。