Quantcast
Channel: くりにっき
Viewing all 446 articles
Browse latest View live

Jenkinsに入れているプラグインまとめ(Rails中心)

$
0
0

ふと思いついたので会社のJenkinsで使ってるプラグインをまとめてみます。 RailsでJenkins運用してる人の参考になれば幸いです。(入れてるけどあまり使ってないのは端折ってます)

他に便利なプラグインあったらコメントやブコメで教えてくださいw

Ruby/Rails系プラグイン

PMD Plugin - Jenkins - Jenkins Wiki

CPD(Copy PasteDetector=コピペ検出)のためのプラグイン。

入門Jenkinsで紹介されていたので入れたはず。

入門Jenkins―実践「継続的インテグレーション」

入門Jenkins―実践「継続的インテグレーション」

参考:Javaだけじゃない入門jenkins

アプリ作る度にRailsなのにjar一式コミットする悲しみがあるので他の静的解析使いたいw

rbenv plugin - Jenkins - Jenkins Wiki

最初の頃はRVM Plugin - Jenkins - Jenkins Wikiを使ってましたが、昨今の流行でrbenvに移行しました。

Ruby/Rails以外でも使えるプラグイン

AnsiColor Plugin - Jenkins - Jenkins Wiki

コンソールに色がつきます

f:id:sue445:20140108220502p:plain

Categorized Jobs View - Jenkins - Jenkins Wiki

1つのアプリ(ライブラリ)を複数のrubyのバージョンでビルドしてるため

  • my_gem
    • my_gem_1.9.3
    • my_gem_2.0.0
    • my_gem_2.1.0

みたいに階層表示できて便利

Ci Skip Plugin - Jenkins - Jenkins Wiki

出来て1ヶ月経ってない出来たてほやほやのプラグイン

Travis CIのようにコミットコメントに [ci skip]を含めるとビルドをスキップしてくれます。 コメントだけの修正でビルド走らせたくないので使ってます。

Latest Release Date Dec 24, 2013

あっ(察し)

Embeddable Build Status Plugin - Jenkins - Jenkins Wiki

READMEに貼る定番のバッジ

Green Balls - Jenkins - Jenkins Wiki

テストが通ってる時は青よりも緑の方が個人的には嬉しい

f:id:sue445:20140108223105p:plain

f:id:sue445:20140108222008p:plain

JobConfigHistory Plugin - Jenkins - Jenkins Wiki

f:id:sue445:20140108222449p:plain

設定が変更された時に右の方にアイコンがついてdiffが見れます

Throttle Concurrent Builds Plugin - Jenkins - Jenkins Wiki

同じアプリを複数のバージョンでビルドしてる場合、

  1. masterにpushされた時にJenkinsに通知
  2. app_1.9.3 と app_2.0.0 で同時にビルドが走る
  3. 両方のテストでinsert→after(:each)でデータクリアしてるとロックがかかってテストが落ちるw

ということがあるため、DB単位で排他制御かけています。

f:id:sue445:20140108223402p:plain

下の方がモザイクかかってますが、

  • app1_db
  • app2_db
  • app3_db

みたいなチェックボックスがあって1つだけにチェックが入っています

Plot Plugin - Jenkins - Jenkins Wiki

Jenkinsにスローテストのグラフを表示する - くりにっき

これと組み合わせてrspecの実行時間をグラフ化しています

Timestamper - Jenkins - Jenkins Wiki

コンソールのログ単位でタイムスタンプがつけるプラグイン。 一時期ジョブが遅い時があってボトルネックを調べるために使っていました。

Emotional Jenkins Plugin - Jenkins - Jenkins Wiki

ビルドが失敗した時におっさんが怒り狂います

f:id:sue445:20140108224344p:plain

平常時

f:id:sue445:20140109104737p:plain

ビルドが不安定で悲しみにくれているおっさん

f:id:sue445:20140109104808p:plain

ビルドが失敗して怒り狂っているおっさん

f:id:sue445:20140109104852p:plain

Beer Plugin - Jenkins - Jenkins Wiki

f:id:sue445:20140108220649p:plain

疲れた時に眺めます

その他便利ツール

sue445/my_rails_template

rails newする時に使うオレオレテンプレート

Railsアプリをビルドするためのシェルスクリプトやspec_helper.rbを同梱

sue445/jenkins-backup-script

Jenkinsの設定ファイルやプラグインをtar.gzに固めるためのスクリプト。

このスクリプト自体もJenkinsに登録して夜中にジョブを定期実行し、別のスクリプトでバックアップサーバに転送しています

参考:jenkins-backup-scriptを作りました - くりにっき


apt-get install したredis-serverの設定ファイルが危なかった事案

$
0
0

事の発端

  1. capistrano taskのテストのためステージング環境のredisを再起動する
  2. redisに保存してた値が初期化される
  3. ファッ !?

redisはmemcacheと違い永続化してるため、再起動してもデータが消えることはないはず。。。

環境

$ cat /etc/debian_version
7.1

$ redis-server --version
Redis server version 2.4.14(00000000:0)

調べてみた

$ sudo head /var/log/redis/redis-server.log
[2564]05 Jan 06:25:14 * 1 changes in900 seconds. Saving...
[2564]05 Jan 06:25:21 * Background saving started by pid 13069[13069]05 Jan 06:25:21# Failed saving the DB: No such file or directory[2564]05 Jan 06:25:21# Background saving error[2564]05 Jan 06:25:21 * 1 changes in900 seconds. Saving...
[2564]05 Jan 06:25:21 * Background saving started by pid 13071[13071]05 Jan 06:25:21# Failed saving the DB: No such file or directory

