Mattermost TeamEditionを毎日自動アップデートする【Mattermostのメジャーバージョンアップに対応】

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

弊社は、ながらく無料版Slackをヘビーに使ってきましたが、あまりにもヘビーに使いすぎ、チャットの履歴を見られる期間が短くなっていました。
そこでMattermost TeamEditionを導入しました。

そこまではいいのですが、Mattermostのバージョンアップはかなり頻繁なので、面倒くさいから自動化したという話になります。

# 1. 前提条件

Mattermostのディレクトリ構成

```
/opt/mattermost <--- Mattermost本体
/opt/mattermost-data/  <--- Mattermostのデータとプラグインが入っている
```

それぞれのディレクトリの中身

```bash
$ ls /opt/mattermost -la
合計 256
drwxr-xr-x 12 mattermost mattermost   4096 12月 17 14:02 .
drwxr-xr-x 13 root       root         4096 12月 18 02:08 ..
-rw-r--r--  1 mattermost mattermost   1239 12月 17 14:02 MIT-COMPILED-LICENSE.md
-rw-r--r--  1 mattermost mattermost 196761 12月 17 14:02 NOTICE.txt
-rw-r--r--  1 mattermost mattermost   5312 12月 17 14:02 README.md
drwxr-xr-x  2 mattermost mattermost   4096 12月 17 14:03 bin
drwxr-xr-x  6 mattermost mattermost   4096 12月 17 14:02 client
drwxr-xr-x  2 mattermost mattermost   4096 12月 17 14:02 config
drwxr-xr-- 30 mattermost mattermost   4096 11月 22  2018 data
drwxr-xr-x  2 mattermost mattermost   4096 12月 17 14:02 fonts
drwxr-xr-x  2 mattermost mattermost   4096 12月 17 14:02 i18n
drwxr-xr-x  3 mattermost mattermost   4096 12月 17 14:02 logs
drwxr--r--  2 mattermost mattermost   4096 10月 12  2018 plugins
drwxr-xr-x  2 mattermost mattermost   4096 12月 17 14:03 prepackaged_plugins
drwxr-xr-x  2 mattermost mattermost   4096 12月 17 14:02 templates

$ ls -la /opt/mattermost-data/
合計 28
drwxr-xr-x   5 mattermost mattermost  4096 11月 22  2018 .
drwxr-xr-x  13 root       root        4096 12月 18 02:08 ..
drwxr-xr-x  10 mattermost mattermost  4096 12月 27 02:08 client-plugins
drwxr-xr-- 387 mattermost mattermost 12288 12月 27 02:08 data
drwxr-xr-x  18 mattermost mattermost  4096 12月 27 02:08 plugins
```

config.jsonの設定

```json
$ grep 'opt' /opt/mattermost/config/config.json
        "Directory": "/opt/mattermost-data/data/",
        "Directory": "/opt/mattermost-data/plugins",
        "ClientDirectory": "/opt/mattermost-data/client-plugins/",
```

# 2. 自動アップデートスクリプト

2021/07/15(木)、Mattermostのアーカイブファイルをダウンロードするページが変更になったので更新しています。

```bash:/home/user/bin/update.sh
#!/bin/bash

# Install Directory
INSTALL_DIR=/opt

# User and group
USER=mattermost
GROUP=mattermost

CURRENT_VERSION=$(sudo -u ${USER} ${INSTALL_DIR}/mattermost/bin/mattermost version 2> /dev/null  | sed -ne 's/^Version: \(.*\)/\1/p')
CURRENT_BUILD=$(sudo -u ${USER} ${INSTALL_DIR}/mattermost/bin/mattermost version 2> /dev/null  | sed -ne 's/^Build Number: \(.*\)/\1/p')

LATEST_VERSION=$(curl -s https://docs.mattermost.com/about/version-archive.html | grep 'linux-amd64.tar.gz</span></code></p></li>' | sed -ne 's|.*https://releases.mattermost.com/\(.*\)/mattermost-.*</span></code></p></li>|\1|p'| head -1)

# check new version
MIN_VERSION="$(printf '%s\n' "$CURRENT_VERSION" "$LATEST_VERSION" | sort -V | head -n1)"

if [ "$LATEST_VERSION" == "$CURRENT_VERSION" ]
then
  echo "CURRENT_VERSION:$CURRENT_VERSION is equal LATEST_VERSION:$LATEST_VERSION"
  exit
elif [ "$CURRENT_VERSION" == "$MIN_VERSION" ]
then
  echo "Current installed version: $CURRENT_VERSION"
  echo "LATEST_VERSION:$LATEST_VERSION is grater than the CURRENT_VERSION:$CURRENT_VERSION"
  echo "Install LATEST_VERSION:$LATEST_VERSION"
  TARGET_VERSION=$LATEST_VERSION
else
  echo "Current installed version: $CURRENT_VERSION"
  echo "Current installed build Number: $CURRENT_BUILD"
  echo "Latest Version: $LATEST_VERSION"
  echo "Something wrong. Exit"
  exit
fi

# Download Mattermost
mkdir -vp /tmp/download-mattermost-${TARGET_VERSION}
pushd /tmp/download-mattermost-${TARGET_VERSION}
wget https://releases.mattermost.com/${TARGET_VERSION}/mattermost-team-${TARGET_VERSION}-linux-amd64.tar.gz

tar -x --transform='s,^[^/]\+,\0-upgrade,' -f ./mattermost-team-${TARGET_VERSION}-linux-amd64.tar.gz
sudo chown -hR ${USER}:${GROUP} /tmp/download-mattermost-${TARGET_VERSION}/mattermost-upgrade/

echo "Stop Mattermost"
sudo systemctl stop mattermost

pushd ${INSTALL_DIR}
sudo cp -vra mattermost/ mattermost-back-$(date +'%F-%H-%M')/

find ${INSTALL_DIR}/mattermost/ -mindepth 1 -maxdepth 1 \! \( -type d \
   \( -path ${INSTALL_DIR}/mattermost/config \
   -o -path ${INSTALL_DIR}/mattermost/logs \
   -o -path ${INSTALL_DIR}/mattermost/plugins \
   -o -path ${INSTALL_DIR}/mattermost/data \) -prune \) | xargs echo rm -r
find ${INSTALL_DIR}/mattermost/ -mindepth 1 -maxdepth 1 \! \( -type d \
   \( -path ${INSTALL_DIR}/mattermost/config \
   -o -path ${INSTALL_DIR}/mattermost/logs \
   -o -path ${INSTALL_DIR}/mattermost/plugins \
   -o -path ${INSTALL_DIR}/mattermost/data \) -prune \) | sudo xargs rm -r

sudo cp -an /tmp/download-mattermost-${TARGET_VERSION}/mattermost-upgrade/. ${INSTALL_DIR}/mattermost/
sudo rm -rf /tmp/download-mattermost-${TARGET_VERSION}/mattermost-upgrade/

sudo chown -hR ${USER}:${GROUP} ${INSTALL_DIR}/mattermost/
sudo chown -hR ${USER}:${GROUP} ${INSTALL_DIR}/mattermost-data/plugins/
sudo chown -hR ${USER}:${GROUP} ${INSTALL_DIR}/mattermost-data/client-plugins/

echo "Start Mattermost"
sudo systemctl start mattermost

# Wait mattermost starting up
sleep 360

msg="{\"text\": \"Mattermost のバージョンを${TARGET_VERSION}にアップデートしました。\"}"
curl -i -s -o /dev/null -X POST -H 'Content-Type: application/json' -d "$msg" https://mattermost.example.jp/hooks/xxxxxxxxxxxxxxxxxxxxxxxxxx
```

