Hatena::ブログ(Diary)

sho-hの日記

2018-07-19

手製のRedmineプラグインのCIを複数バージョンRedmine経由でまわすようにした

| 22:33 | 手製のRedmineプラグインのCIを複数バージョンRedmine経由でまわすようにしたを含むブックマーク

プラグインが動かないからRedmineのバージョンを上げれない」という意見をよく見る。ではどうすべきかと思い、とりあえず自分が作ってるRedmineプラグインredmine_audit の .travis.yml 周辺を更新して複数のバージョンのRedmineRubyでまわすようにした。

以下のようにenvを設定する(= 9パターンテストできる)ようにした。

env:
  - RUBY_VER=2.6.0-preview2 REDMINE_VER=master
  - RUBY_VER=2.6.0-preview2 REDMINE_VER=3.4-stable
  - RUBY_VER=2.5 REDMINE_VER=master
  - RUBY_VER=2.5 REDMINE_VER=3.4-stable
  - RUBY_VER=2.4 REDMINE_VER=master
  - RUBY_VER=2.4 REDMINE_VER=3.4-stable
  - RUBY_VER=2.3 REDMINE_VER=master
  - RUBY_VER=2.3 REDMINE_VER=3.4-stable
  - RUBY_VER=2.3 REDMINE_VER=3.3-stable

Travisから以下のようにdocker build→docker runの流れでコミットしたブランチを上述の組み合わせでテストしている。

before_install:
  - docker build -t ${TRAVIS_REPO_SLUG}:${RUBY_VER} --build-arg RUBY_VER=${RUBY_VER} --file=Dockerfile.travis .
script:
  - docker run -e REDMINE_VER=${REDMINE_VER} -e TRAVIS_BRANCH=${TRAVIS_BRANCH} -e TRAVIS_REPO_SLUG=${TRAVIS_REPO_SLUG} ${TRAVIS_REPO_SLUG}:${RUBY_VER}

以下はその他の関連するファイル。Travisさんはほんと便利やで...

