App::RunCronもしくはGitMasterData
TIME rest time current/total
TopicsPlaceHolder

App::RunCronもしくはGitMasterData

Gotanda.pm #1

Jun 11th, 2014

Profile

songmu

Recent Output

私とcron

App::RunCron (runcron)

https://metacpan.org/module/App::RunCron

cron

cronの現状

cronの難点

やりたいこと

cronlog

runcron

cronlogからかなりコピペなので安心してお使いいただけます

LOGGER="/usr/local/bin/fluent-agent-lite -f msg"
RUN="/home/app/project/env-exec runcron -- "
* * * * * $RUN command ...  2>&1 | $LOGGER cron.cmd - fluentd-srv

env-exec

環境変数一式設定してから、プロジェクトディレクトリにcdするラッパーシェル。

#!/bin/sh
set -e
export USER=app
export HOME=/home/$USER
cd $(dirname $0)
export PATH="extlib/bin:local/bin:/opt/perl-5.16/bin:$PATH"
export PERL5OPT="-Mlib=lib,extlib/lib/perl5,local/lib/perl5"
export PLACK_ENV=production
exec "$@"

runcron.yml

実行ディレクトリに配置して、Reporter情報を登録する。

timestamp: 1
reporter: None
error_reporter:
    - +MyApp::Reporter::Alert
common_reporter:
    - Fluentd
    - File
    -   file: log/cron%Y-%m-%d.log
    - +MyApp::Reporter::IRC

レポーターの書き方

Perlだけど非常に簡単。newメソッドと$runcronオブジェクトを受け取るrunメソッドの2つが定義されていればOK。

package App::RunCron::Reporter::Stdout;
use strict;
use warnings;

use parent 'App::RunCron::Reporter';
sub run {
    my ($self, $runner) = @_;
    print STDOUT $runner->report;
}

自分でラッパーコマンドを書く

% cat my-runcron
#!perl
use strict;
use warnings;
use App::RunCron;
my $runner = App::RunCron->new(
    timestamp => 1,
    command   => [@ARGV],
    logfile   => 'tmp/log%Y-%m-%d.log',
    reporter  => 'Stdout',
    error_reporter => [
        'Stdout',
        'File', {
            file => 'tmp/error%Y-%m-%d.log'
        },
    ],
);
$runner->run;

GitDDL::Migrator

マイグレーションやスキーマのバージョン管理

GitDDL::Migrator

SQL::Translator (SQLFairy)

SQLFairy

SQL::Translator::Diff

GitDDLの考え方

バージョニングテーブル

CREATE TABLE git_ddl_version (
    `version`     VARCHAR(40) NOT NULL,        -- commit hash
    `upgraded_at` VARCHAR(20) NOT NULL UNIQUE,
    `sql_text`    TEXT
);

何が便利か?

a <-> b <-> c ブランチを行き来しながら適切に差分SQLを当て込むことができる。

gitddl

FAQ

GitDDL::Migrator

できないこと

Partitioningはdailyバッチで切ってるので、その部分まではバージョン管理してない

ref. MySQL::Partition

DBIx::Schema::DSL

CREATE文をDSLで書く。

create_table user => columns {
    integer  'id', pk, auto_increment;
    varchar  'name';
    varchar  'uid', unique;
    datetime 'updated_at';
    datetime 'created_at';
    add_index user_created_at_idx => [qw/created_at/];
};

喜びの声

SQL::Translator::Diffが困ったDiffを出すことがあってAlter出来なくて夜もリアルで眠れない時がありましたが DBIx::Schema::DSLでスキーマ定義すればそんな変なdiffに悩まされることがなくなりました! (神奈川県 無職 34歳 男性)

マイグレーション機構とのつきあいかた

GitMasterData

GitMastetData

https://www.github.com/Songmu/p5-GitMasterData

マスタデータ管理

マスターデータディレクトリ

% tree data/master_data
data/master_data
├── item.csv
├── sword.csv
├── monster.csv
├── stage.csv
...

実際の動き

FAQ

宣伝