Hugo で生成した静的サイトをコマンド1発でデプロイできるように Makefile を作成しました。
この先いろんなメンテナンスが必要になったときのことを考えると、シェルスクリプトにするよりも Makefile にしてしておいた方が便利そうです。
Makefile
SHELL := /bin/bash
.ONESHELL:
.SHELLFLAGS := -eu -o pipefail -c
#############################################
# Constants (edit these)
#############################################
PROD_HOST := example.com # アップロード先ホスト
PROD_DOCROOT := /var/www/example/public_html # アップロード先ディレクトリ
SSH_KEY_PATH := $(HOME)/.ssh/id_rsa # SSH 鍵ファイルの場所
PUBLIC_DIR := public # アップロード元ディレクトリ(ローカル)
SSH_OPTS := -i "$(SSH_KEY_PATH)" -o IdentitiesOnly=yes
RSYNC_OPTS := -az --delete --itemize-changes --human-readable --progress \
--exclude ".DS_Store" --exclude ".git"
.PHONY: help build deploy deploy-dry ssh-check clean
help:
@echo "Targets:"
@echo " make build # hugo build -> ./public"
@echo " make deploy # build + rsync deploy"
@echo " make deploy-dry # dry-run deploy (no changes)"
@echo " make ssh-check # check ssh connection"
@echo ""
@echo "Edit constants in Makefile:"
@echo " PROD_HOST, PROD_DOCROOT, SSH_KEY_PATH"
build:
hugo
ssh-check:
test -f "$(SSH_KEY_PATH)"
ssh $(SSH_OPTS) "$(PROD_HOST)" "echo 'SSH OK on' \$$(hostname)"
deploy: ssh-check build
test -d "$(PUBLIC_DIR)"
rsync $(RSYNC_OPTS) -e "ssh $(SSH_OPTS)" \
"$(PUBLIC_DIR)/" "$(PROD_HOST):$(PROD_DOCROOT)/"
deploy-dry: ssh-check build
test -d "$(PUBLIC_DIR)"
rsync $(RSYNC_OPTS) --dry-run -e "ssh $(SSH_OPTS)" \
"$(PUBLIC_DIR)/" "$(PROD_HOST):$(PROD_DOCROOT)/"
clean:
rm -rf "$(PUBLIC_DIR)"
実行
# ドライラン
$ make deploy-dry
# 実行
$ make deploy