概要
Homebrewの各種コマンド brew doctor
brew update
brew upgrade
を一日一回自動実行するようにし、homebrewでinstallしたアプリケーションを常に最新化する手順を記載します.
前提
Brefileファイルの管理は、brew-fileを利用しています.
https://github.com/rcmdnk/homebrew-file
なのでupdateコマンドに微妙に差異があるので、スクリプトは適宜読み替えて下さい.
script準備
brew update
等を実行するスクリプトを準備する.
#!/bin/sh
launchctl setenv PATH /usr/local/bin:$PATH
log_dir=$HOME/Library/Logs/Homebrew/update
log_name=${log_dir}/`date "+%Y%m%d"`.log
if [ ! -d ${log_dir} ]; then
mkdir -p ${log_dir}
fi
brew doctor >> ${log_name} 2>&1
if [ $? -eq 1 ]; then
brew file update >> ${log_name} 2>&1
brew file cask_upgrade >> ${log_name} 2>&1
fi
自動実行設定
plist準備
macで自動実行するためにplistを用意する
$ cd $HOME/Library/LaunchAgents
# ファイルの中身については以下を参照
$ sudo vi homebrew_update.plist
homebrew_update.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>UserName</key>
<string>user</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
<key>HOME</key>
<string>/Users/user</string>
</dict>
<key>Label</key>
<string>homebrew_update</string>
<key>ProgramArguments</key>
<array>
<string>/Users/user/dotfiles/bin/brew_update</string>
</array>
<key>RunAtLoad</key>
<false/>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key>
<integer>01</integer>
<key>Minute</key>
<integer>00</integer>
</dict>
</array>
</dict>
</plist>
以下注意点
- HOME
各ユーザのHOMEディレクトリを指定して下さい.
launchdには$HOMEが引き継がれないので、この設定が必須... - Label
各自お好きな名前に - StartCalendarInterval
何時に定期実行したいか記述. 例の場合は1時に実行されるので、おこのみで変更する
登録
# plist登録
$ sudo launchctl load -w $HOME/Library/LaunchAgents/homebrew_update.plist
# 登録されているか確認
$ sudo launchctl list | grep homebrew_update
- 0 homebrew_update
実行確認
$HOME/Library/Logs/Homebrew/update
のログを確認して、問題無いか確認する
苦労した点
PATHがスクリプトに引き継がれてない
最初スクリプト/plistを作って実行したら以下のエラーがsystem.logにでた。
Aug 3 15:59:00 macbookair com.apple.xpc.launchd[1] (homebrew_update[4403]): Service exited with abnormal code: 1
brew doctor
部分で実行できずにこけていたので、調べてlaunchctl setenv PATH /usr/local/bin:$PATH
をスクリプト内に追加する事で解決
HOMEがスクリプトに引き継がれてない
スクリプト内のbrew update
実行時に、以下のようなエラーがでて失敗していた.
$ git pull
Permission denied (publickey).
fatal: Could not read from remote repository.
原因はHOMEが引き継がれずに、.ssh/configが読めてなかったから.
どうもHOMEは認識できないようで、plistで明示的にHOMEを宣言してあげる事で解決