Slack代替のMattermostをNetBSD/amd64で使う(ビルド編)

NetBSD Advent Calendar 2017の9日目の記事です。

はじめに

Mattermostと言う チャットプラットフォームがある。これのCommunity Editionは LDAP認証機能がないなどちょっと使いにくい部分はあるのだが、 Linuxでは良い感じに動くのを確認していた。 日本語ユーザーインターフェイスもベータ扱いではあるが、 ほぼ翻訳できていると思う。

Mattermostは、サーバーはGo言語で書かれており、 ビルドにはnode.jsも必要となる。 どちらもGo 1.8以降、node.js 8以降が必要で、 例えばDebian GNU/Linux 9で動かそうとすると、 標準のパッケージマネジメントシステムに収録されている Goとnode.jsはこれよりずっと古いので、ディストリビューションのリポジトリー 以外から新しいバージョンをインストールしなくてはいけない。 その点、pkgsrcであれば、Goは新しいし、node,jsも新しいものを選べる。

また、Mattermostの開発環境には、dockerが必要なように思われるかもしれないが、 別になくてもちゃんと動かすことができる。

以下では、NetBSD/amd64 current上でMattermostのサーバーと ウェブアプリケーションをビルドするまでを紹介する。 実際に動かすまでは、次回に紹介したい。

ビルドに必要なツールを用意する

サーバーはGo言語で書かれているため、 pkgsrc/lang/goを インストールする。 以下のように操作すれば良い。


# cd /usr/pkgsrc/lang/go
# make install
この記事を書いている時点では、go-1.9.2というパッケージがインストールされる。

ウェブアプリケーションは、node.jsでビルドするため、以下のように最新のnode.jsを インストールしておく。


# cd /usr/pkgsrc/lang/nodejs
# make install
この記事を書いている時点では、nodejs-9.2.0nb1というパッケージがインストールされる。

ウェブアプリケーションのビルドの途中で、node.jsのmozjpegモジュールを インストールすることになる。 このモジュールは、Linuxであれば、コマンドのバイナリーファイルを 提供してくれるのだが、NetBSD用など当然ないので、バイナリーファイルを ビルドしないといけない。 そのためには、以下のパッケージが必要になる。 ちなみに、Debian GNU/Linux 9の場合にもlibpng12.soが提供 されていないため、mozjpegを使おうとする箇所で失敗する。

  • pkgsrc/devel/pkgconf
  • pkgsrc/devel/libtool-base
  • pkgsrc/graphics/png
もしかしたら、他にも必要かもしれない。 ここまで用意しておけば、mozjpegをローカルでビルドしようと試みるように なるので、エラーメッセージを見れば分かるはずである。

ウェブアプリケーションをビルドするには、 yarnというパッケージマネジメント システムが必要である。 yarnのインストール手順によると、以下のようにnpmコマンドを 使ってのインストールは推奨されていないようであるが、一番簡単な方法であり、 このためにしか使わないので、これを採用してしまう。


$ mkdir ~/yarn
$ cd ~/yarn
$ npm install yarn
$ set PATH=~/yarn/node_module/yarn/bin:$PATH

また、GNU makeも必要なので、インストールしておく。どこかで、gmakeをmakeとして呼び出しているようなので、シンボリックリンクも作っておく。


# cd /usr/pkgsrc/deve/gmake
# make install
$ ln -s /usr/pkg/bin/gmake ~/yarn/node_modeule/yarn/bin/make

ソースコードを配置する

Compiling Mattermostのウェブページにあるように配置していく。


$ 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

配置したソースコードの場所を、環境変数に設定する。


$ set GOPATH=$HOME/go
$ export GOPATH
$ set PATH=$PATH:$GOPATH/bin

ビルドに必要なパッチを当てる

残念ながら、MattermostのMakefileは、あまり移植性を考慮していないようである。 また、開発用にはdockerを使うので、配布用のアーカイブファイルを作成する 部分について、最近は忘れられているようである。

どう直すのが適当であるかは明確ではないが、配布用のアーカイブファイルを 作成するには以下のようなパッチが必要である。 config/config.jsonファイルは、なければ自動的に生成されるので 用意しておく必要はないはずである。


diff --git a/build/release.mk b/build/release.mk
index 5eaee8022..285dcadac 100644
--- a/build/release.mk
+++ b/build/release.mk
@@ -36,16 +36,6 @@ package:
  cp -RL templates $(DIST_PATH)
  cp -RL i18n $(DIST_PATH)
 
