0コメント

【シェルスクリプト】Jenkinsから最新ビルドを取得してファイルを更新する。

今回は、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."
	fi
fi

こんな感じ。

とりあえず、これは「実行することで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を比較するととても時間がかかる。なので、ファイル自体を比較して異なるファイル(タイムスタンプ)であればビルドして比較するという仕組みにした。

ほかに特筆する必要がある部分は・・・無いかな。とりあえず、今回はソフトウェアの起動時に自動で更新できる仕組みに出来たので満足。

この記事へのコメント