$ sudo ls-l  /var/log/redis/redis-server.log
-rw-rw---- 1 redis redis 3768203561912:28 /var/log/redis/redis-server.log

こんなログが大量に出てた(;´Д`)

1/5 6:25頃に作業した記憶はないので、この時間にメモリが溢れてディスクに保存しようとした段階で初めてエラーになってた模様。

原因は/etc/redis/redis.confがおかしかったかららしい

# △
dir /var/lib/redis

# ◯
dir /var/lib/redis/

社内のインフラの人に詳しく調べてもらいましたが

  • CentOS release 5.9
  • redis-2.4.10-3

の組み合わせで dir /var/lib/redisでもちゃんと永続化できていたとのこと。他のミドルとかも関連してるんだろうか。。。

ちなみに本番環境はインフラチームが構築した時のrpmにconfigが入ってるため問題なし。*1

今回は開発環境ってことで全部自分で構築してましたが、まさかデフォルトの設定ファイルが原因だったとは思わなかった。しかもステージング環境は本番に比べたらそんなに動かさないので、バグが発覚するのに1ヶ月以上かかりました。

感想

本番環境じゃなくて本当によかった

*1:開発環境はDebianだけど本番はCentOS

Travis CIで暗号化したパラメータを2つ以上使う方法

$
0
0

テストコード中でTwitterAPIを使っているんだけど、それをそのままTravis CIでテストしようとするとgithubにconsumer keyやconsumer serrectをcommitする必要が出てくるため、Travis CIで使うために暗号化したパラメータを複数渡す方法を探していました。

忙しい人のための結論

暗号化したいパラメータを空白で区切りで渡せばok

travis encrypt VAR1=foo VAR2=baz

調べた

gem install travis

すればコマンドがインストールできる。

この辺のサイトを見ても暗号化したいパラメータが1つの場合しかなかったので実際に実験してみました

空白で区切る

$ travis encrypt VAR1=foo VAR2=baz
Please add the following to your .travis.yml file:

  secure: "h+1848Nsz5phbcdUMt8FpYNBHIWQu+6aLiCNyX/uGgcC/bx71K8AE+52x22+EiHDamk8yrVAajVwsPYv8nBKSEEj9IGkEmaOETXi+v5Bi1cHwghK7fbFAdpBLBhwIgoRcmSZel96q9s4njBSXbBYnlLxcwdTyzOpUZ1iwVNLzFk="

.travis.yml を作ってencryptで出力されたtokenを書く

script: echo "VAR1=$VAR1, VAR2=$VAR2"env:global: # travis encrypt VAR1=foo VAR2=bazsecure:"h+1848Nsz5phbcdUMt8FpYNBHIWQu+6aLiCNyX/uGgcC/bx71K8AE+52x22+EiHDamk8yrVAajVwsPYv8nBKSEEj9IGkEmaOETXi+v5Bi1cHwghK7fbFAdpBLBhwIgoRcmSZel96q9s4njBSXbBYnlLxcwdTyzOpUZ1iwVNLzFk="

travisでテストする

$ export VAR1=[secure]
$ export VAR2=[secure]
$ echo"VAR1=$VAR1, VAR2=$VAR2"VAR1=foo, VAR2=baz
The command "echo "VAR1=$VAR1, VAR2=$VAR2"" exited with 0.

https://travis-ci.org/sue445/dotfiles/builds/17421104

一発目で成功したw

セミコロンで区切る

念のため実験

travis encrypt VAR1=foo;VAR2=baz
Please add the following to your .travis.yml file:

  secure: "IKwvtmkcbjr/ShewETVAikVfjWlA0IkbkMLCH/8wzVMEcIZIysVpdgpnGOpp8dSPAJjZsPdJi5oJlOaHAIslrnphfL1yw0Fyy0dC3wZMb6cANdmawGx5U5JZZFHeI1m4uuwnE/yCgYoV1uwZxoaEgM4f6uej7kKPryiFLzy76Z4="

同様に .travis.yml に書き込む

script: echo "VAR1=$VAR1, VAR2=$VAR2"env:global: # travis encrypt VAR1=foo;VAR2=bazsecure:"IKwvtmkcbjr/ShewETVAikVfjWlA0IkbkMLCH/8wzVMEcIZIysVpdgpnGOpp8dSPAJjZsPdJi5oJlOaHAIslrnphfL1yw0Fyy0dC3wZMb6cANdmawGx5U5JZZFHeI1m4uuwnE/yCgYoV1uwZxoaEgM4f6uej7kKPryiFLzy76Z4="

travisでテストする

$ export VAR1=[secure]
$ echo"VAR1=$VAR1, VAR2=$VAR2"VAR1=foo, VAR2=
The command "echo "VAR1=$VAR1, VAR2=$VAR2"" exited with 0.

https://travis-ci.org/sue445/dotfiles/builds/17421816

2つ目の変数がとれてないのでダメ

Gitlab用の waffle.io クローン「Gitpeach」を作りました

$
0
0

ドリコムPixivさんとで「Gitlab魔改造カンファレンス」というのを開催しました。

自分は「Gitlab APIで周辺環境を魔改造する」と称してGitpeachを作ったので紹介します。

リポジトリ

https://github.com/sue445/gitpeach

スクリーンショット

f:id:sue445:20140206234313g:plain

主な機能

  • Gitlabのissueをカンバン風に管理
    • issueをDrag & Drop
    • Gitlab版のwaffle.ioクローン
  • デフォルトだと下記のようにGitlabのラベル連携
    • Backlog : issueが追加された初期状態
    • Ready : readyのラベルを設定
    • In Progress : in progressのラベルを設定
    • Done : issueをclose
  • TODO, Doing, Doneみたいにすることも可能

インストール方法

  • cloneしてREADMEを参考にサーバにインストールしてください
  • Railsを使ってるのでGitlabを入れているのであれば余裕なはず

waffle.ioにない機能

  • Websockct使ってるので他の人の更新がリアルタイムに反映される
  • Milestoneを表示
    • f:id:sue445:20140206234558p:plain

必要環境

  • Ruby 2.0+, Rails 4.0.2
    • 最初padrinoで作ってたけど、GitlabがRailsなので合わせた方が導入してもらいやすいと思って作りなおしたw
  • MySQL or PostgreSQL
    • Gitlabもこの2つサポートなのでこっちも両方サポート
  • Gitlab API 5.3.0+
    • but 6.1.0 is not supported
  • Pusher
    • 無料で使えるWebSocketサービス
    • 無料だと同時100コネクションまでだけど社内用なら問題ない希ガス

なぜPeachか?

*1:ギットラボ説もあるが気にしない

デブサミ2014【13-E-1】OSSコミッタ大集合 に登壇させてもらいました #devsumi

$
0
0

事の発端

これが

こうして

こうなった

当日の様子

#devsumi スピーカーパスもらった

スマイルプリキュア

自分のポジションペーパーの概要

感想

  • 知り合いが何人もデブサミに登壇してるのを見て「やっぱあの人達すごいなー」とか毎回思ってたのですが、その中に自分も含まれたと思うとなんか感慨深いです
  • 最初は本当気軽にメンション投げただけなのに、いつの間にか有名OSSのコミッタやコントリビュータが続々参戦してきて*1「本当に自分なんかが登壇していいのだろうか」と前日まで思い悩んでました
  • 貴重な機会を与えてくれた @さんありがとうございます!

*1:セッションページには登壇者は直前まで公開されなかったけど、FBのグループでどんな人が参加するのかは知ってた

Google Calendarの祝日を取得するgemを作った

$
0
0

ありそうでなかったようなので勢い余ってgemを作りました*1

仕様

Googleが公開してる祝日のカレンダーをrubyでいい感じに取得できるようにしてます

ググっても公式のドキュメントが見当たらない。。。

使い方 (rubyから)

require"google_holiday_calendar"

usa_calendar = GoogleHolidayCalendar::Calendar.new(country: "usa", lang: "en")

usa_calendar.holidays(start_date: "2014-01-01", end_date: "2014-03-01", limit: 5)
# => {Wed, 01 Jan 2014=>"New Year's Day", Mon, 20 Jan 2014=>"Martin Luther King Day", Fri, 14 Feb 2014=>"Valentine's Day", Mon, 17 Feb 2014=>"Presidents' Day (Washington's Birthday)"}

japan_calendar = GoogleHolidayCalendar::Calendar.new(country: "japanese", lang: "ja")

japan_calendar.holidays(start_date: "2014-01-01", end_date: "2014-03-01", limit: 5)
# => {Wed, 01 Jan 2014=>"元日", Thu, 02 Jan 2014=>"銀行休業日", Fri, 03 Jan 2014=>"銀行休業日", Mon, 13 Jan 2014=>"成人の日", Tue, 11 Feb 2014=>"建国記念の日"}
  • start_date と end_date がない場合は現在日時から1ヶ月間を取得
  • 日付は Date型かYYYY-MM-DD形式の文字列
  • 日付でソートされたHashが返ってきます

使い方 (bashから)

gem install した後に google_holiday_calendar してください。

# get holidays (today - 1 month after)
$ date +"%Y-%m-%d"2014-02-24

$ google_holiday_calendar
2014-03-09: Daylight Saving Time starts
# get holidays (2014/01/01 - 2014/07/01)
$ google_holiday_calendar --start-date=2014-01-01--end-date=2014-07-012014-01-01: New Year's Day2014-01-20: Martin Luther King Day2014-02-14: Valentine's Day
2014-02-17: Presidents' Day (Washington's Birthday)2014-03-09: Daylight Saving Time starts
2014-04-13: Thomas Jefferson's Birthday2014-04-20: Easter Sunday2014-05-11: Mothers' Day
2014-05-26: Memorial Day
2014-06-15: Fathers' Day
# get holidays (with limit)
$ google_holiday_calendar --start-date=2014-01-01--end-date=2014-07-01--limit=32014-02-14: Valentine's Day2014-02-17: Presidents' Day (Washington's Birthday)2014-04-13: Thomas Jefferson's Birthday
# get holidays (specify country and language)
$ google_holiday_calendar --start-date=2014-01-01--end-date=2014-07-01--country=japanese--lang=ja2014-01-01: 元日
2014-01-02: 銀行休業日
2014-01-03: 銀行休業日
2014-01-13: 成人の日
2014-02-11: 建国記念の日
2014-03-21: 春分の日
2014-04-29: 昭和の日
2014-05-03: 憲法記念日
2014-05-04: みどりの日
2014-05-06: みどりの日 振替休日

*1:具体的には所要時間4時間ほど

pebbles-tokyu_ruby_kaigi というGemを作った #tqrk #tqrk07 #kyon_kao_wedding

$
0
0

事の発端

  1. @さんから「「kyon_mm kaori_t_spica 結婚祝いLT大会」をドリコムさんで開催したい」とのことで打診を受ける *1
  2. 会場の空きを確認して日程調整
  3. 日程が3/29に決まったので社内ワークフロー申請
  4. イベントサイトオープン kyon_mm * kaori_t_spica 結婚祝いLT大会 in Tokyo #kyon_kao_wedding

まさかのダブルブッキング

重要な事なのでもう一度

考えた

  1. TokyuRubyKaigiの定義は29日(肉の日)の休日(土日祝日)。
  2. ここまで定義が決まってるのであればgem化できるのでは?

pebbles-tokyu_ruby_kaigi を作った

使い方

$ gem install pebbles-tokyu_ruby_kaigi

$ tokyu_ruby_kaigi next
2014/03/29(Sat)

$ tokyu_ruby_kaigi take
2014/03/29(Sat)2014/04/29(Tue)2014/06/29(Sun)2014/11/29(Sat)2015/03/29(Sun)2015/04/29(Wed)2015/08/29(Sat)2015/11/29(Sun)2016/04/29(Fri)2016/05/29(Sun)

余談

先日作った google_holiday_calendarpebbles-tokyu_ruby_kaigiの副産物です。(祝日判定のためにGoogle Calendar使いたかったがgemがなかったので作った)

追伸

kyon_mm * kaori_t_spica 結婚祝いLT大会 in Tokyoの会場係のため TokyuRuby会議07は参加できないので、誰か代わりにこのgemの紹介LTしといてください (・ω<)

*1:最初から何かおかしかった

Rails 4.0.4でActionController::Parametersの挙動が微妙に変わってた

$
0
0

GitpeachRails 4.0.4に上げようとした時にテストがこけて2時間くらいハマってたのでメモ

{
  id: "xxxx/yyyy",
  labels: [
    {name: "Backlog"    , gitlab_label: nil          , is_backlog_issue: true , is_close_issue: false, id: 1},
    {name: "Ready"      , gitlab_label: "ready"      , is_backlog_issue: false, is_close_issue: false, id: 2},
    {name: "In Progress", gitlab_label: "in progress", is_backlog_issue: false, is_close_issue: false, id: 3},
    {name: "Done"       , gitlab_label: nil          , is_backlog_issue: false, is_close_issue: true , id: 4},
  ]
}

上記のようなparamsがあった時に、Arrayの中のHashに対しても ActionController::Parameters#permitが必須になった模様。(4.0.3まではチェックされなかった)

関連するリリースノート

https://github.com/rails/rails/blob/v4.0.4/actionpack/CHANGELOG.md

Converts hashes in arrays of unfiltered params to unpermitted params.

実際の修正

params.permit(labels: [:name, :gitlab_label, :is_backlog_issue, :is_close_issue, :disp_order, :id])

https://github.com/sue445/gitpeach/pull/6/files

まとめ

  • リリースノート読め
  • こまめなアップデート大事
  • テスト大事

kyon_mm * kaori_t_spica 結婚祝いLT大会 in Tokyoを開催してました #kyon_kao_wedding

$
0
0

「結婚祝いLT大会」というよく分からないイベントを弊社で開催してしまいました。

イベントはいつも突然に

f:id:sue445:20140330232102p:plain

突然のDM

*1

自分の役割(表)

  • LT大会実行委員
    • 会場係

自分の役割(裏)

  • id:megascusさんが企画した、@さん、@さんへのサプライズ企画の実行委員
  • 開場が13時なので本来の会場設営は12時からだが、サプライズプレゼントのケーキと花の受け取りのため9時に出社してた
    • 搬入現場をkyon_mmさんに見つかるとマズイため id:indareさん達にランチで足止めしてもらったw

反省点

  • LT大会のスタッフ間のやりとりとサプライズ企画のスタッフのやりとりが両方Facebookのチャットだったが、メンバーがドッキリを仕掛けるkyon_mmさん以外はほとんど同じメンバーだったため、誰か1人チャットを誤爆すると全てが破綻するという紙一重の危険があった
    • これ系はSkypeやLINEなどの別のチャットを使うべきだった
  • タイムキーパー重要
    • 残り30分時点で進捗17/33。最終的にLT出来ない人が10人近く出てきた
    • 進捗ダメでしたッ!

朗報

最後に

kyon_mmさん、kaori_t_spicaさん、末永くお幸せに!

*1:DMのキャプチャ利用はkyon_mmさんの許可貰ってます

GithubやGitlabで開発する時に入れるべきChrome Extension

$
0
0

タイトルは若干釣り気味です

GithubとGitlab両方使える

MISAWA::MD

https://chrome.google.com/webstore/detail/misawamd/legplkhbgdelfceignhcchogkmoflagl

ミサワ画像をMarkdown形式でコピペできます

f:id:sue445:20140406030351p:plain

Emoty

https://chrome.google.com/webstore/detail/emoty/kgljgnbhcigffgoifhjbbifhbdkapmgm

Githubなどで使える絵文字をポップアップで選んでクリップボードにコピペできます

f:id:sue445:20140406030246p:plain

LTTM

https://chrome.google.com/webstore/detail/lttm/jdidcgkdggndpodjbipodfefnpgjooeh

textareaで手軽にミサワや LGTM.in/gの補完ができるようになります

f:id:sue445:20140406223239g:plain

Github専用

github merge caution

https://chrome.google.com/webstore/detail/github-merge-caution/nimelepbpejjlbmoobocpfnjhihnpked

titieに WIP が含まれているとAcceptボタンが押せなくなります。

f:id:sue445:20140406030037p:plain

Gitlab専用

Chrome Gitlab Notifier

https://chrome.google.com/webstore/detail/chrome-gitlab-notifier/eageapgbnjicdjjihgclpclilenjbobi

拙作のChrome拡張。定期的にGitlabをポーリングして新着があったら通知します

詳しいことは過去エントリ参照

Chrome Gitlab Notifierを作りました - くりにっき

【番外編】Gitpeach

chrome extensionじゃないですがついでなので宣伝。

https://github.com/sue445/gitpeach

Gitlabのissueをカンバン風に操作できます

f:id:sue445:20140206234313g:plain

詳しいこと Gitlab用の waffle.io クローン「Gitpeach」を作りました - くりにっき

本題

今日で32歳になったので何かください(・ω<) http://www.amazon.co.jp/registry/wishlist/3HH1FL88AQAG8/

31歳の誕生日

31歳最後の日

31歳最初と最後の日はアイスで決まりッ!

Instagram

プリキュアで始まりプリキュアで終わったいい1年でした。

Faker::Precureというgemを作りました

$
0
0

業務で堂々と rubicureを使いたくなったのでプリキュアでテストデータを作るためのgemを作りました。所要時間2時間くらい

fakerにインスパイアされてます

使い方

各メソッドを呼ぶ度にランダムで文字列が返ります

require"faker/precure"Faker::Precure.human_name
#=> "黄瀬やよい"Faker::Precure.precure_name
#=> "キュアアクア"Faker::Precure.title
#=> "Yes! プリキュア5"Faker::Precure.transform_message
#=> "レッツプレイ!プリキュアモジュレーション!!\n爪弾くは女神の調べ! キュアミューズ!\n届け4人の組曲!スイートプリキュア!"Faker::Precure.user_name
#=> "cure_mint"

factory_girlで使いたい場合にはこんな感じ

FactoryGirl.define do
  factory :userdo
    name { Faker::Precure.human_name }
  endend

おまけ

ふんわりキュアフレンズ キュアハニーが届いて本棚がこんな感じになってました

キュア本棚

キュアフォーチュンさんどこに置こう。。。

#ponponpain をlog4jのレベルで例えてみる

$
0
0

Twitter界隈だと突然の腹痛のことをポンポンペイン(a.k.a ポンペ、 #ponponpain)と表現することが多いですが、

嫁の横でうんこ漏らした。 - コリログ

を読んで

と思ったので、自分なりの使い分けをまとめてみました

まとめ

下に行くほど危険度・緊急度が高いです

  • TRACE : (使ったことない)
  • DEBUG : 全然大丈夫だけど長期戦を控えていると不安なので出せるなら出したい
  • INFO : 緊急度は高くないけどトイレがあれば入りたい
  • WARN : あと数分以内にトイレに駆け込まないとヤバイ
  • ERROR : 若干出たがかろうじて踏みとどまった
  • FATAL : 社会的死

参考

Level (Apache Log4j API 2.0-rc1 API)

Jenkinsで使うシェルスクリプトは-xeつけた方がよかった

$
0
0

忙しい人のためのまとめ

f:id:sue445:20140523142631p:plain

で指定するシェルスクリプトには

#!/bin/bash -xe

#!/bin/sh -xe

つけるべき

経緯

Jenkins周りで調べることがあってたまたま下記のエントリを発見

Jenkinsのシェルの実行について - Qiita

シェルの途中でこけても処理が続行されるため

run(){command=$1echo"$command"eval$command# if error code returned, exit this script with error codeRET=$?if [$RET-ne0];thenexit$RETfi}

のようなラッパ経由でコマンド実行してたのですがそれが不要だったという俺的衝撃事実!!! *1

検証

test1.sh(-xe つけてないスクリプト

#!/bin/bashls unknown_path

echo"finish"
$ ./test1.sh
ls: unknown_path: No such file or directory
finish

$ echo$?0

途中でエラー起こっても処理が続行して最後の echoが成功してるのでステータスコード0が返却

test2.sh(-xeつけたスクリプト

#!/bin/bash -xels unknown_path

echo"finish"
$ ./test2.sh
+ ls unknown_path
ls: unknown_path: No such file or directory

$ echo$?1

エラーが起きたらそこで中断されてステータスコードも非0が返却

JenkinsとGroovyで低レベルなトラブルシューティングをする

$
0
0

昨日会社でJenkins立てた時に .ssh/config が読めなくてハマってました。

読めなかった原因というのはJenkinsを動かしてるtomcat7ユーザのホームディレクトリ*1とJenkinsが見ているホームディレクトリ*2が食い違ってたためなのですが、そこに至るまでの原因調査で非常に低レベルなトラブルシューティングをしてたので備忘録として残しておきます。

低レベルなトラブルシューティングとは?

ここでは「Jenkinsがシェルコマンドを叩いた時にどう実行できるか」を調べることを低レベルなトラブルシューティングとしてます。

Jenkinsをインストールしてるサーバにsshで入れれば

sudo -u tomcat7 〜

でやるのが模範解答なのですが、今回は権限の関係でtomcat7ユーザになれなかったためJenkinsにシェルコマンドを実行してもらうことにしました

どうやって?

「Jenkinsの管理 ->スクリプトコンソール」でGroovyが動かせるので、Groovy経由でシェルコマンドを実行できればよさそう

f:id:sue445:20140531024909p:plain

Groovyでシェルコマンドを実行する方法

こんな感じ

println"whoami".execute().text

結果が下に表示される

f:id:sue445:20140531025116p:plain

ただ毎回 execute().textってtypeするのは大変なのでこういうラッパを作ると多少楽になりそう

void system(String command){
    println command.execute().text
}

f:id:sue445:20140531025441p:plain

*1:/usr/share/tomcat7

*2:/var/lib/tomcat7 = CATALINA_BASE

Jenkinsのジョブごとにdatabase.ymlを動的生成する

$
0
0

database.ymlって書いてますがファイルならなんでもいけます

前提

自分のビルドスクリプトだとこういう風にすることが多いです

# 最初にJenkins用のDB接続情報が書かれたdatabase.ymlを作る
cp config/database.yml.jenkins config/database.yml

# あとは普通にテストRAILS_ENV=test bundle exec rake db:create
RAILS_ENV=test bundle exec rake db:migrate:reset
bundle exec rspec

しかしこれだと同じプロジェクトを別々のジョブ*1にした場合にも同じDBを使うためロックがかかってテストが落ちることになり、Throttle Concurrent Builds Plugin - Jenkins - Jenkins Wikiで同一DBは1つずつしかテストしないような排他制御をしていました。

ジョブが増えてくるとDBがボトルネックになってビルド全体が遅くなるため、スクリプト

if [$JOB_NAME="app_develop"];then
  cp config/database.yml.jenkins_develop config/database.yml
else
  cp config/database.yml.jenkins_master config/database.yml
fi

cp config/database.yml.${JOB_NAME} config/database.yml

のようにすることも考えたのですが、ジョブが増えた時に似たようなファイルが大量にできてしまうので汎用性がありません。

差し込み変数でファイルを作れるようにgemやJenkinsのプラグイン作るしかないと思ってたのですが、今日画期的な方法*2を思いついたので実践してみました。

【本題】ジョブごとに手軽にファイルを動的生成する

こんなファイルを作っておいて

database.yml.jenkins

test:
  adapter: mysql2
  encoding: utf8
  database: app_test_JOB_NAME
  pool: 20
  username: user
  password: pass
  socket: /var/run/mysqld/mysqld.sock

スクリプト内ではsedで置換するw

cat config/database.yml.jenkins | sed-e"s/JOB_NAME/${JOB_NAME}/"> config/database.yml

sedし忘れてもエラーにならないように CREATE DATABASEできる名前にしてます

ビルド実行時には環境変数が代入されるため実際には

cat config/database.yml.jenkins | sed-e"s/JOB_NAME/app_develop/"> config/database.yml

のようなコマンドが実行されて

test:
  adapter: mysql2
  encoding: utf8
  database: app_test_app_develop
  pool: 20
  username: user
  password: pass
  socket: /var/run/mysqld/mysqld.sock

のようなdatabase.ymlが作られるため、ジョブの増減に柔軟に対応できるようになりました。

まとめ

Simple is best.

gemやpluginを作らずともシェルの基本コマンドだけで簡単に実現できるならそれにこしたことはないと思った次第。

参考リンク

*1:例えばmasterとdevelopでジョブを分けるとか

*2:俺調べ


RSpecで一時ディレクトリを作るサンプル

$
0
0

ファイルを作るメソッドのテストをしたくてrspecで一時ディレクトリを使いたかったのですが、よいサンプルがなくて自分で作りました*1

JUnitTemporaryFolderに相当するものがほしかった)

  • aroundはテストの前後に共通の処理を挟みたい時に使うhook
  • Dir.mktmpdirは一時ディレクトリを作るメソッド
    • ブロックを抜ければ一時ディレクトリは勝手に削除されるが、 Dir.mktmpdirのブロック内で example.runすることでテスト内でその一時ディレクトリを使うことができる
    • 作った一時ディレクトリの名前は temp_dirで取得
  • shared_contextでモジュールしておくことで、describeinclude_contextして再利用できる
    • ところで shared_contextの名前をシンボルにするのって少数派?
  • gem化するほどのボリュームもないのでgistで公開
  • rspec 3.0.0で確認済み
  • ググっても全然見つからなったけどたぶんどっかでいい感じにgem化されてるんだろうなー

*1:ググっても古い記事しか見つからなかった

rspec-temp_dir をリリースしました

$
0
0

RSpecで一時ディレクトリを作るサンプル - くりにっき

gem化するほどのボリュームもないのでgistで公開

と書いたものの、 rake_shared_contextを見て shared_context だけのgemもありかなぁと思ってgem化してリリースしました。

使い方

specファイルで include_context "uses temp dir"を書けばテンポラリディレクトリが作られ、temp_dirで作ったテンポラリディレクトリの名前を取得できます。

テスト実行の度にテンポラリディレクトリは作り直されるので、テストの前後でファイル消し忘れることもないです。

サンプル

require'rspec/temp_dir'

describe "uses temp dir"do
  include_context "uses temp dir"

  it "should create temp_dir"do
    expect(Pathname(temp_dir)).to be_exist
  end

  it "can create file in temp_dir"do
    temp_file = "#{temp_dir}/temp.txt"File.open(temp_file, "w") do |f|
      f.write("foo")
    end

    expect(File.read(temp_file)).to eq "foo"endend

実装

たったこれだけ(ノ∀`)

