巨大なリポジトリをサブモジュールに登録していると更新にめちゃ時間が掛かるのをどうにかしたいという記事を Qiita に書きました。
Git
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
を読み込んで使用させてもらっている。例えば gl
で git pull
, gs
で git status
, gc
で git 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
サポートしている通知の種類
次のプルリクエストに関するアクションをしたときにチャットへ通知されます。
- プルリクエストの作成
- プルリクエストのマージ
- プルリクエストの更新
- プルリクエストの取り下げ
- プルリクエストに対してのコメント
簡単な通知フロー
- Bitbucket 上でプルリクエストの作成やマージなどを行う
- Bitbucket から指定した任意のサーバに対して hook post が飛ぶ
- 任意サーバ上のアプリケーション(今回のツール)が post を受け取り、任意のチャットサービスに通知メッセージをポスト
必要なもの
- PHP 5.3+ (with cURL & composer)
- Chatwork の API トークン (Chatwork に通知する場合)
- Slack の API トークン (Slack に通知する場合)
- トークンは Slack API のページで発行できます。
- Bitbucket のリポジトリ (要 Admin 権限)
インストール方法
- Github からソース一式ダウンロード
- 任意サーバにソースアップロード
- パーミッションの修正
chmod -R 777 tmp
- 設定ファイルの配置と設定
- 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
- Chatwork の場合:
- Composer で必要プラグインインストール
composer install
- 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
- Chatwork の場合の例:
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 が変更になったため更新しました。