0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2020-01-31

目的

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で実現したほうが汎用性が高いかもしれません。

参考URL

シェルスクリプトを使って「これから毎日金相場をスクレイピングしようぜ?」という話

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?