目的
buildbotで定期的に生成されるバイナリーをshellを起動するたびにダウンロードします。
SVNやGitからビルドするのではなく、自動的に作成されるzipやexeを取得することを念頭にしていますので、「開発環境があれば不要な作業では?」という方にはまったく不要な知識です。
注意
取得先のURLやHTML構造が変化した場合、修正が必要かつ意図した動作をしない可能性があります。
shellの動作について
例とするURL
https://buildbot.orphis.net/armips/
このHTML(php)の、最新のビルド(Revision)のみをダウンロードします。
一言で言うなら、もっとも上部の「Windows 32bit」の「Download」をクリックしてファイルを取得する動作です。
参考にしたページではwgetで説明していましたが、個人的な趣味からcurlを利用します。
スクリプト
以下の2つのshellを作成し、順次実行する。
# !/usr/bin/env bash
sh ${HOME}/_armips_download.sh
sh ${HOME}/_armips_extract.sh
download
# !/usr/bin/env bash
TARGET_SOFTWARE='armips'
INDEX_URL='https://buildbot.orphis.net/'${TARGET_SOFTWARE}'/index.php'
TEMP_DIR="./temp_${TARGET_SOFTWARE}"
DOCUMENT="${TEMP_DIR}/index.php"
PAST_DOCUMENT="${TEMP_DIR}/past_index.php"
UPDATABLE="${TEMP_DIR}/updatable.txt"
# 作業用DIRが無ければ作成する
[ ! -d ${TEMP_DIR} ] && mkdir -p ${TEMP_DIR}
echo
echo '${TARGET_SOFTWARE}='${TARGET_SOFTWARE}
echo '${INDEX_URL}='${INDEX_URL}
echo
# 前回のindex.htmlをmvする
if [ -f ${DOCUMENT} ];
then
mv ${DOCUMENT} ${PAST_DOCUMENT}
fi
# 最新のHTMLを取得する
curl -R -o ${DOCUMENT} ${INDEX_URL}
echo
if [ -f ${UPDATABLE} ];
then
rm ${UPDATABLE}
fi
# 今回のinde.htmlとの差異を比較し、完全一致の場合は以降の作業を行わない
if diff -q ${DOCUMENT} ${PAST_DOCUMENT} ; then
echo "not need to update"
echo
exit
else
# 続く処理を行う
touch ${UPDATABLE}
fi
# grepで日付(YYYY-MM-DD)をHITさせ、2行目までを取得し2行目がURLである前提とする
# grep '<td>[0-9]\{4\}\-[0-1][0-9]-[0-3][0-9]' ${DOCUMENT} -A1 | head -2 | grep "windows-x86"
# ダブルコーテーションで区切れば、ダウンロードに必要な情報が簡単に区切れるので採用する
# REVISIONの取得
REVISION=`grep '<td>[0-9]\{4\}\-[0-1][0-9]-[0-3][0-9]' ${DOCUMENT} -A1 | head -2 | grep "windows-x86" | awk -F "\"" '{print $2}'`
echo '$REVISION='${REVISION}
# PLATFORMの取得
PLATFORM=`grep '<td>[0-9]\{4\}\-[0-1][0-9]-[0-3][0-9]' ${DOCUMENT} -A1 | head -2 | grep "windows-x86" | awk -F "\"" '{print $4}'`
echo '$PLATFORM='${PLATFORM}
# ダウンロード時に必要となるGETパラメーター
GET_PARAMETER='?m=dl&rev='
# 最終的なダウンロードURLを作成
DOWNLOAD_URL=${INDEX_URL}${GET_PARAMETER}${REVISION}'&platform='${PLATFORM}
echo '$DOWNLOAD_URL='${DOWNLOAD_URL}
echo
# 7zファイルのダウンロード
# -R ファイルのタイムスタンプを取得する
curl -R -o ${TEMP_DIR}/${TARGET_SOFTWARE}-${REVISION}-${PLATFORM}.7z ${DOWNLOAD_URL}
echo
ls -altr ${TEMP_DIR}/${TARGET_SOFTWARE}-${REVISION}-${PLATFORM}.7z
extract
# !/usr/bin/env bash
TARGET_SOFTWARE='armips'
TEMP_DIR="./temp_${TARGET_SOFTWARE}"
PLATFORM='windows-x86'
UPDATABLE="${TEMP_DIR}/updatable.txt"
# 更新可能で無ければ終了する
if [ ! -f ${UPDATABLE} ];
then
echo 'updatable file not exist, exit'
echo
exit
fi
if [ ! -f ${TEMP_DIR}/${TARGET_SOFTWARE}-v*-${PLATFORM}.7z ];
then
echo '7z file not exist, exit'
echo
exit
fi
WORK_DIR="${TEMP_DIR}/${TARGET_SOFTWARE}"
TARGET_DIR="C:\soft\\${TARGET_SOFTWARE}"
# 7zファイルを展開
`which 7z` x ${TEMP_DIR}/${TARGET_SOFTWARE}-v*-${PLATFORM}.7z -o"${WORK_DIR}" -y
# 7zファイルの削除
rm ${TEMP_DIR}/${TARGET_SOFTWARE}-v*-${PLATFORM}.7z
# アーカイブ内にはリビジョン番号が付いたディレクトリー付きで圧縮されているので、特定のディレクトリーに上書きコピーする
cp -apr ${WORK_DIR}/* ${TARGET_DIR}
# 最後に作業ディレクトリーを削除する
rm -r ${WORK_DIR}
経緯
「毎日やる作業は、自動化出来る」という言葉をどこかで聞いた時に、これは良い題材だと思い手を付けました。
今回はshellで実現しましたが、Windowsなどのブラウザーが動く環境であればマウスのクリックなどを自動化出来るSeleniumで実現したほうが汎用性が高いかもしれません。