Minaでデプロイした際にIRCへ通知する

minaでデプロイした際にIRCへ通知を行う様にしたのでその際の対応のメモ。ゴールとしては、IRCの任意のチャンネルにデプロイ開始時等にメッセージを流したいと思います。

f:id:hideack:20131113093442p:plain

そういえばIRCで流す文字に色を付けたい

上の様に貼った画像の様な形でIRC上に色つき文字で表示されると可視性も高くて良いのでStringIrc という便利GemをGemfileに追加しておきます。

# Gemfile
gem 'string-irc'

追加したら bundle install します。

config/deploy.rb にIRC通知用のtaskを追加

minaの設定中に、IRC通知用の定義を追加します。今回、自分は下の様な形で書いてみました。

require 'string-irc'
namespace :util do
desc "#hoge IRC notice. (start)"
task :irc_notice_for_start do
messages = [
StringIrc.new('[hoge Deploy] Start!').white('orange').bold.to_s,
"---> #{Time.now.to_s}",
"---> Deploy to: #{domain} / Git: #{repository} / Branch: #{branch}"
]
messages.each do |message|
irc_notice '#hoge', message
end
end
end

このタスク中にある、irc_notice というメソッドは別途定義していますが省略します。役割的には任意のチャンネルに任意の文字列を通知できる様にしています。*1

試しにこのタスクだけ動作を確認したければ、

$ bundle exec mina util:irc_notice_for_start

で確認できます。

deployタスク中にIRC通知用タスク追加

上まで準備できたら実際にMinaの deploy タスク中に上で新設したIRC通知用のタスクを追加します。

# config/deploy.rb
# (中略)
desc "Deploys the current version to the server."
task :deploy => :environment do
deploy do
# Put things that will set up an empty directory into a fully set-up
# instance of your project.
invoke :'util:irc_notice_for_start'   # ここを追加した
invoke :'git:clone'
invoke :'deploy:link_shared_paths'
invoke :'bundle:install'

以上で準備が完了です。実際にMinaで

$ bundle exec mina deploy

とすれば、設定したIRCのチャンネルへデプロイ通知された上でデプロイが行われます。

*1:Ikachan環境があればそのホストに向けてPOSTする形

Chefで ~/.ssh/authorized_keys を配置する

Chefでコンフィグレーションをさせることを先日から取り組んでいて、その中でサーバに接続する予定のユーザの公開鍵を予め配置しておきたいと思っていたところ以外とあっさりとできたのでそのメモ。

状況的にはチームで共有しているユーザがあって、

  • 対象のサーバに存在するそのユーザを利用して複数の端末から公開鍵認証でのSSH接続を行いたい
  • そのため各端末の公開鍵を予め管理してコンフィグレーションする際に自動的に設定したい

が、満たせれば満足。これができれば自分たちの状況であれば、LXCを作るたびにこのレシピを適用すればすぐにチームメンバがSSH接続を特定のユーザでログインできる様になります。

まず、公開鍵を配置するdefinitionを新しく定義します。

# site-cookbooks/base/definition/authorized_keys_for.rb
define :authorized_keys_for, :keys => "public-keys", :group => nil, :home => nil do
user  = params[:name]
group = params[:group] || user
home  = params[:home]  || "/home/#{user}"
keys  = data_bag params[:keys]
if keys.any?
ssh_public_keys = keys.map do |key|
data_bag_item(params[:keys], key)
end
directory "#{home}/.ssh" do
owner user
group group
mode 0700
action :create
only_if "test -d #{home}"
end
file "#{home}/.ssh/authorized_keys" do
owner user
group group
content ssh_public_keys.collect{ |x| "#{x['key']} ##{x['id']}" }.join("\n")
end
end
end

次に配置したい公開鍵をdata bagとして定義します。今後配置したい鍵が増えればその毎に定義を増やしていけばよくなります。

data_bags/public-keys/(ユーザ名).json に足していきます。

# data_bags/public-keys/hideack.json
{
"id": "hideack",
"key": "ssh-rsa AAAAB3…."
}

ここまで準備できたら、上のdefinitionをレシピ中で使えるので、記述します。

