背景
webサービスをメンテナンスモードに切り替えるのは、様々な方法があるかと思うが、
古来から特定のファイルの存在有無によって判定をする方法がある。
これでは、毎回その設定ファイルを編集(メンテナンス予定時間の変更)して、
サーバ台数分配置するのも面倒だったのでjenkinsで自動化してみた。
シェルスクリプトあんまり書いたことなかったのでもっと良い方法があるかもしれません
作業内容
- jenkinsでjobを作成
jobではまずパラメータのチェックを行う。
# 有効な日付ではない場合は終了する関数
function check_date() {
check_empty $1
check_empty $2
if ${#1} -nq 8; then
echo "年月日は8文字で入力してください"
exit 1
fi
if ${#2} -nq 4; then
echo "時刻は文字で入力してください"
exit 1
fi
input_date="${1} ${2:0:2}:${2:2:2}"
echo $input_date
if date -d "$input_date"; then
:
else
echo "有効な日付ではありません"
exit 1
fi
return 0
}
# 有効な入力でない場合は終了する関数
function check_empty(){
echo "$1"
if [ -z "$1" ]; then
echo "パラメータは空にはできません"
exit 1
fi
}
check_date ${start_date} ${start_time}
check_date ${end_date} ${end_time}
jenkinsでジョブに渡せるパラメータに”日付データ”といった形式が見当たらなかったので、
あんまりスマートではないが、取り急ぎ、日付と時間をそれぞれ文字列形式で渡した
- start_date 開始日付
- start_time 開始日付
- end_date 終了日付
- end_time 終了日付
パラメータで渡された日付を関数に渡して、有効な日付かどうかのチェックをする
- 設定ファイルを置換する
#別ファイルを作成
sudo cp maintenance.ini.sample maintenance.ini.edit
#開始日の置き換え
sudo sed -i -e "s/start_dt=.*/start_dt=${start_date:0:4}-${start_date:4:2}-${start_date:6:2} ${start_time:0:2}:${start_time:2:2}/g" maintenance.ini.edit
#終了日の置き換え
sudo sed -i -e "s/end_dt=.*/end_dt=${end_date:0:4}-${end_date:4:2}-${end_date:6:2} ${end_time:0:2}:${end_time:2:2}/g" maintenance.ini.edit
#ファイル名の変更
sudo mv maintenance.ini.edit maintenance.ini
- テンプレートファイルは不動のものを持っておきたいので、まず別ファイルでコピーする
- 渡したパラメータを用いて置換してsedコマンドでdateの設定を差し替える
今回はstart_dt=yyyy-MM-dd HH:mm
と設定すれば良いものとしている - ファイル名を正式なものに変更する
雑感
最初は正規表現を使ってパラメータをチェックしようとしたんですが、うまくいかんかったので、ちょっと助長になってしまった。
パラメーダを日付形式で受け取れればシンプルにできるのだが・・・