capistranoデプロイフォルダ名をUTC→JSTに変更する

capistranoのデフォルトではデプロイするフォルダ名がUTC日付になっており、
サーバ上でわかりにくいので設定を変更してみた。

●deploy.rb


# デフォルトがTime.now.utc.〜を使っているため上書きする
set(:release_name) {
set :deploy_timestamped, true; Time.now.strftime("%Y%m%d%H%M%S")
}

SSHでのgitリポジトリ公開

例えば「/home/hoge」以下にフォルダを掘って、sshで公開する方法。

1. フォルダ作成

mkdir -p /home/hoge/repos/project

2. 公開用bareリポジトリ作成

git clone --bare project project.git

これでリポジトリ作成完了。
sshでのcloneが可能になる。

※例:ローカルにsshでつないでclone
git clone ssh://localhost/home/hoge/repos/project/project.git

※例:ローカルファイルのリポジトリをclone
git clone file:///home/hoge/repos/project/project.git

Ubuntu上でMySQLデータをtmpfs上に配置する

テストが増えてRspecフル実行が10分以上かかる。何とかしたい。
MySQLデータメモリ上に置いて速くすれば良いんじゃね?
ということで、MySQLのデータファイルをtmpfsに置くことで速度向上を計ってみた。

前提

  • Ubuntu11.10
  • MySQL5.1

手順

tmpfsのマウント
 sudo mount -t tmpfs -o size=512m  tmpfs /mnt/mysql_tmpfs/
MySQLデータのバックアップ
 sudo service mysql stop
 sudo mv /var/lib/mysql /var/lib/mysql_backup
