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 まで一気に終わらせるスクリプトを書きます。

ヒント

  • 1. /root/bin/deploy.sh を書く。1行目は #!/bin/bash、その下に set -eu を置く
  • 2. RELEASE=$(date '+%Y%m%d-%H%M%S') で版の名前を作る
  • 3. mkdir -p と rsync -a --delete で新しい版を作る
  • 4. ln -sfn で current を張り替える
  • 5. systemctl reload nginx で反映し、最後に何をしたかを echo で出す
  • 6. chmod +x を付けて実行し、新しい版が公開されることを確かめる

12 項目で採点します