dotfiles を育てていくことにした

長いこと使っていた MacBook Air が遂に壊れたので MacBook Pro に新調したのだが、シェル周りの環境構築がめんどくさい!!ということで dotfiles を GitHub に上げて育てていくことにした。

他人の dotfiles リポジトリを眺めていると無限の学びがあり、時間も無限に消費されて切りがなかったので、自分にとって必須じゃないものは排除しなるべくミニマルな構成からスタートすることにした。

リポジトリ

oh-my-zsh から zplug への移行

今までは oh-my-zsh を使っていたが、起動が非常にもたつくのと、デフォルトで便利な環境のため使ってない便利機能が多くある気がしたので、これを機に zplug に移行することにした。

結果として移行して正解だった。

起動時間に関してはめちゃくちゃ早くなったわけではないのだが、今までよりもましになった。

プラグインの管理面がとても優秀で .zshrc に欲しいプラグインを記述するだけでプラグインのダウンロードから読み込みまでしてくれる。

プラグインのバージョンロックに対応しているため dotfiles リポジトリに .zshrc をアップしておけば同じプラグイン環境を再現することが容易になる。

また有り難いことに oh-my-zsh のプラグインの読み込みにも対応しているので、ヘビーに使っていた git のエイリアスを一式定義してくれるプラグイン plugins/git を読み込んで使用させてもらっている。例えば glgit pull , gsgit status , gcgit commit など。バッティングで苦しい感じのエイリアスも有るのだがもうこれに慣れてしまったのでw

以下は .zshrc から zplug 読み込みに関する部分を抜粋したもの。
zplug コマンドで必要なプラグインを記述する。

source ~/.zplug/init.zsh
zplug 'zplug/zplug', hook-build:'zplug --self-manage'

# theme
zplug "yous/lime"

# highliting
zplug "zsh-users/zsh-syntax-highlighting", defer:2

# completions
zplug "zsh-users/zsh-completions"
zplug "zsh-users/zsh-history-substring-search"
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down

# git helper
zplug "plugins/git", from:oh-my-zsh

# install plugins
if ! zplug check --verbose; then
printf "Install? [y/N]: "
if read -q; then
  echo; zplug install
fi
fi

# source plugins and add commands to $PATH
zplug load

dotfiles のインストールスクリプト構成

新しい環境に dotfiles を適用する簡単なスクリプトを書いた。他の人のリポジトリを参考に初回のみ実行する setup.sh と更新の際に都度実行する deploy.sh の二つに分けた。

setup.sh の主な内容

  • brew のインストール
  • zsh のインストール
  • 各種 brew パッケージのインストール
  • zplug のインストール
  • peco のインストール
#!/bin/bash
set -euo pipefail

source lib/echos.sh

function command_exists() {
  type "$1" &> /dev/null ;
}

: "install brew" && {
  if ! command_exists brew; then
    info "installing brew..."
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  else
    warn "brew is already installed"
  fi
}

: "install zsh by brew" && {
  BREW_ZSH_PATH="/usr/local/bin/zsh"
  if ! brew list | grep zsh &> /dev/null; then
    info "installing zsh..."
    brew install zsh zsh-completions
    sudo sh -c 'echo $(brew --prefix)/bin/zsh >> /etc/shells'
    chsh -s $(brew --prefix)/bin/zsh
  else
    warn "zsh is already installed"
  fi
}

: "install other packages by brew" && {
  packages=( peco ghq jq tree wget autojump rbenv direnv )
  for package in ${packages[@]}; do
    if ! brew list | grep $package &> /dev/null; then
      info "installing ${package}..."
      brew install ${package}
    else
      warn "${package} is already installed"
    fi
  done
}

: "install zplug" && {
  ZPLUG_DIR=$HOME/.zplug
  if [ ! -e $ZPLUG_DIR ]; then
    info "installing zplug..."
    curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh | zsh
  else
    warn "zplug is already installed"
  fi
}

ok "Complete!"

完全ではないがなるべく冪等性を持つようにした。
ok, info, warn, error などのコマンドは単に色付きの echo。

以下のような記法は 名前付きブロック記法 と呼ばれる見やすくするためのもの。

: "hoge" && {
  # do something
}

deploy.sh の主な内容

