毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。
0. はじめに
弊社は、ながらく無料版Slackをヘビーに使ってきましたが、あまりにもヘビーに使いすぎ、チャットの履歴を見られる期間が短くなっていました。
そこでMattermost TeamEditionを導入しました。
そこまではいいのですが、Mattermostのバージョンアップはかなり頻繁なので、面倒くさいから自動化したという話になります。
1. 前提条件
Mattermostのディレクトリ構成
/opt/mattermost <--- Mattermost本体
/opt/mattermost-data/ <--- Mattermostのデータとプラグインが入っている
それぞれのディレクトリの中身
$ 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の設定
$ 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のアーカイブファイルをダウンロードするページが変更になったので更新しています。
#!/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
$ 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)が近づいているため、インストールするバージョンの比較チェック方法を変更しました。
MIN_VERSION="$(printf '%s\n' "$CURRENT_VERSION" "$LATEST_VERSION" | sort -V | head -n1)"
で小さい方のバージョンを抜き出して、現在のバージョンと最新バージョンが同じの場合以外で以下のように
現在のバージョンと最小バージョンが一致している場合は新しいバージョンをインストールするルールに変更しました。
@digitarhythm ありがとうございました~。
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
になったので修正
- 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)