# site-cookbooks/base/recipes/default.rb
authorized_keys_for 'remper'   # ← これが上のdefinition呼出
%w{}.each do |pkg|
package pkg do
action :install
end
end

実行してみます。

$ knife solo cook remper@*****
Running Chef on ****...
Checking Chef version...
Enter the password for remper@*****:
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 11.8.0
Compiling Cookbooks...
Converging 10 resources
Recipe: base::default
* directory[/home/remper/.ssh] action create
- change mode from '0775' to '0700'
* file[/home/remper/.ssh/authorized_keys] action create
- update content in file /home/remper/.ssh/authorized_keys from d0209a to 5cf54f
(略)

これで、Chefを適用したサーバに対してSSH接続の認証に利用するための公開鍵の配置が行われました。地味に楽になりました...。

参照

デプロイツールminaを使ってみた

いま複数あるPadrinoのアプリケーションのデプロイでmina を使ってみようと試した際のメモ。
仕事ではCapistrano(+ Webistrano)を利用していますが、RubyのプロジェクトなのとソースコードもGit管理されているので試してみました。

準備

  • プロジェクトのGemfileに gem 'mina' を追加した後、bundle install する
  • プロジェクトルートで以下のコマンド実行してデプロイ用の設定ファイルを生成します
  • 中身にかなりコメント等も含めたテンプレートが出力されるので非常にわかりやすいです
$ bundle exec mina init
-----> Created ./config/deploy.rb
Edit this file, then run `mina setup` after.

接続先側(リモート側)

  • あとデプロイ先のホスト(リモート側)に公開鍵認証のSSH接続をできる様にしておく必要があります
  • また、更にデプロイ対象のソースコード取得にGithubを利用するのであれば、その接続先ホストからcloneできる様にする必要があります。
  • リモート先の公開鍵をgithubに登録しておく。 ssh-keygen -t rsa で作成して https://github.com/settings/ssh で登録
  • 登録したら、リモート側のホストでssh -T git@github.com で接続チェックしてホスト登録。*1

実行

ここまでできれば、あとはminaからsetupコマンドを実行して、リモート側のディレクトリ構成等を準備します。

$ bundle exec mina setup
-----> Setting up /home/hideack/sample
total 16
drwxrwxr-x 4 hideack hideack 4096 Nov  2 05:03 .
drwxr-xr-x 5 hideack hideack 4096 Nov  2 05:02 ..
drwxrwxr-x 2 hideack hideack 4096 Nov  2 05:03 releases
drwxrwxr-x 2 hideack hideack 4096 Nov  2 05:03 shared
-----> Done.
-----> Be sure to edit 'shared/config/database.yml'.
Elapsed time: 0.00 seconds

引き続きデプロイしてみます。上に書いたタスクだと、

  • githubからclone
  • bundle install の実行

が順に行われます。

$ bundle exec mina deploy
-----> Creating a temporary build path
-----> Fetching new git commits
-----> Using git branch 'master'
Cloning into '.'...
done.
-----> Using this git commit
-----> Symlinking shared paths
-----> Installing gem dependencies using Bundler
Fetching gem metadata from http://rubygems.org/.......
Fetching gem metadata from http://rubygems.org/..
Using rake (10.0.4)
(略)
-----> Build finished
-----> Moving build to releases/1
-----> Updating the current symlink
-----> Launching
-----> Done. Deployed v1
Elapsed time: 32.00 seconds

意外とあっさりとデプロイできてしまった。デフォルトでCapistranoで差分をデプロイする様になっている様で2回目以降のデプロイは相当スムーズです。(リポジトリの丸ごと clone は最初だけ、次回以降は差分のみ)

ほとんど引っかかることがなかったけど、使い始めたらいろいろ引っかかるかもしれないので、都度整理。

但し、ここまでではunicornが起動していない状態なので、タスクを更に追加していきます。(また今度)

参考

*1:これをしておかないと、デプロイタスクを繋いだ際にgit cloneできないエラーが出るので...。

今日の一枚

限りなく青空だった。

道には落ち葉が落ちていて、もうすっかり気づいたら秋で一息で冬になりそう。

