cronを用いてbrew update & brew upgradeを定期的に自動実行

# はじめに
Homebrewのアップデートを定期的に実行するの面倒くさくないですか？
私は友人に毎日アプデした方がいいと言われて、毎日アプデしているのですが、これが地味に面倒くさい。

そこで、アップデート（brew update & brew upgrade）を定期的に自動実行するやり方を紹介します！

なんで定期的にアップデートした方がいいかは、下記記事をご参考に。

https://qiita.com/jintz/items/b2a80590531c373bae39


# やり方
1. ~/.zshrcに 'export EDITOR=vim' を追記
1. ~/.vimrcに 'set nowritebackup'と'set nobackup' を追記
1. Homebrewをアップデートするシェルスクリプトを作成
1. 作成したシェルスクリプトに実行権限を付与
1. cronによる定期実行を設定

## 1. ~/.zshrcに 'export EDITOR=vim' を追記
下記をターミナルで実行。
```
echo '# デフォルトのエディタを Vim に設定' >> ~/.zshrc
echo 'export EDITOR=vim' >> ~/.zshrc
source ~/.zshrc
```

この設定をしていないと、cronを登録しても保存されずに、エラーで終了してしまうそうです。

https://yinm.hatenadiary.jp/entry/2017/02/19/234928

## 2. ~/.vimrcに 'set nowritebackup'と'set nobackup' を追記
下記をターミナルで実行。
```
echo '" ファイルを上書きする前にバックアップを作ることを無効化' >> ~/.vimrc
echo 'set nowritebackup' >> ~/.vimrc
echo '" ファイルを上書きする前にバックアップを作ることを無効化' >> ~/.vimrc
echo 'set nobackup' >> ~/.vimrc
```
先ほどと同様に、この設定をしていないと、cronを登録しても保存されずに、エラーで終了してしまうそうです。

https://yinm.hatenadiary.jp/entry/2017/02/19/234928

https://qiita.com/iwaseasahi/items/0b2da68269397906c14c

## 3. Homebrewをアップデートするシェルスクリプトを作成
私は、下記のシェルスクリプトを /Users/(あなたのユーザ名)/logs/crontab_scripts/ 下に配置しました。ファイル名はauto_update_brew.shとしました。
シェルスクリプトの内容として、/Users/(あなたのユーザ名)/logs/ 下に、brew update と brew upgradeした時の実行結果をログファイル(ファイル名の形式: yyyymmdd_hhmmss.log)として出力するようにしました。
**スクリプト内のlog_nameのパスの一部分は、自分のユーザ名にすることを忘れないでください。**

```
#!/bin/bash

# cronがbrewコマンドを使えるように、環境変数を設定
export PATH=/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin

# ログファイル名を設定
log_name="/Users/(あなたのユーザ名)/logs/$(date '+%Y%m%d_%H%M%S').log"

# Homebrewのアップデート実行開始日時を出力
echo "Script started at $(date)" >> "${log_name}" 2>&1

# brew updateの実行開始を出力
echo 'brew update ---------------------------------------------------' >> "${log_name}" 2>&1
# brew updateを実行し、結果を出力
/opt/homebrew/bin/brew update >> "${log_name}" 2>&1

# brew upgradeの実行開始を出力
echo 'brew upgrade --------------------------------------------------' >> "${log_name}" 2>&1
# brew upgradeを実行し、結果を出力
/opt/homebrew/bin/brew upgrade >> "${log_name}" 2>&1

# お好みでコメントアウト
# echo 'brew cleanup --------------------------------------------------' >> "${log_name}" 2>&1
# /opt/homebrew/bin/brew cleanup >> "${log_name}" 2>&1

# Homebrewのアップデート実行終了日時を出力
echo "Script ended at $(date)" >> "${log_name}" 2>&1
```