ホームディレクトリ以下に各 dotenv ファイルへのシンボリックリンクを作成するだけ。
同名のファイルがあれば作成をスキップする。

#!/bin/bash
set -euo pipefail

source lib/echos.sh

readonly DOT_FILES=( .vimrc .bashrc .zshrc .zshenv )

for file in ${DOT_FILES[@]}; do
  dest=${HOME}/${file}
  if [ -e ${dest} ]; then
    warn "[warn] ${dest}: skipped (already exists)"
  else
    ln -s $HOME/dotfiles/$file $dest
    ok "[ ok ] ${dest}: created"
  fi
done

ok "Complete!"

Slackへのプルリクエスト通知に対応しました

以前ひそかに Bitbucket 上で Pull Request 作成やコメントをしたとき、任意の Chatwork グループチャットに通知するツール を作ったのですが、Slack チャットへの投稿にも対応しました。

上の画像が実際に Slack に通知されている場面のキャプチャ画像です。

最初は Slack 標準の外部サービス連携(Integration)でやればいいじゃん、と思ったのですが、世の中そんなに甘くなく、現状だと Bitbucket のプルリクエストの通知をサポートしていないようなのでそれを行うための補助ツールになります。

リポジトリは以下になります。

以下、つらつらと概要を書いていきます。
README.md に書いている内容とほぼ同じです。

対応しているチャットサービス

  • Slack
  • Chatwork

サポートしている通知の種類

次のプルリクエストに関するアクションをしたときにチャットへ通知されます。

  • プルリクエストの作成
  • プルリクエストのマージ
  • プルリクエストの更新
  • プルリクエストの取り下げ
  • プルリクエストに対してのコメント

簡単な通知フロー

  1. Bitbucket 上でプルリクエストの作成やマージなどを行う
  2. Bitbucket から指定した任意のサーバに対して hook post が飛ぶ
  3. 任意サーバ上のアプリケーション(今回のツール)が post を受け取り、任意のチャットサービスに通知メッセージをポスト

必要なもの

  • PHP 5.3+ (with cURL & composer)
  • Chatwork の API トークン (Chatwork に通知する場合)
  • Slack の API トークン (Slack に通知する場合)
    • トークンは Slack API のページで発行できます。
  • Bitbucket のリポジトリ (要 Admin 権限)

インストール方法

  1. Github からソース一式ダウンロード
  2. 任意サーバにソースアップロード
  3. パーミッションの修正
    • chmod -R 777 tmp
  4. 設定ファイルの配置と設定
    • Chatwork の場合:
      • cp config/chatwork.json.default config/chatwork.json
      • vim config/chatwork.json
    • Slack の場合:
      • cp config/slack.json.default config/slack.json
      • vim config/slack.json
  5. Composer で必要プラグインインストール
    • composer install
  6. Bitbucket のリポジトリ設定から Pull Request POST の hook url 設定
    • Chatwork の場合の例:
      • http://example.com/bitbucket_event_notification/gateway.php?destination_service=chatwork&room_id=1000000000
    • Slack の場合の例:
      • http://example.com/bitbucket_event_notification/gateway.php?destination_service=slack&room_id=C1234567890

gateway.php が受け付ける GET パラメータ一覧

キー 説明 Chatwork の場合の値の例 Slack の場合の値の例
destination_service 通知先チャットサービス chatwork slack
room_id 通知先のチャットルームID (チャンネル) 1000000000 #bitbucket, C1234567890
  • room_id の指定に # が含まれる場合は URL エンコードが必要
    • 例: #bitbucket -> %23bitbucket

個人的な事情など

普段メインで使うチャットが Chatwork から Slack に変わった関係で Chatwork のほうの動作確認が手薄になってます。もし不具合などあればコメント or PR お待ちしてます。

また、プルリクエストのマージ、更新、取り下げの際に Pull Request へのリンクが無いのは仕様となっています。Approve / UnApprove の hook request に至っては、「どれかのプルリクエストに対して Approve / UnApprove された」という情報しか分からないという謎仕様になっていて、あえて通知の実装をしていません :(

Bitbucket アカウントを持ってる人は是非 issue にアクセスして vote をぽちっとお願いしますw
site / master / issues / #8340 – Pull Request POST hook does not include links to related objects (BB-9535) — Bitbucket

2015/08/19 03:19 – リポジトリの url が変更になったため更新しました。