# 3. アップデート cron

```/etc/cron.d/cron_mattermost-update
$ cat /etc/cron.d/cron_mattermost-update 
8 2  * * * root bash /home/usr/bin/update.sh
```

# 4. 運用実績

2019年7月2日から運用していますが、トラブルはありません。

## 2020年5月15日 追記
ダウンロードリンクのURL変更に対応

MattermostをダウンロードするURLを取得する下記のページ内の
tar.gzの直リンク表示形式が変更になった。

Version Archive — Mattermost 5.23 documentation
https://docs.mattermost.com/administration/version-archive.html

既存は以下

```
https://releases.mattermost.com/5.22.3/mattermost-5.22.3-linux-amd64.tar.gz
```

変更後は以下

```
https://releases.mattermost.com/5.23.0/mattermost-5.23.0-linux-amd64.tar.gz?src=arc
```

上記変更に対応

## 2021年7月15日 追記
ダウンロードページが変更になった

旧ページURL

```
https://docs.mattermost.com/administration/version-archive.html
```

新ページURL

```
https://docs.mattermost.com/upgrade/version-archive.html
```

## 2021年8月30日 追記

Mattermostのバージョン 5.38.2のBuild Numberが5.39.2であるためエラーが発生します。
9月16日に5.39.0がリリースされる予定のためスクリプトをBuild Number取得から変更します。

## 2021年10月07日 追記

Mattermostのメジャーバージョンアップ(Version 6.0)が近づいているため、インストールするバージョンの比較チェック方法を変更しました。

```shell
MIN_VERSION="$(printf '%s\n' "$CURRENT_VERSION" "$LATEST_VERSION" | sort -V | head -n1)"
```

で小さい方のバージョンを抜き出して、現在のバージョンと最新バージョンが同じの場合以外で以下のように
現在のバージョンと最小バージョンが一致している場合は新しいバージョンをインストールするルールに変更しました。

@digitarhythm ありがとうございました～。

```shell
if [ "$LATEST_VERSION" == "$CURRENT_VERSION" ]
then
  echo "CURRENT_VERSION:$CURRENT_VERSION is equal LATEST_VERSION:$LATEST_VERSION"
  exit
elif [ "$CURRENT_VERSION" == "$MIN_VERSION" ]
then
  echo "Current installed version: $CURRENT_VERSION"
  echo "LATEST_VERSION:$LATEST_VERSION is grater than the CURRENT_VERSION:$CURRENT_VERSION"
  echo "Install LATEST_VERSION:$LATEST_VERSION"
  TARGET_VERSION=$LATEST_VERSION
else
  echo "Current installed version: $CURRENT_VERSION"
  echo "Current installed build Number: $CURRENT_BUILD"
  echo "Latest Version: $LATEST_VERSION"
  echo "Something wrong. Exit"
  exit
fi
```

## 2024年7月5日追記 URLのパス変更

https://docs.mattermost.com/upgrade/version-archive.htm
が
https://docs.mattermost.com/about/version-archive.html
になったので修正

```diff
- LATEST_VERSION=$(curl -s https://docs.mattermost.com/upgrade/version-archive.html | grep 'linux-amd64.tar.gz</span></code></p></li>' | sed -ne 's|.*https://releases.mattermost.com/\(.*\)/mattermost-.*</span></code></p></li>|\1|p'| head -1)
+ LATEST_VERSION=$(curl -s https://docs.mattermost.com/about/version-archive.html | grep 'linux-amd64.tar.gz</span></code></p></li>' | sed -ne 's|.*https://releases.mattermost.com/\(.*\)/mattermost-.*</span></code></p></li>|\1|p'| head -1)
```