MattermostをRaspberry Pi3用にビルドする

# MattermostをRaspberry Pi3用にビルドする
Slack互換のMattermostをdockerコンテナで実装したmattermost-dockerをRasuperry Pi3で動かしてみます。そのために、ラズパイ用のmattermostをビルドしますが、ここでの作業は、Windows上のVirutualBoxにインストールしたUbuntu 16.04 LTSを使用しています。

ここでビルドしたMattermostのパッケージを使って、ラズパイ用のdockerコンテナを作成して動かします。

参考：[Mattermost-dockerをRaspberry Pi3で動かす](https://qiita.com/tkyonezu/items/bd76caf2c02956f03ff3)

## 1. 開発環境の準備
Mattermost公式の[Installing Developer Components on Ubuntu 16.04](https://docs.mattermost.com/developer/dev-setup-ubuntu-1604.html)に従って必要な環境を設定します。最初にmattermost-serverをビルドするための開発環境をWindows上のVirtualBoxにインストールしたUbuntu 16.04LTSに設定しています。

### 1.1 Ubuntuの初期設定
まずUbuntuの初期設定として、事前に作成したシェルスクリプトを実行します。

```
git clone https://github.com/tkyonezu/Linux-tools.git
cd Linux-tools
sudo bash ubuntu-setup.sh <ホスト名> <ユーザー名>
```

引数のホスト名とユーザー名には、Ubuntuをインストールした際のホスト名とユーザー名を指定しています。処理が終了したら、メッセージにしたがって再起動します。

### 1.2 GuestAdditions CDのインストール
今回はVirtualBoxを使用していますので、続けて`Guest Additions CD`をインストールします。VirtualBoxの`デバイス`メニューから`Guest Additions CDイメージの挿入...`を選択してCDをマウントします。CDをマウントできたら、`VBoxLinuxAdditions.run`を実行します。

```
cd /media/<ユーザー名>/VVox_GAs_5.2.8
sudo bash VBoxLinuxAdditions.run
```

実行後に、また再起動しておきます。ところが、初回は何故かしらエラーになるので上記の処理を再実行して、もう一度起動し直します。これで`Guest Additions`が利用できますから、VirtualBoxの`デバイス`メニューの`光学ドライブ`、`仮想ドライブからディスクを除去`を実行しておきます。

### 1.3 newgrp dockerの実行
公式の手順にしたがって、`newgrp docker`を実行しておきます。これが必須かどうかは不明ですけど。

```
newgrp docker
```

### 1.4 Goのインストール
次にGoをインストールします。

```
cd Linux-tools
sudo bash install-go.sh
```

公式の手順にしたがって、`.bashrc`を修正します。

```
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
export PATH=$PATH:/usr/local/go/bin
ulimit -n 8096
```

修正後の`.bashrc`を反映して、インストールされた`Go`のバージョンを確認しておきます。

```
$ cd ~
$ source .bashrc
$ go version
go version go1.10.1 linux/amd64
```

### 1.5 Node.jsのインストール
次に`node.js`をインストールします。

```
cd Linux-tools
sudo bash install-node.sh
```

### 1.6 Yarnのインストール
最後に`Yarn`をインストールします。

```
cd Linux-tools
sudo bash install-yarn.sh
```

## 2. mattermost-serverのクローン
以上で開発環境の準備ができましたので、`mattermost`をクローンします。ここでは、[mattrermost-server](https://github.com/mattermost/mattermost-server.git)と[mattermost-webapp](https://github.com/mattermost/mattermost-web-apps.git)をクローンします。

```
mkdir -p ~/go/src/github.com/mattermost
cd ~/go/src/github.com/mattermost
git clone https://github.com/mattermost/mattermost-server.git
git clone https://github.com/mattermost/mattermost-webapp.git
```

## 3. mattermost-serverのビルド準備
### 3.1 `Makefile`をラズパイ用に修正
`mattermost-server`には、`Linux amd64`、`OSX amd64`、`Windows amd64`用のビルドターゲットが用意されています。そこに`Linux arm`としてラズパイ用のターゲットを追加します。

まず、`Makefile`を修正します。`.PHONY:`の行の`build-windows`の次に`build-arm`を追加します。

```
.PHONY: build package run stop run-client run-server stop-client stop-server restart restart-server restart-client start-docker clean-dist clean nuke check-style check-client-style check-server-style check-unit-tests test dist setup-mac prepare-enteprise run-client-tests setup-run-client-tests cleanup-run-client-tests test-client build-linux build-osx build-windows build-arm internal-test-web-client vet run-server-for-web-client-tests
```

### 3.2 `build/release.mk`をラズパイ用に修正
次に`build/release.mk`を修正します。まず`build-windows:`の下に`build-arm:`を追加して、`build:`行に`buil-arm`を追加します。

```
build-arm:
        @echo Build Linux arm
ifeq ($(BUILDER_GOOS_GOARCH),"linux_arm")
        env GOOS=linux GOARCH=arm $(GO) build -i -o $(GOPATH)/bin/platform $(GOFLAGS) $(GO_LINKER_FLAGS) ./
else
        env GOOS=linux GOARCH=arm $(GO) build -i -o $(GOPATH)/bin/linux_arm/platform $(GOFLAGS) $(GO_LINKER_FLAGS) ./
endif

build: build-linux build-windows build-osx build-arm
```

この`build/release.mk`ファイルの最後に`Make arm package`用の行を追加します。

```
        @# Make arm package
        @# Copy binary
ifeq ($(BUILDER_GOOS_GOARCH),"linux_arm")
        cp $(GOPATH)/bin/platform $(DIST_PATH)/bin # from native bin dir, not cross-compiled
else
        cp $(GOPATH)/bin/linux_arm/platform $(DIST_PATH)/bin # from cross-compiled bin dir
endif
        @# Package
        tar -C dist -czf $(DIST_PATH)-$(BUILD_TYPE_NAME)-linux-arm.tar.gz mattermost
        @# Don't clean up native package so dev machines will have an unzipped package available
        @#rm -f $(DIST_PATH)/bin/platform
```

## 4. mattermost-serverのコンパイル
ここから公式の[Compiling Mattermost](https://docs.mattermost.com/developer/dev-setup-compiling.html)にある手順で作業を実施します。

### 4.1 `/usr/local/go`ディレクトリのパーミッション変更
まず公式の手順に従って、`/usr/local/go`ディレクトリのパーミッションを変更します。

```
sudo chwon -R <ユーザ>:<グループ> /usr/local/go
```

### 4.2 `mattermost-server`のビルド
以上で準備ができましたので、公式の手順にしたがって`mattermost`をビルドします。まず、`mattermost-server`をビルドします。

```
env LC_ALL=C make build
```

### 4.3 `mattermost-webapp`のビルド
続けて`mattermost-webapp`をビルドします。

```
env LC_ALL=C make build-client
```

### 4.4 packageの作成
無事にビルドできましたので、パッケージを作成します。

`make package` の実行で `unzip` が無いとエラーになるので事前にインストールしておきます。

```
$ sudo apt install zip
```

```
make config-reset
make package
```

今回は、クロスコンパイルしていますので`dist`ディレクトリに4つのパッケージが作成されています。

```
$ ls dist
mattermost                          mattermost-team-osx-amd64.tar.gz
mattermost-team-linux-amd64.tar.gz  mattermost-team-windows-amd64.zip
mattermost-team-linux-arm.tar.gz
```

もちろん、mattermostは`Enterprise Edition`ではなく`team edition`となっています。

ここで作成した`mattermost-team-linux-arm.tar.gz`をラズパイに転送します。次には、[ラズパイで`mattermost-docker`を動かします](https://qiita.com/tkyonezu/items/bd76caf2c02956f03ff3)。