buildbotで生成されるwebページから最新のファイルをダウンロードする

# 目的
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を作成し、順次実行する。

```bash
#!/usr/bin/env bash
sh ${HOME}/_armips_download.sh
sh ${HOME}/_armips_extract.sh
```
## download
```bash
#!/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
```bash
#!/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で実現したほうが汎用性が高いかもしれません。


# 参考URL
[シェルスクリプトを使って「これから毎日金相場をスクレイピングしようぜ？」という話](https://qiita.com/furandon_pig/items/80562f6adcce53baeb0a)