もし、brewコマンドのパスが "/opt/homebrew/bin/brew"ではなかった場合、
```
$ which brew
/opt/homebrew/bin/brew
```
下記の/opt/homebrew/binを修正する必要があるかもしれません。
その時は下記を適宜修正してください。
```
# cronがbrewコマンドを使えるように、環境変数を設定
export PATH=/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

## 4. 作成したシェルスクリプトに実行権限を付与
下記コマンドを実行。cronの定期実行を可能にするために必要です。
**ここでもパスの一部分を自分のユーザ名にすることを忘れずに。**
**あと、スクリプト名やディレクトリ構成を変えた人は、パスを適切に変更してください。**
```
chmod +x /Users/(あなたのユーザ名)/logs/crontab_scripts/auto_update_brew.sh
```

## 5. cronによる定期実行を設定
下記コマンドで cronの設定ファイルを開き、
```
crontab -e
```
下記を追記しましょう。
```
# Homebrewのupdateを毎日15時00分に実行
0 15 * * * /Users/(あなたのユーザ名)/logs/crontab_scripts/auto_update_brew.sh
```
**これで、Homebrewのアップデートが毎日15時に行われるようになります！**
ちなみに、"15"から"13"にすれば、毎日13時に実行されるようになります。
もっと細かい設定をしたい方は、下記の記事を参考に。

https://newapps.hatenablog.com/entry/2013/09/02/172801


# アップデートが上手く行った時のログファイルの中身
```
cat 20250109_150006.log 
Script started at Thu Jan  9 15:00:06 JST 2025
brew update ---------------------------------------------------
==> Updating Homebrew...
Updated 3 taps (oven-sh/bun, homebrew/core and homebrew/cask).
==> New Formulae
codesnap
openapi-tui
oven-sh/bun/bun@1.1.43
==> New Casks
aw-edid-editor
font-brass-mono
font-nanum-square
font-nanum-square-neo
font-nanum-square-round
macai
serial-studio
==> Outdated Formulae
bun
libpng

You have 2 outdated formulae installed.
You can upgrade them with brew upgrade
or list them with brew outdated.
brew upgrade --------------------------------------------------
==> Upgrading 2 outdated packages:
libpng 1.6.44 -> 1.6.45
oven-sh/bun/bun 1.1.42 -> 1.1.43
==> Downloading https://ghcr.io/v2/homebrew/core/libpng/manifests/1.6.45
==> Fetching libpng
==> Downloading https://ghcr.io/v2/homebrew/core/libpng/blobs/sha256:2d9fddec7ff85ea205bf37bcba29116f37b581da9eb90c5bb8beda489f7d6105
==> Fetching oven-sh/bun/bun
==> Downloading https://github.com/oven-sh/bun/releases/download/bun-v1.1.43/bun-darwin-aarch64.zip
==> Downloading from https://objects.githubusercontent.com/github-production-release-asset-2e65be/357728969/43522b9c-243f-4e8f-a0a4-b88c8ed3435d?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250109%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250109T060031Z&X-Amz-Expires=300&X-Amz-Signature=9eefaa7c7b4c7fc68a9ff8e0e550edd726089ec5f38612e9a6c8d8f0f02f53f1&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dbun-darwin-aarch64.zip&response-content-type=application%2Foctet-stream
==> Upgrading libpng
  1.6.44 -> 1.6.45 
==> Pouring libpng--1.6.45.arm64_sequoia.bottle.tar.gz
🍺  /opt/homebrew/Cellar/libpng/1.6.45: 28 files, 1.3MB
==> Running `brew cleanup libpng`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
Removing: /opt/homebrew/Cellar/libpng/1.6.44... (28 files, 1.3MB)
Removing: /Users/youtome/Library/Caches/Homebrew/libpng_bottle_manifest--1.6.44... (8.1KB)
Removing: /Users/youtome/Library/Caches/Homebrew/libpng--1.6.44... (448.6KB)
==> Upgrading oven-sh/bun/bun
  1.1.42 -> 1.1.43 
==> Caveats
Bash completion has been installed to:
  /opt/homebrew/etc/bash_completion.d

zsh completions have been installed to:
  /opt/homebrew/share/zsh/site-functions
==> Summary
🍺  /opt/homebrew/Cellar/bun/1.1.43: 8 files, 53.3MB, built in 3 seconds
==> Running `brew cleanup bun`...
Removing: /opt/homebrew/Cellar/bun/1.1.42... (8 files, 53.0MB)
Removing: /Users/youtome/Library/Caches/Homebrew/bun--1.1.42.zip... (19MB)
==> Caveats
==> bun
Bash completion has been installed to:
  /opt/homebrew/etc/bash_completion.d

zsh completions have been installed to:
  /opt/homebrew/share/zsh/site-functions
Script ended at Thu Jan  9 15:00:43 JST 2025
```


# おわりに
Homebrewの自動アップデートはApacheなどに影響するので、注意して行いましょう。


# 参考にしたサイト
https://qiita.com/jintz/items/b2a80590531c373bae39

https://yinm.hatenadiary.jp/entry/2017/02/19/234928

https://qiita.com/iwaseasahi/items/0b2da68269397906c14c

https://newapps.hatenablog.com/entry/2013/09/02/172801