本を読んだり、日用品買いに行ったり、パソコンさわってたりと素朴な一日だった。

今日の出来事

終日合間合間にVPSへLXC(Linux Containers) を入れてみてあれこれ触っていた。

どうでもいいが、料理していたら久しぶりに包丁で手を切ってしまった。キーボードが打ちにくくて仕方がない。

Chrome拡張 "REMP it"

YouTube動画を連続再生できるWebアプリREMPChrome拡張 "REMP it" をリリースしました。
これを利用すると、Chrome拡張のアイコンをクリックするだけで、閲覧中のページ中に埋め込まれているYouTubeのリンクからREMPのプレイリストとして取り込むことができます。

インストールはChromeウェブストアから簡単にできますので是非お試しください。

初めてChrome拡張書いてみて

今回初めてChrome拡張を作ってみたのですが、最初とっきつきにくいところもあったのですが、一度概要を飲み込めれば比較的作りやすく、また情報もWeb上に大量に公開されているので参考になります。

注意点としては、Chrome拡張で定義するmanifestのバージョンが現在は2ですが、リリース当初の情報も数多く公開されているままの状態なので、その辺りを気をつけて参照する必要はあります。

Chromeで実際に配布したり、利用できる様にパッケージ化するのにはcrxmakeというGemを使うとrakeタスクですぐにパッケージを生成することが出来て便利でした。

具体的な実装の箇所で試行錯誤したのは、Webページ中のYouTubeリンクを列挙する処理で、このあたりは素直に以下の様な形で走査してます。

var parser = function(target, property) {
var $frames = $(target);
var ids = [], url, match, i;
var regExp = /^.*1\??v?=?([^#\&\?]*).*/;
for (i = 0; i < $frames.length; i++) {
url = $frames[i][property];
match = url.match(regExp);
if (match && match[7].length == 11) {
ids.push(match[7]);
}
}
return ids;
}
linkVideos = parser('a', 'href');
iframeVideos = parser('iframe', 'src');
paramVideos = parser('param', 'value');

また、同一ページ中に複数の同じYouTube動画のURLが含まれることもあり得るので、このあたりは上記の複数の走査結果をunionさせるのにunderscore.jsarray function使って

videos = _.union(linkVideos, iframeVideos, paramVideos);

としています。またChrome拡張で表示されるポップアップのHTMLを生成する際のtemplateも利用しています。underscore.js 便利。

もろもろ実装した内容は、Githubのhideack / remp-chrome-extensionに公開しています。

何かリクエスト等あれば、上のgithub issueやコメント等で頂ければ幸いです。

  1. youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?[]

9月に読んだ本

9月に読んだ本を振り返る。

特に鈴木敏夫さんのインタビュー集「風に吹かれて」が読み応えあった。インタビュー集。少年時代から徳間書店、アニメージュを経てジブリ設立、そして「風立ちぬ」まで。

 
風に吹かれて
風に吹かれて
価格:1,890円(税込)
 

hideackの本棚 - 2013年09月 (9作品)
風に吹かれて
鈴木敏夫
読了日:09月05日
{book['rank']


powered by booklog

ストーリーボードのプレゼンテーションをblogに貼れる様にした

ということで、twitterアカウントでアナウンスしたのですが改めて。

ストーリーボード で作成したプレゼンテーションをブログ等で埋め込める様にするためのブログパーツの提供を開始しました。
ストーリーボードで提供する閲覧用のURLを貼ることで今までもblog等でプレゼンテーション資料を紹介はできていたのですが、埋め込み用にきちんと調整した形で提供しています。@による細かいところまでの調整で比較的イメージ通りのプレゼンテーションが表示されているのではないかと思います。*1

例えば、こんな形で使うことができます。REMPの使い方3ステップとか。

プレゼンテーションの資料以外にも、簡単なフォトスライドの様に使っても良いなと作り手は思ったりしました。

使い方は簡単でメニューに埋め込みコードの表示が追加されています。

f:id:hideack:20130922142028p:plain

是非ご利用ください!

*1:Slideshareみたいにしたいな…。と思っていたのが実現しました。