Dockerを使う事にした理由はRedmineからプラグインのテストを呼びたかったため。Redmine本体のコードに依存するテストはRedmineからrake redmine:plugins:testしてやる必要がある。(自分のプラグイン程度だと依存度が低いのでモックでもやれなくもないけど

実行スクリプトではプラグインマイグレーションは呼んでないので参考にする時はご注意を。(マイグレーション付きのプラグインは更にこれにDBの組み合わせが増える事になるのかな。

なお、本当は12パターンになる予定だった。Redmine 3.3系をRuby 2.4以上で回してないのは以下のチケットがあるため。SystemStackErrorになってしまうようだったが対応はされないようなので外した。新しいRedmine使ってくだされという事でいいと思うので自分でもパッチ投げたりはしない予定。

# 2018/07/22 更新: 少し移動や更新がやりやすくなるように修正。

2018-06-30

松江Ruby会議09でRedmineについて発表してきた

| 23:28 |  松江Ruby会議09でRedmineについて発表してきたを含むブックマーク

松江Ruby会議のスタッフとして準備をしつつRedmineについて発表もしてきた。

Redmineの更新を楽にしたくてredmine_auditというプラグインを作った話をしたんだけど、Redmineどうでもいい人向けの情報も入れようとしたのが無駄だったかもしれない。Redmineの事だけ話せばよかったかも。

ところで自分はスライドたくさん書いてしまう人なんだけど、今回は15分で29枚だった。絵とかが多めだったりしたので多いけど多すぎというほどでもなかった(時間ややたりなかったけど)。そんな事を思ってたら懇親会でも「橋本さん、大人になりましたね」と冗談を言われてちょっとおもしろかった。

2018-03-24

今日はMatsue.rb定例会だった

| 23:22 |  今日はMatsue.rb定例会だったを含むブックマーク

今日はMatsue.rb定例会だったので貯めてた作業を幾つかやっつけた。春が近づいてるのか人がたくさんだった。以下の作業をした(現時点ではまだいずれも取り込まれるかわかってない)。一方で今日はるりまの作業はお休みした。

最後のPRはちょっと気に入ってて、did_you_meanに手を入れて引数を間違えるArgumentError起こすと(わかる範囲で)正しいものを教えてくれるというもの。

require 'did_you_mean/experimental'

Dir.glob('*', 0, 1, 2)
# test.rb:n:in `glob': wrong number of arguments (given 4, expected 1..2) (ArgumentError)
# Did you mean?
#                  Dir.glob( pattern, [flags], [base: path] )
#                  Dir.glob( pattern, [flags], [base: path] ) { |filename| block }

Array.new(3, "foo", "bar")
# test.rb:n:in `initialize': wrong number of arguments (given 3, expected 0..2) (ArgumentError)
# Did you mean?
#                  Array.new(size=0, default=nil)
#                  Array.new(array)
#                  Array.new(size) {|index| block }

a = [1,2,3]
p a.slice(1, 2, 3)
# test.rb:n:in `slice': wrong number of arguments (given 3, expected 1..2) (ArgumentError)
# Did you mean?
#                  ary.slice(index)
#                  ary.slice(start, length)
#                  ary.slice(range)

実は前から欲しかったんだけど、どう実現しようかなと思ってたら @hanachin_さんのQiitaをみてひらめいたのでPRにしてみた。これはもしや沖縄Ruby会議効果でもあるのでは?などと思ったりもした。現時点だと少なくともCIに怒られてるのは直さないといけなさそうだけど...。

次回は4/21(土)の予定ですので松江近辺の人はよかったらどうぞ。

2018-02-28

奨学金を完済した

20:09 |  奨学金を完済したを含むブックマーク

以下のような感じで奨学金を完済した。

  • 2種を30万円、1種を2百忘れた万円借りた
  • 2種は月3000円ずつ、1種は月1万ちょっとずつ返済
  • 高校在学中に1種も申請したけど2種のみを借りれた
  • 大学進学後に1種を再申請して進学後半年くらいで切り替えた

途中から1種のみになり残額も減ってくると割といつでも返済出来る感漂う金額になった。だけど、車のローンなど利子があるものの方が毎月の金額も高く痛いので、どちらかというとそちらを繰り上げ返済して奨学金の方はのんびり返させてもらった。10年以上はかかった。ありがとう奨学金。名前だけは「学生ローン」とかに変えた方がいいと思うけど、助かりました。

2種で利子がうんたらって最近も見るけど、とりあえず、1種に借り換えれるチャンスを逃さないところから頑張ったらいいと思う2月末。

なお、今後浮くお金についてはiDeCoさんに吸わせる事にしたので出費はトントンです。

2017-12-10

Redmineプラグインをgem化して使いたい

| 12:06 | Redmineプラグインをgem化して使いたいを含むブックマーク

本記事はRedmine Advent Calendar 2017の12/10の記事です。昨日は@GEROMAXさんのプロジェクト管理ツールを導入させるためのあてつけがましいアプローチでした。

Redmineを利用する側として便利というお話ではなく、管理する側として便利ではないか?というお話です。近頃Redmineサーバで遊ぶんですが、プラグインインストール/更新を現状より楽にしたいと思う事があります。

まずRedmineプラグインインストール方法ですが、plugins以下にプラグインgit cloneなどで置きます。(以下を参照

プラグインがmigrationを要求する場合はコマンドも実行しないといけないようですがまだ実行した事はありません。

また、以下についてはわかっているのですが、実際にインストール/更新するのは手作業なんですよね。たぶん。

まだわかってない事(解決したい事)

以下の点が悩み所でした。

  1. プラグインのバージョン指定方法のうち、もっともお薦めのやつ
    • 割とgit clone masterしてるREADMEが多い(観測範囲のみ
      • masterは最新の開発コミットが入ってる可能性があってお好きでない
      • 更新のための事前検証環境とか作る時に日によって結果が変わりそう
    • というか実はgit clone(特に--depth=1や-bでバージョン指定)は自分でしたくない
      • とりあえずはリリース済みの最新安定バージョンを指定なしで使いたい
  2. プラグイン脆弱性が万が一あった場合にそれを検知する方法がよくわからない
    • 少なくともbundler-auditは今は使えない(gem化すると使える)

Redmineは何年もありがたく使わせてもらってるんですが、プラグインの更新は bundlerでgemを更新だけするとか、時にはバージョンを固定するとか段々したくなってきたのでそれが実現できないかと思っています。

gem化できるとインストールも更新もし易いですし、バージョンの固定も簡単です。あとruby-advisory-dbに載せれるようになるのでbundler-auditが使えるようになります。(インストール済みのプラグインの一覧を取る必要があると思うのでvulsでもプラグインは現状対応できないんじゃないかと思ってますけどどうなんでしょう。是非試してみたいところ)

個人的にはいい事しかないのですが、Redmineサイドもリソースは有限ですので、もし対応したくても事情があったり、ちょっと厳しかったりするかもしれません。チケットを作ってますので、共感してもらえそうなら、賛成的な反応してもらうとかあると採用してもらう確率が上がったりするかもしれません。ちょうどVote Count Listのお話もありましたし。

と、ここまでが本題です。よかったら+1くださいませ。明日は@yassan168さんです。お楽しみにー。


ここからはおまけです。ちょっとやってみたい人のみ読んでもらう程度でいいかもしれません。自作のプラグインでは強引にgem化してるのですが以降ではその方法などを(ひとさまのgem化方法を真似てもう一手間加えてるだけです)。これでも一旦は僕の希望を満足できますが、使うプラグインが多いと意味ありません。なので標準でgem化されると嬉しいですね。

ファイル構成

重要なのは以下の2つのファイルです。init.rb及び他のファイルは通常のプラグイン同様に作成します。

  • plugin root
    • init.rb
    • lib/<gem name>.rb
    • ...

README.mdには「Gemfile.localに書くかpluginsディレクトリgit cloneしたら使えます」と書いておいてください。git cloneはできればmasterじゃないと嬉しいけどバージョン更新のたびに更新するのがしんどければ...まぁ仕方ありませんよね。

仕組み

Gemfile.localにこれから作るgemが書いてあるので、lib/<gem name>.rbが必ず読まれます(Gemfileにrequire: <パス>を指定していなければ)。それを利用してinit.rbを読み込みます。最低限の作業としてはこれだけです。具体的にはredmine_github_hook gemのようにするといいでしょう。

ただし、これだけだと以下の3つの問題があります。

  1. 他の人がpluginsディレクトリを覗いた時に何もないので混乱する
  2. plugin_assetsを使う場合に自動でコピーされないのでいくつかのアクセスが404になる
  3. redmine:plugins:migrateタスクを呼び出してない

1. の方はpluginsディレクトリの下に道標のファイルを残す程度でいいかと思います。sidebar_hideプラグインにPull Requestを投げてみているのですが、このような形でどこに実体があるかを示しています。gemインストール先にsymlinkを貼る事も考えましたがGemfileに必ずrequire: falseを指定しないといけなくなるので止めました。

2. の方は強引にRedmine::Plugin#mirror_assetsを呼んでしまっています。このような形なのですが、これはもう少し改善したいところですね。前述のRedmine本体向けのチケットには多少考慮したパッチが付いていますが、TODOとかも書いてあったりします。あんまり頑張っても内部構造知りませんから無意味かもしれませんし。

3. はdb:migrateのタイミングで常に呼び出すようRakefileに細工したらいいと思いますが、タイミングわけないと何か困るのかしら?アンインストールと対称じゃなくなる?

おわりに

一部のプラグインでは解決したかった事はとりあえず解決でき、かつ以下のような状態になりました。

これでRedmineのありがたみを引き続き享受しながら、少々楽になる事ができました。あとはできればRedmine側でなんとかなればと思いますが、それはお茶でも飲みながら待つとします。

では改めて明日は@yassan168さんです。お楽しみにー。

SECCON 2017 Online CTFに少しだけ参加した

| 16:58 | SECCON 2017 Online CTFに少しだけ参加したを含むブックマーク

チームで500点取って434位だった。解いた問題のwrite upは以下のチームの置き場に置く予定。