MySQLデータをコピー&シンボリックリンク作成
 sudo mkdir /mnt/mysql_tmpfs/mysql
 sudo cp -rf /var/lib/mysql_backup/* /mnt/mysql_tmpfs/mysql
 sudo ln -s /mnt/mysql_tmpfs/mysql /var/lib/mysql
AppArmor設定

このままMySQLを起動したところ起動しないので、/var/log/mysql/error.logを見たところ「Plugin 'FEDERATED' is disabled.〜」とか言われている。
これはAppArmorにより許可されていない場所にデータが配置されているためであり、以下のように該当フォルダの許可設定を追加する必要がある。

 sudo vi /etc/apparmor.d/usr.sbin.mysqld 
# 追加
/mnt/mysql_tmpfs/mysql/ r,
/mnt/mysql_tmpfs/mysql/** rwk,
MySQL起動
 sudo service mysql start

結果

「これでspecが5倍ぐらい速くなっちゃうだろうな、ヒャッハー!」と勢い良くRspec実行
→10分かかっていたspecが8分になっただけ。。。たった2割の向上。。。
どうやらMySQLのI/Oよりも、CPU性能やソースコード&fixtureの読み込みI/Oなどのほうが大きく性能に影響する模様。

JenkinsPersonaジェネレータ作成&コマンドーPersonaを作成してみた

今、自分の中でJenkinsPersonaPluginを使ったカスタマイズが熱いので、勢いでジェネレータを作成したので公開。
ついでにコマンドーPersonaを作成してみた。

コマンドーは今週木曜、2012/6/28 13:25からテレ東で放送!
http://www.tv-tokyo.co.jp/program/detail/13645_201206281325.html




コマンドーPersona作成


こんな感じで入力。

作成したプラグインファイルはここからDL可能。 https://github.com/downloads/TrinityT/jenkins_persona_generator/command_persona.zip

コマンドーPersona導入

既にJenkinsPersonaPluginをインストール済み前提です。
$JENKINS_HOME/persona以下に展開。
そのあとは「設定→ビルド後の処理→Associate Persona」でPersonaを指定すればOK。

unzip command_persona.zip
mv command $JENKINS_HOME/persona/
chown jenkins:jenkins -R $JENKINS_HOME/persona/
service jenkins restart

これで君もネタJenkinsライフ!

Jenkins+schemaSpyでHTMLテーブル定義書を生成する

DBスキーマからテーブル定義書を生成する方法を探していた所、schemaSpyというツールを発見。
これとJenkinsを組み合わせて、常に最新のHTMLテーブル定義書を生成する方法を確立できた。

前提

  • UbuntuServer11.10
  • MySQL5.1
  • JDK1.6系がインストールされていること
  • Jenkins実行サーバで対象のDBにアクセス可能なこと

手順

JDBCコネクタインストール
sudo apt-get install libmysql-java
# 確認
ls /usr/share/java/mysql.jar
schemaSpyのjarを配置
mkdir /var/lib/jenkins/schemaSpy
cd /var/lib/jenkins/schemaSpy
wget http://jaist.dl.sourceforge.net/project/schemaspy/schemaspy/SchemaSpy%205.0.0/schemaSpy_5.0.0.jar
Jenkinsに設定追加

以下をJenkinsの「ビルド手順:シェルの実行」に追加する。
※2012/9/21 追記 以下のは単独で定義する必要あり。他の「シェルの実行」と一緒の手順に追加すると、テストが失敗してもビルドは正常とみなされてしまうケースがあった。

# schemaSpyによるHTMLテーブル定義書生成
mkdir -p $WORKSPACE/schemaSpy
java -jar /var/lib/jenkins/schemaSpy/schemaSpy_5.0.0.jar -dp /usr/share/java/mysql.jar \
-t mysql -o $WORKSPACE/schemaSpy -host localhost  -u hoge -p fuga -db piyo -charset utf-8

# 静的ファイルを公開用フォルダ/var/lib/jenkins/userContentに置くと、http://~/userContent/から参照可能
mkdir -p /var/lib/jenkins/userContent/$JOB_NAME/
ln -fns $WORKSPACE/schemaSpy /var/lib/jenkins/userContent/$JOB_NAME/schemaSpy

これで http://~/userContent/$JOB_NAME/schemaSpy/index.html からテーブル定義書生成を閲覧可能になる。
Migrationでのコメント追加 と組み合わせるとイイ感じ。

補足

MySQLでschemaSpyを使用する場合でportを指定する場合は、portオプションが効かないのでhostオプションにport番号を追加(※localhost:13306みたいに)して実行する必要あり。
これは接続文字列が「jdbc:mysql:///」で展開され、portが無視されているため発生する模様。

×失敗(port:13306)
java -jar /var/lib/jenkins/schemaSpy/schemaSpy_5.0.0.jar -dp /usr/share/java/mysql.jar \
-t mysql -o $WORKSPACE/schemaSpy -host localhost -port 13306 -u hoge -p fuga -db piyo -charset utf-8

○成功(port:13306)
java -jar /var/lib/jenkins/schemaSpy/schemaSpy_5.0.0.jar -dp /usr/share/java/mysql.jar \
-t mysql -o $WORKSPACE/schemaSpy -host localhost:13306  -u hoge -p fuga -db piyo -charset utf-8

Rails2.3.14+MySQL5.1でテーブル&カラムコメントをMigrationで追加する

以前書いたエントリPostgresqlでのコメントを追加したが、Rails2.3.14案件でテーブル&カラムコメントをつける必要が出たのでメモ。

※2012/6/20 add_column_commentメソッドを一部修正

パッチ

これをconfig/initializers/column_comment.rbにでも入れておけば、Migration時にコメントを付加してくれる。

注意点
Rails2.3.14のMigration部分を思い切りコピペして改造しているため、意図しない動きになるかもしれない。

# NOTICE : Rails2.3.14のActiveRecordを前提としている。
module ActiveRecord
  module ConnectionAdapters
    class MysqlAdapter
      def create_table(table_name, options = {})
        table_definition = TableDefinition.new(self)
        table_definition.primary_key(options[:primary_key] || Base.get_primary_key(table_name.to_s.singularize)) unless options[:id] == false

        yield table_definition if block_given?

        if options[:force] && table_exists?(table_name)
          drop_table(table_name, options)
        end

        create_sql = "CREATE#{' TEMPORARY' if options[:temporary]} TABLE "
        create_sql << "#{quote_table_name(table_name)} ("
        create_sql << table_definition.to_sql
        create_sql << ") #{options[:options]}"
        if options[:comment]
          create_sql << " COMMENT '#{options[:comment]}'"
        end
        execute create_sql
      end

      def add_column(table_name, column_name, type, options = {})
        add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
        add_column_options!(add_column_sql, options)
        if comment = options[:comment]
          add_column_sql = "#{add_column_sql} COMMENT '#{comment}'"
        end
        add_column_position!(add_column_sql, options)
        execute(add_column_sql)
      end

      def add_column_comment(table_name, column_name, comment = "")
        options = {}
        if column = columns(table_name).find { |c| c.name == column_name.to_s }
          options[:default] = column.default
          options[:null] = column.null
        else
          raise ActiveRecordError, "No such column: #{table_name}.#{column_name}"
        end
        define = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'")
        current_type = define["Type"]
        current_extra = define["Extra"]
        add_comment_sql = "ALTER TABLE #{quote_table_name(table_name)} CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{current_type} COMMENT '#{comment}'"
        add_column_options!(add_comment_sql, options)
        add_comment_sql += " #{current_extra}" if current_extra.present?
        execute(add_comment_sql)
      end


      def add_table_comment(table_name, comment = "")
        add_comment_sql = "ALTER TABLE #{quote_table_name(table_name)} COMMENT '#{comment}'"
        execute(add_comment_sql)
      end

    end

    class ColumnDefinition
      attr_accessor :comment
      alias :_orig_to_sql :to_sql
      def to_commented_sql
        self.comment ? "#{_orig_to_sql} COMMENT '#{self.comment}'" : _orig_to_sql
      end
      alias to_sql :to_commented_sql
    end

    class TableDefinition
      alias :_orig_column :column
      def column(name, type, options = {})
        _orig_column(name, type, options)
        if comment = options[:comment]
          column = @columns.find { |col| col.name == name }
          pos = @columns.index(column)
          @columns[pos].comment = comment
        end
        self
      end
    end
  end
end

migrationファイルの書き方

以下の通り:commentオプション or 引数にで対応。

●テーブル作成時
    create_table :hoge_masters, :comment => "hogehoge" do |t|
      t.string   :code, :comment => "fugafuga"
    end
●カラム追加時
    add_column    :hoge_masters, :value, :integer, :comment => "コメコメ"
●テーブルコメント追加 ※独自作成機能
    add_table_comment    :hoge_masters, "テステス"
●カラムコメント追加   ※独自作成機能
    add_column_comment   :hoge_masters, :effective_value, "コメコメ111"

特定文字置換スニペット

一括置換をRubyスクリプトで作成したのでメモ。bash等シェルに貼りつければ変更可能。
Railsカラム名ルールの統一等で重宝した。

find -name '*.rb' | xargs ruby -i -e '
names=[
["hogehoge","hugahuga"],
["col_name","name_col"]
]
ARGF.each do |line|
  names.each do |name|
    line.gsub!(name[0].to_s, name[1].to_s)
  end
  puts line
end
'