- @# Disable developer settings
- sed -i'' -e 's|"ConsoleLevel": "DEBUG"|"ConsoleLevel": "INFO"|g' $(DIST_PATH)/config/config.json
- sed -i'' -e 's|"SiteURL": "http://localhost:8065"|"SiteURL": ""|g' $(DIST_PATH)/config/config.json
-
- @# Reset email sending to original configuration
- sed -i'' -e 's|"SendEmailNotifications": true,|"SendEmailNotifications": false,|g' $(DIST_PATH)/config/config.json
- sed -i'' -e 's|"FeedbackEmail": "test@example.com",|"FeedbackEmail": "",|g' $(DIST_PATH)/config/config.json
- sed -i'' -e 's|"SMTPServer": "dockerhost",|"SMTPServer": "",|g' $(DIST_PATH)/config/config.json
- sed -i'' -e 's|"SMTPPort": "2500",|"SMTPPort": "",|g' $(DIST_PATH)/config/config.json
-
  @# Package webapp
  mkdir -p $(DIST_PATH)/client
  cp -RL $(BUILD_WEBAPP_DIR)/dist/* $(DIST_PATH)/client

また、Go言語で書かれたサーバーをNetBSD/amd64向けにビルドするための ターゲットが必要である。 以下のように追加する。


diff --git a/Makefile b/Makefile
index a0cf74f1c..ff4bb8149 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-.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 internal-test-web-client vet run-server-for-web-client-tests
+.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-netbsd internal-test-web-client vet run-server-for-web-client-tests
 
 ROOT := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
 
diff --git a/build/release.mk b/build/release.mk
index 5eaee8022..c551e3ad0 100644
--- a/build/release.mk
+++ b/build/release.mk
@@ -13,6 +13,10 @@ build-windows:
  @echo Build Windows amd64
  env GOOS=windows GOARCH=amd64 $(GO) install $(GOFLAGS) $(GO_LINKER_FLAGS) ./cmd/platform
 
+build-netbsd:
+ @echo Build NetBSD amd64
+ env GOOS=netbsd GOARCH=amd64 $(GO) install $(GOFLAGS) $(GO_LINKER_FLAGS) ./cmd/platform
+
 build: build-linux build-windows build-osx
 
 build-client:

配布用のアーカイブファイルを作成する部分は、LinuxとmacOS、Windows用の全てを 用意するようになっているので、NetBSD用だけを用意するように変更してしまう。


diff --git a/build/release.mk b/build/release.mk
index 5eaee8022..0105cf681 100644
--- a/build/release.mk
+++ b/build/release.mk
@@ -61,38 +61,9 @@ endif
 
  @# ----- PLATFORM SPECIFIC -----
 
- @# Make osx package
  @# Copy binary
-ifeq ($(BUILDER_GOOS_GOARCH),"darwin_amd64")
  cp $(GOPATH)/bin/platform $(DIST_PATH)/bin # from native bin dir, not cross-compiled
-else
- cp $(GOPATH)/bin/darwin_amd64/platform $(DIST_PATH)/bin # from cross-compiled bin dir
-endif
- @# Package
- tar -C dist -czf $(DIST_PATH)-$(BUILD_TYPE_NAME)-osx-amd64.tar.gz mattermost
- @# Cleanup
- rm -f $(DIST_PATH)/bin/platform
-
- @# Make windows package
- @# Copy binary
-ifeq ($(BUILDER_GOOS_GOARCH),"windows_amd64")
- cp $(GOPATH)/bin/platform.exe $(DIST_PATH)/bin # from native bin dir, not cross-compiled
-else
- cp $(GOPATH)/bin/windows_amd64/platform.exe $(DIST_PATH)/bin # from cross-compiled bin dir
-endif
- @# Package
- cd $(DIST_ROOT) && zip -9 -r -q -l mattermost-$(BUILD_TYPE_NAME)-windows-amd64.zip mattermost && cd ..
- @# Cleanup
- rm -f $(DIST_PATH)/bin/platform.exe
-
- @# Make linux package
- @# Copy binary
-ifeq ($(BUILDER_GOOS_GOARCH),"linux_amd64")
- cp $(GOPATH)/bin/platform $(DIST_PATH)/bin # from native bin dir, not cross-compiled
-else
- cp $(GOPATH)/bin/linux_amd64/platform $(DIST_PATH)/bin # from cross-compiled bin dir
-endif
  @# Package
- tar -C dist -czf $(DIST_PATH)-$(BUILD_TYPE_NAME)-linux-amd64.tar.gz mattermost
+ tar -C dist -czf $(DIST_PATH)-$(BUILD_TYPE_NAME)-netbsd-amd64.tar.gz mattermost
  @# Don't clean up native package so dev machines will have an unzipped package available
  @#rm -f $(DIST_PATH)/bin/platform

ビルドする

これで、ビルドする準備はできたので、後はウェブアプリケーションとサーバーを ビルドし、配布用アーカイブファイルを作成すれば良い。 node.js、Goともにネットワーク経由でファイルを取得する。

まずはウェブアプリケーションをビルドする。以下のように実行すれば良い。 mattermost-serverディレクトリーの中で実行しているが、実際には mattermost-webapp内でビルドがされる。


$ cd ~/go/src/github.com/mattermost/mattermost-server
$ gmake build-client

次に、サーバーをビルドする。以下のように実行する。


$ cd ~/go/src/github.com/mattermost/mattermost-server
$ gmake build-netbsd

最後に、配布用アーカイブファイルを作成する。


$ cd ~/go/src/github.com/mattermost/mattermost-server
$ gmake package

まとめ

ここまでで、Mattermostのウェブアプリケーションとサーバーを含んだ mattermost-team-netbsd-amd64.tar.gzファイルが、 ~/go/src/github.com/mattermost/mattermost-server/dist ディレクトリーに生成される。

次回は、このmattermost-team-netbsd-amd64.tar.gzファイルを 使って、日本語のメッセージ検索が可能な環境を構築する。

Comments

Popular posts from this blog

#5000へCメールを送れないau端末でezweb.ne.jpの電子メールアドレスをIMAP4/SMTPで扱う方法

Vaio Pro 11/13用のサードパーティーのACアダプター

Windows 7 Professional用のNFSクライアントを使う (NFS 4.1のみ)