https://github.com/sue445/rspec-temp_dir/blob/master/lib/rspec/temp_dir/uses_temp_dir.rb

require"tmpdir"

shared_context "uses temp dir"do
  around do |example|
    Dir.mktmpdir("rspec-") do |dir|
      @temp_dir = dir
      example.run
    endendattr_reader:temp_dirend

aroundDir.mktmpdirをいい感じに組み合わせることが出来たと思います(熱い自画自賛)

Padrinoでar:migrate時に自動的にannotateする

$
0
0

annotate_modelsの紹介

annotate_modelsを使うとmodelにスキーマ情報が付加されて見やすくなるので自分の観測範囲だとよく使われています。

# == Schema Information## Table name: users##  id             :integer          not null, primary key#  gitlab_user_id :integer#  username       :string(255)#  email          :string(255)#  private_token  :string(255)#  created_at     :datetime#  updated_at     :datetime## Indexes##  index_users_on_gitlab_user_id  (gitlab_user_id) UNIQUE#

Railsだと rake db:migraterake db:rollback時に自動的にannotateを実行するコードがgithubwikiで紹介されています。

https://github.com/ctran/annotate_models/wiki

最近Padrinoでアプリ作り始めたのですが、Railsみたいにmigrateで自動的にannotateする方法を作ってみました。

