MacのAutomatorを使ってHomebrewを自動アップデートする方法 

## はじめに

この記事では、MacのautomatorとCalendarアプリを使って、Homebrewを定期的にアップデートする方法についてお話しします。
HomebrewはMacユーザーにとって便利なパッケージマネージャーなので、定期的なアップデートはこまめにやっておきたいですよね。

## なぜアップデートが必要なの？

アップデートすることで、以下のような利点があります。

- セキュリティ上の脆弱性が修正される
- formulaeの最新版がインストールされる
    - バグが修正され、安定性が向上する
    - 新しい機能が追加される

定期的にアップデートすることで、常に最新の状態を維持し、セキュリティ面でも安定性の面でも恩恵を受けることができます。

## どんな風にするの？

この自動化スクリプトは、Homebrewのアップデートを次の3つのステップで行います：

1. **Homebrewの更新**: Homebrewを最新の状態に更新します
2. **インストール済みのパッケージの更新**: インストール済みのパッケージを最新版にアップグレードします。`--greedy`オプションを使って、できるだけ最新版を優先的にインストールします
3. **古いパッケージのクリーンアップ**: 古いバージョンのパッケージや不要なファイルを削除して、ディスクスペースを開放します

## スクリプトの中身

こんな感じの自動化スクリプトが必要です。

```zsh
#!/bin/zsh

set -e

# ログディレクトリとログファイルの設定
logdir=~/logs/brew
logfile=$logdir/calendar_alarm_brew_update.log
errorlogfile=$logdir/calendar_alarm_brew_update_error.log

# ログディレクトリが存在しない場合は作成
mkdir -p $logdir

# 環境変数の読み込み
source ~/.env

# ログメッセージを出力する関数
log_message() {
  local message=$1
  local log_file=$2
  echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" | tee -a $log_file
  echo "--------------------------------------------------" | tee -a $log_file
}

# 環境変数が設定されているかチェックする関数
check_env_var() {
  local var_name=$1
  local var_value=$(eval echo \$$var_name)
  if [ -z "$var_value" ]; then
    log_message "環境変数$var_nameが設定されていません。" $errorlogfile
    exit 1
  fi
}

# brewコマンドを実行する関数
execute_brew_command() {
  local command=$1
  local options=${2:-""}
  /usr/bin/expect -c "
    set timeout 60
    spawn /opt/homebrew/bin/brew $command $options
    expect {
      \"Password:\" {
        send \"$MAC_LOGIN_PASSWORD\n\"
        exp_continue
      }
      eof
    }
  " >>$logfile 2>>$errorlogfile
}

# ログを出力しながらbrewコマンドを実行する関数
log_and_execute_brew_command() {
  local message=$1
  local command=$2
  local options=${3:-""}

  log_message "$message - 開始" $logfile
  execute_brew_command $command $options
  log_message "$message - 終了 - 終了コード: $?" $logfile
}

# 環境変数MAC_LOGIN_PASSWORDが設定されているかチェック
check_env_var MAC_LOGIN_PASSWORD

# Homebrewの更新
log_and_execute_brew_command "Homebrewの更新..." "update"
# インストール済みformulaeの更新
log_and_execute_brew_command "インストール済みformulaeの更新..." "upgrade" "--greedy"
# 古いformulaeの削除
log_and_execute_brew_command "古いformulaeの削除..." "cleanup"
```

## .envファイルの設定

スクリプト内で参照している環境変数`MAC_LOGIN_PASSWORD`は、`.env`ファイルに設定しておく必要があります。

```env
export MAC_LOGIN_PASSWORD="your_mac_login_password"
```

## automatorでカレンダーアラームとして設定する

1. **automatorを起動**: MacのSpotlight検索で「automator」を検索して起動します
![スクリーンショット 2024-04-25 15.25.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489243/8ae5c714-f306-b014-629a-f827ed71bb0c.png)
2. **カレンダーアラームを作成**: 「カレンダーアラーム」を選択して、カレンダーアラームを作成します
![スクリーンショット 2024-04-25 15.26.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489243/5a72ede7-d71e-09de-22f6-3a7fbe9ee750.png)
3. **アクションを追加**: 「アクション」を選択して、検索ボックスに「シェル」と入力して、「シェルスクリプトを実行」をダブルクリックします
![スクリーンショット 2024-04-25 15.26.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489243/5a72ede7-d71e-09de-22f6-3a7fbe9ee750.png)
4. **スクリプトを追加**: [先ほどのスクリプト](#スクリプトの中身)を貼り付けます
![スクリーンショット 2024-04-25 15.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489243/c46d6b25-0dac-fa0a-4538-b7e0307be089.png)
5. **保存**: cmd + Sでワークフローを保存します(例: `brew_update`)
![スクリーンショット 2024-04-25 15.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489243/caf38eb3-c9ab-1aa3-9df2-f30287f16803.png)
6. **スケジュール設定**: Calendarアプリが開かれるので、アラームの日時や繰り返しを設定します
![スクリーンショット 2024-04-25 15.21.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489243/8c294e15-3f99-3828-0f27-56641f175669.png)

## ログの確認

スクリプトの実行ログは、`~/logs/brew/calendar_alarm_brew_update.log`に保存されます。

![スクリーンショット 2024-04-25 16.00.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489243/58716c8f-be8a-2957-29ac-acd5d18bf317.png)

## スクリプトの編集をする場合

エディタでスクリプトを編集する場合は、以下のコマンドでディレクトリを開きます。(例: Visual Studio Code)

```sh
❯ code ~/Library/Workflows/Applications/Calendar/brew_update.app
```

`Contents/document.wflow`を開いて、スクリプトを編集します。

## おわりに

この設定をすることで、定期的にHomebrewの更新を行うことができます。
めんどうな作業は自動化して、快適なMacライフを楽しみましょう！

## 参考サイト

- [Homebrew Documentation](https://docs.brew.sh/Manpage)