今回は、Minecraft Java Editionのサーバーソフトウェアであるspigotを動作させるうえで「こうできたらいいな」と感じた部分をシェルスクリプトで補うように記述したものになる。
SCREEN_NAME="example"check=`screen -ls | grep -c ${SCREEN_NAME}`#spigot.jarパスは後に追加するため未記入JARPASS="spigot.x.x.x.jarが存在するディレクトリ"if (( check == 1 )); then echo "started '${SCREEN_NAME}' screen."else echo 'Geyser-spigot.jar downloading...' cd "$JARPASS/plugins" curl -z Geyser-Spigot.jar -R -o Geyser-Spigot.jar https://ci.opencollab.dev/job/GeyserMC/job/Geyser/job/master/lastSuccessfulBuild/artifact/bootstrap/spigot/target/Geyser-Spigot.jar -\# read -p "spigotの最新ビルドを確認しますか? (y/N): " yn if [[ $yn = [yY] ]]; then echo 'checking spigot...' cd "$JARPASS" spigotNameOld=`echo | find . -type f | grep -e "spigot-" | cut -c 3-` cd "startbuild" oldTime=`date +%Y%m%d -r BuildTools.jar` curl -z BuildTools.jar -R -o BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar -\# newTime=`date +%Y%m%d -r BuildTools.jar` if [ "$oldTime" -eq "$newTime" ]; then echo 前回のBuildTools.jarと更新時刻が同じため、展開をスキップします。 else java -jar BuildTools.jar --rev latest ls | grep -v -E 'jar$' | xargs rm -r spigotNameNew=`echo | find . -type f | grep -e "spigot-" | cut -c 3-` echo "現在のspigotは '${spigotNameOld}' で、最新版のspigotは '${spigotNameNew}' です。" cd $JARPASS/ read -p "最新版とファイルを置き換えますか? (y/N): " yn case "$yn" in [yY]*) echo "ファイルを置き換えて起動します。" ; rm ${spigotNameOld} ; cp startbuild/${spigotNameNew} . ; rm startbuild/${spigotNameNew} ;; *) echo "既存のバージョンを使用します。." ; rm startbuild/${spigotNameNew} ;; esac fi fi cd $JARPASS filename=`find . -type f | grep -e "spigot-" | cut -c 3-` JARPASS="$JARPASS$filename" screen -AdmSU ${SCREEN_NAME} java -Xms2G -Xmx2G -jar ${JARPASS} nogui sleep 3 check=`screen -ls | grep -c ${SCREEN_NAME}` if (( check == 1 )); then echo "successed start for '${SCREEN_NAME}' screen." else echo "failed start for '${SCREEN_NAME}' screen." fifiこんな感じ。
とりあえず、これは「実行することでMinecraftのサーバーソフトspigotを毎回更新を確認し、プラグインのGeyser-spigotも更新を確認してscreenとしてデタッチモードでサーバーを起動する」という事を行うシェルスクリプトだ。
特筆する事項としては、Geyser-spigot.jarというプラグインもspigot-x.x.x.jarもJenkinsからcurlでダウンロードしているところ。
こういった比較してのダウンロードファイル差し替えの管理(=最新ビルドが出ていればその都度入れ替えるという処理)するなら、どうすればいいだろうかと模索して
その結果、こうなった。-zは比較ファイル名で、同じファイル名があったら比較して新しい方と入れ替えるという物。-oは出力ファイル名。-Rでサーバー上のファイルのタイムスタンプで保存する。
後々気付いたんだけど、wgetだとオプション無しで自動で比較してダウンロードが不要だと判断すれば省略する機能があるみたい。あとから気づいた・・・
あと、BuildTools.jarはJenkinsで公開されているものでspigotはspigot.jar単体では公式は公開しないので(公開してはいけない)このjarファイルからビルドする必要がある。
しかし毎回ビルドしてjarを比較するととても時間がかかる。なので、ファイル自体を比較して異なるファイル(タイムスタンプ)であればビルドして比較するという仕組みにした。
ほかに特筆する必要がある部分は・・・無いかな。とりあえず、今回はソフトウェアの起動時に自動で更新できる仕組みに出来たので満足。
この記事へのコメント