Padrinoでar:migrate時に自動的にannotateする方法

lib/tasks/annotate.rake

lib/tasks/ にrakeファイルを置いておくと自動的にロードされるのでこんな感じでrakeファイルを置く

desc "annotate models"
task :annotate => :environmentdorequire'annotate/annotate_models'AnnotateModels.do_annotations(
      model_dir:         "#{__dir__}/../../models/",
      exclude_fixtures:  true,
      exclude_factories: true,
      exclude_tests:     true,
      show_indexes:      true,
      format_markdown:   false
  )
end

Rakefile

PadrinoTasks.initの直後に下記を書く

require"padrino-core"ifPadrino.env == :developmentRake::Task['ar:migrate'].enhance doRake::Task['annotate'].invoke
  endRake::Task['ar:rollback'].enhance doRake::Task['annotate'].invoke
  endend

Padrinoの初期化順の関係からか、 lib/tasks/annotate.rake の中にフックする処理が書けませんでした。。。 他にうまいやり方ありますかねぇ?>有識者

gists

https://gist.github.com/sue445/2c6d0d7ddce9fdb64632

fluentd初心者がgitlabとChatWorkを連携してみた

$
0
0

こんにちは、fluentd歴2週間です(挨拶)

会社でGitlabとChatWorkを使ってるので連携してみました

