📛

シェルスクリプトでデプロイを自動化

2024/02/15に公開

目的

この記事では、シェルスクリプトを使用してデプロイプロセスを自動化する方法に焦点を当てます。
FTPクライアントツールでポチポチ頑張っている健気なエンジニア向けです。
JenkinsやCircleCIなどの有料のデプロイツールがなくとも、この手順であれば無料で簡単にデプロイを実施することができます。
自動化は、手作業によるエラーを減らし、開発チームの生産性を向上させることができます。

*注意 この記事ではバックアップ方法にはふれません。デプロイするときは必ずバックアップを取りましょう。

ディレクトリ構造

デプロイスクリプトを配置するリポジトリの構造は以下のようになります。
scriptsディレクトリに配置されたdeploy_dev.shスクリプトがデプロイプロセスを自動化する主役です。

Repository
├── scripts
│   ├── ...
│   └── deploy_dev.sh (開発環境にデプロイするスクリプト)
└── src
    ├── app
    ├── artisan
    ├── composer.json
    ├── composer.lock
    ├── composer.phar
    ...
    └── webpack.mix.js

deploy_dev.sh スクリプト

servername と deploypath はデプロイ先の環境に応じて適宜置き換えてください。また、以下のスクリプト例ではLaravelフレームワークを想定した exclude や include の設定を行っていますが、プロジェクトの要件に応じて自由に調整してください。

devlop_dev.sh
#!/bin/bash
DIR=$(dirname $0)
dryrun=""
delete=""

servername=ServerName
sourcepath=${DIR}/../src/
deploypath=/var/www/vhosts/myapp/

while getopts :-: OPT
do
  case $OPT in
    -)
      case ${OPTARG} in
        dry-run)
          dryrun=n
          echo -e "rsyncコマンドにdryrunオプションを付与します"
          ;;
        delete)
          delete=--delete
          echo "rsyncコマンドにdeleteオプションを付与します。"
          ;;
        *)
          echo "誤った引数が指定されました"
          exit 1
          ;;
      esac
  esac
done

if [ -n "$dryrun" ] || [ -n "$delete" ]
then
  echo -e "実行されるrsyncコマンドは以下の通りです。"
  echo -e "コマンド: rsync -rvc$dryrun $delete -e '/usr/bin/ssh'"
fi

set -exuo pipefail

function deploy {
	rsync -rvc$dryrun $delete -e '/usr/bin/ssh' \
	  --exclude='.git' \
	  --exclude='*.md' \
	  --exclude='storage/logs/*' \
	  --exclude='htdocs/.htaccess' \
	  --exclude='storage/framework/sessions/*' \
	  --exclude='storage/framework/cache/*' \
	  --exclude='storage/framework/views/*' \
	  --exclude='.env' \
	  --include='.env.*' \
	  $sourcepath $1:$deploypath
}

deploy $servername

初回実行時の権限設定

スクリプトを初めて実行する前に、実行権限を付与する必要があります。

scripts$ chmod +x deploy_dev.sh

実行方法

以下は実行例です。スクリプトを実行する際のオプションの使用方法を示しています。
このコマンドは、デプロイプロセスをシミュレートし(--dry-run)、ローカルに存在しないファイルをリモートから削除します(--delete)。これにより、予期しないエラーを事前に防ぐことができます。

$ ./deploy_dev.sh --dry-run --delete
rsyncコマンドにdryrunオプションを付与します
実行されるrsyncコマンドは以下の通りです。
コマンド: rsync -rvcn  -e '/usr/bin/ssh'
+ deploy ServerName
++ dirname ./deploy_dev.sh
+ DIR=.
+ rsync -rvcn -e /usr/bin/ssh --exclude=.git '--exclude=*.md' '--exclude=storage/logs/*' --exclude=htdocs/.htaccess '--exclude=storage/framework/sessions/*' '--exclude=storage/framework/cache/*' '--exclude=storage/framework/views/*' --exclude=.env '--include=.env.*' ./../src/ ServerName:/var/www/vhosts/myapp/
sending incremental file list


sent 919,688 bytes  received 4,660 bytes  34,881.06 bytes/sec
total size is 1,366,276,057  speedup is 1,478.10 (DRY RUN)

まとめ

記事を通じて、シェルスクリプトを用いたデプロイプロセスの自動化方法を紹介しました。自動化により、デプロイ作業の精度を高めると共に、開発チームの生産性を向上させることが可能です。この手法を実践することで、仕事先の現場にCDツールがなくても、日々のデプロイ作業をスムーズに進められるようになります。

JenkinsやGithub Actions導入してくれと泣きたい気持ちになりながらFTPクライアントツールでポチポチ頑張っているそこのあなた。

もし記事が役に立ったと感じたら、ぜひいいねやバッジを通じて応援してください。
先日はじめてバッジいただけてモチベーションが上がっています。
応援していただければ、より質の高い記事を提供し続ける原動力となります。
宜しくお願いします。

Discussion