deploy.sh v2
手順が3つあると、いつか1つ抜ける
前のレッスンで、デプロイの手順は3つになりました。版を作る、中身を運ぶ、リンクを張り替える。そのあと reload です。
手で打つ限り、いつか抜けます。急いでいるとき、疲れているとき、割り込みが入ったとき。張り替えを忘れれば公開は変わらず、reload を忘れれば古い版が返り続けます。どちらも「やったつもり」で終わるので、たちが悪い失敗です。
Linux 入門で deploy.sh を書きました。あれを、この章で作った型に合わせて作り直します。
日時は自分で作らせる
版の名前を手で打つのはやめます。
RELEASE=$(date '+%Y%m%d-%H%M%S')date の書式指定で 20260401-101500 の形が作れます。変数に入れておけば、あとで何度でも使い回せます。
変数を使うときは、${RELEASE} のように中括弧で囲む書き方が安全です。$RELEASEabc と書くと RELEASEabc という別の変数として読まれてしまうためです。
途中で失敗したら、そこで止める
スクリプトの1行目の下に、次の1行を足します。
set -eこれで、途中のコマンドが失敗した時点でスクリプト全体が止まります。
無いとどうなるかを考えると、必要さが分かります。ファイルを運ぶ rsync が途中で失敗したのに、次の行の張り替えは実行されてしまう。結果、中途半端な版が公開される。止まってくれたほうが、ずっと安全です。
set -u も足しておくと、定義していない変数を使ったときに止まります。打ち間違えた変数名が空文字として扱われ、rm -rf / のような取り返しのつかない命令になる事故を防げます。
何をしたかを声に出させる
echo "リリース ${RELEASE} を作成しました"自動化したスクリプトほど、何をしたかを出力させます。あとで journalctl やログを見たときに、いつどの版を出したかが分かるためです。黙って成功するスクリプトは、黙って失敗します。
全体の形
組み立てるとこうなります。
#!/bin/bash
set -eu
SRC=/var/www/mysite/
BASE=/var/www/mysite-deploy
RELEASE=$(date '+%Y%m%d-%H%M%S')
mkdir -p "${BASE}/releases/${RELEASE}"
rsync -a --delete "${SRC}" "${BASE}/releases/${RELEASE}/"
ln -sfn "${BASE}/releases/${RELEASE}" "${BASE}/current"
systemctl reload nginx
echo "デプロイ完了 ${RELEASE}"変数を " で囲むのは、パスに空白が入っていても1つのまとまりとして扱わせるためです。習慣にしておくと、思わぬところで助かります。
手を動かす
日時つきの版を自動で作り、張り替えと reload まで一気に終わらせるスクリプトを書きます。