ゴール

Gitlabのリポジトリが更新されたらChatWorkに通知を流す

fluentdに至るまでに考えた構成

gitlabのwebhookを受けてChatWorkに通知するアプリを作る

f:id:sue445:20140629030419p:plain

問題点

  • GitlabとChatWorkが密結合
    • 汎用性がない
  • オレオレアプリ増やしたくない

gitlabのwebhookをJenkinsで受けてChatWorkに通知

f:id:sue445:20140629030857p:plain

webappの部分がJenkinsになっただけ

問題点

  • ChatWorkに通知するだけでジョブ追加するのは大げさ
  • 通知対象のリポジトリ増やす度にジョブコピペつらい

fluentdを使ってみることにした

f:id:sue445:20140629031326p:plain

  • fluentdは使ったことなかったけどどんなものかはなんとなく知ってた
  • webhookを受けることは出来るけどChatWorkに通知するプラグインがなかったのでそれだけは作る必要あった
    • fluentdのプラグインであればGitlabのwebhook以外でも使えるので再利用性高そう
  • (一応)全社のインフラを見てる立場なので素振りがてら使ってみたかった

インストール

OpenStackのCPU1コア、メモリ1GB、Debian Wheezyのインスタンスを使用。入れたミドルはnginxとgitくらい

http://docs.fluentd.org/ja/categories/installationを参考にインストール

