How to build and install Mattermost plugins on FreeBSD
I was unpleasantly surprised to find that all plugins published on Mattermost plugin marketplace are not working on installed server on FreeBSD. They all are failing to start - it doesn't matter did you enabled linux64 emulation inside the OS.
After some research I have found that the problematic area is easy visible from file packages.json - as example here I'm givin a snippet from mattermost-plugin-jitsi:
{
"id": "jitsi",
"name": "Jitsi",
"description": "Jitsi audio and video conferencing plugin for Mattermost.",
"homepage_url": "https://github.com/mattermost/mattermost-plugin-jitsi",
"support_url": "https://github.com/mattermost/mattermost-plugin-jitsi/issues",
"release_notes_url": "https://github.com/mattermost/mattermost-plugin-jitsi/releases/tag/v2.0.0",
"icon_path": "assets/icon.svg",
"version": "2.0.0",
"min_server_version": "5.2.0",
"server": {
"executables": {
"linux-amd64": "server/dist/plugin-linux-amd64",
"darwin-amd64": "server/dist/plugin-darwin-amd64",
"windows-amd64": "server/dist/plugin-windows-amd64.exe"
}
},
It's easy visible and clear that the source must be build for FreeBSD too. The good news is that GO language has excelent cross compiling features.
$GOOS		$GOARCH
aix			ppc64
android		386
android		amd64
android		arm
android		arm64
darwin		386
darwin		amd64
darwin		arm
darwin		arm64
dragonfly	amd64
freebsd		386
freebsd		amd64
freebsd		arm
illumos		amd64
js			wasm
linux		386
linux		amd64
linux		arm
linux		arm64
linux		ppc64
linux		ppc64le
linux		mips
linux		mipsle
linux		mips64
linux		mips64le
linux		s390x
netbsd		386
netbsd		amd64
netbsd		arm
openbsd		386
openbsd		amd64
openbsd		arm
openbsd		arm64
plan9		386
plan9		amd64
plan9		arm
solaris		amd64
windows		386
windows		amd64
Edit the Makefile in this way:
cd server && env GOOS=linux GOARCH=amd64 $(GO) build $(GO_BUILD_FLAGS) -o dist/plugin-linux-amd64;
cd server && env GOOS=freebsd GOARCH=amd64 $(GO) build $(GO_BUILD_FLAGS) -o dist/plugin-freebsd-amd64;
cd server && env GOOS=darwin GOARCH=amd64 $(GO) build $(GO_BUILD_FLAGS) -o dist/plugin-darwin-amd64;
cd server && env GOOS=windows GOARCH=amd64 $(GO) build $(GO_BUILD_FLAGS) -o dist/plugin-windows-amd64.exe;
Change the packages.json and server/manifest.go files to include new supported architecture:
"server": {
    "executables": {
        "linux-amd64": "server/dist/plugin-linux-amd64",
        "freebsd-amd64": "server/dist/plugin-freebsd-amd64",           
        "darwin-amd64": "server/dist/plugin-darwin-amd64",
        "windows-amd64": "server/dist/plugin-windows-amd64.exe"
    }
},
If there are failures when building package, replace whole "server" section with:
"server": {
    "executable": "server/dist/plugin-freebsd-amd64"
},
Then build package using "gmake dist" to generate distribution into "dist/*.gz". You can grab generated file and upload it to your mattermost instance running on FreeBSD.