curl -X POST -d'json={"json":"message"}' http://localhost:8888/debug.test

でコンソールにログが出ねーってハマってましたが、stdoutプラグインってcurlした時のコンソールじゃなくてtd-agent.logに出るんですね(恥

fluent-plugin-out_chatwork を作った

使い方はこんな感じ

<match **>
  type         chatwork
  api_token    YOUR_SECRET_TOKEN
  room_id      0000000000
  message      Hello ChatWork!\n<%= record["value"] %>
</match>

webhookを受けるためのnginx設定

td-agentの in_http だけだとwebhook受けられなかったのでnginx経由させた

server {
  location / {
    proxy_pass http://127.0.0.1:8888;
    break;
  }
}

80番ポートで受けて8888ポート(fluentd)に流すだけのシンプルな設定

実際に設定してみた

もうちょっときれいに出来そうだけどだいたいこんな感じ

設定ファイルの書き方も id:bash0C7さんのGitLab魔改造カンファレンスの資料を参考にさせて貰いました

Gitlabに登録するwebhook

f:id:sue445:20140629034336p:plain

  • gitlab*1のwebhookのレスポンスにはリポジトリのURLが含まれないのでURL(tag)に含めて引き回す必要がある
    • /gitlab/namespace/repository みたいなpathにするとin_httpプラグインがタグを gitlab.namespace.repositoryにする
    • tagの内容を動的に取得してごにょごにょする方法を探してたら id:tagomorisさんの fluent-plugin-forestを見つけた(ノ∀`)

ChatWorkへの通知

f:id:sue445:20140629034206p:plain

fluentd所感

  • よかった
    • 構成がシンプル
    • インストールが思ったよりも楽
    • 日本人が作ってるので日本語のドキュメントが充実してる
  • つらみ
    • 設定ファイルが横に長くなる

追記

Gitlab Webhookのつらみ

v6.7時点なので他バージョンでは事情違うかも

  • Issue Eventsの挙動がおかしい
    • Created(issueの新規作成)だとWebhook 1回だけ叩かれるのに、ClosedやReopenedだと2回叩かれる
  • Webhookのレスポンスの中身がいろいろ足りない

ChatWork APIのつらみ

  • 実装されてない機能が多すぎる
    • 2014年2月で更新止まってる

*1:v6.7時点

ドリコムに入社して丸2年経ちました

$
0
0

個人の日記レベルのことしか書いてません。

1年前のエントリはこちらを参照

ドリコムに入社して1年経ちました - くりにっき

お仕事

~2014年3月

2014年4月~

  • インフラも見ることになった
  • けど今のところは社内ライブラリや社内ツールのメンテがメイン

お仕事以外

OSS(gem)

2013年度はrubygemsデビュー元年でした https://rubygems.org/profiles/sue445

rubicure

rm_xattr

google_holiday_calendar

pebbles-tokyu_ruby_kaigi

  • 一発ネタ
  • 29(肉)の日かつ祝休日を調べるgem

fluent-plugin-out_chatwork

faker-precure

rspec-temp_dir

雑感

  • 自分は人よりもRubyの経験とスキルが足りてないのは誰よりも自覚してるので、人一倍素振りした結果こんな感じになりました
  • ワタシルビーチョットダケデキルヨウニナッタカモシレナイ
  • どんなにいいものでもrubygems.orgやgithubに上げるだけだと誰も気づかないので、ブログや勉強会であざとく積極的に宣伝するの大事

OSS(gem以外)

chrome-gitlab-notifier

gitpeach

jenkins-backup-script

Contributing

nanapi/jenkins-chatwork-plugin

gitlabhq/gitlabhq

ワタシエイゴガンバッタ https://github.com/gitlabhq/gitlabhq/pull/6825

勉強会

プリキュアハッカソン(開催)

プリキュアハッカソンを開催していました #cure_hack - くりにっき

今年もやるよ!!!!!!!

プリキュアハッカソン 2 - connpass

TDD Boot Camp横浜 3rd(TA)

TAとしてお手伝いしてました TDD Boot Camp 横浜 3rd に参加してました #TDDBC - くりにっき

Agile Samurai Base Camp(TA)

TDDクラスタの縁でTAとしてお手伝いさせてもらいました

Agile Samurai Base CampでTDDのお手伝いをしていました #agilesamurai - くりにっき

デブサミ2014(登壇)

会社から会場まで徒歩0分って便利ですね( ´∀`)

デブサミ2014【13-E-1】OSSコミッタ大集合 に登壇させてもらいました #devsumi - くりにっき

kyon_mm * kaori_t_spica 結婚祝いLT大会 in Tokyo(共催)

今年一番謎な勉強会(?)

kyon_mm * kaori_t_spica 結婚祝いLT大会 in Tokyoを開催してました #kyon_kao_wedding - くりにっき

先日kyon_mmさんとkaori_t_spicaさんのお子さん(男の子)がお産まれになりました。おめでとうございます!!!!!!!!!

社内勉強会

作ったスライド見たら8回くらい開催とか発表してたらしい

クローズドな社外勉強会

ちょいちょいそういうのが開催されるので機会見つけて発表させてもらってました

ブログ業

同じチームの 外道父に影響受けて意識的にエントリ書くようにしてました。

去年1年間で54本(月4~5本ペース)なのでそこそこ書けた方な気がします。

書いたジャンル

  • 勉強会系(開催、手伝い、一般参加などの感想)
  • こんなgem作ったYO!っていうアピール
  • Advent Calendar
  • 仕事中の気付き

100はてブ超えしたのはこの辺

rubicureは仕込み含めて1ヶ月以上かかったのに、2~3時間くらいてサクッと書いたJenkinsプラグインまとめの方がはてブ多いのは解せぬw

自分のデスク

まとめ

  • アウトプット大事
  • 作るだけでなく宣伝やアピールするのもアウトプットの一環

抱負

フルスタックキュアエンジニア目指して精進したいと思います

*1:パズドラの魔法石みたいなやつ

Viewing all 446 articles
Browse latest View live