Hatena::ブログ(Diary)

sho-hの日記

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は以下のチームの置き場に置く予定。

2017-11-12

CODE BLUE CTF 2017に参加した

| 15:00 | CODE BLUE CTF 2017に参加したを含むブックマーク

136点取って154位だった。もう少し時間欲しかったな...。解いた問題は以下のチームのwrite up置き場に置いた。

cryptoは4つめまでくらい解けてもいいんじゃないかと思ったけど、時間的に1番目の後はすぐに4番目に着手して解けきれず時間切れでおしまいorz。やっぱライブラリツール類を初めから準備しておかないとダメだ。とりあえず隔離環境としてVagrantfileを毎回作ってるけど、今回はPython用にasdfな環境を用意しはじめたのでまずはそこを短くするところからかな...

asdf触ってみた

| 15:00 | asdf触ってみたを含むブックマーク

RWCで範囲が広いrbenv的なやつ教えてもらったので隔離環境で試してみる。Python向けにpyenvとか手で入れるなら言語が増える度にそうなるので嫌だった。rbenvを捨てるかrubyプラグインを使わないかにしないといけないと教えて貰っていたが、1個に絞れるならrbenvである必要はない(というか中でrbenvもpyenvも呼ばれてるのかしら?)のでこれにする。

ぐぐりにくいので名前はひどいけど、anyenvだと `$ anyenv install rbenv` して `rbenv install` するみたいな流れになるので今知ってる範囲だとこちらの方が好ましい。Rubyは--HEADでruby-buildインストールしてるのでそれで困りそうだから本格的に移行はせずにまだ仮想環境だけだけど。

gitが入ってる状態で、READMEの通りにしてインストール

$ sudo apt-get install -y automake autoconf libreadline-dev libncurses-dev libssl-dev libyaml-dev libxslt-dev libffi-dev libtool unixodbc-dev
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.4.0
$ echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
$ echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc

シェルを再読み込みしてあとはRubyPythonを入れてみる。

$ asdf plugin-add ruby       # Ruby用のプラグインインストール
$ asdf install ruby 2.4.2    # Ruby 2.4.2をインストール
$ asdf plugin-add python     # Python用のプラグインインストール
$ asdf install python 2.7.14 # Python 2.7.14をインストール
$ asdf install python 3.6.3  # Python 3.6.3をインストール

使ってみる。

$ ruby -v
No version set for ruby
$ asdf global ruby 2.4.2
$ ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]

$ python -V
No version set for python
$ asdf global python 3.6.3
$ python -V
Python 3.6.3

以下を見るに、gem installした時も環境が汚れそうにない(/home/vagrant/.asdf/installs/ruby/2.4.2/lib/ruby/gems/2.4.0にインストールされそう)。pipで同じ情報を見る方法がまだわからない。asdf plugin-updateすればプラグインの更新まではできそう。

$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 2.6.13
  - RUBY VERSION: 2.4.2 (2017-09-14 patchlevel 198) [x86_64-linux]
  - INSTALLATION DIRECTORY: /home/vagrant/.asdf/installs/ruby/2.4.2/lib/ruby/gems/2.4.0
  - USER INSTALLATION DIRECTORY: /home/vagrant/.gem/ruby/2.4.0
  - RUBY EXECUTABLE: /home/vagrant/.asdf/installs/ruby/2.4.2/bin/ruby
  - EXECUTABLE DIRECTORY: /home/vagrant/.asdf/installs/ruby/2.4.2/bin
  - SPEC CACHE DIRECTORY: /home/vagrant/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /home/vagrant/.asdf/installs/ruby/2.4.2/etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
    - /home/vagrant/.asdf/installs/ruby/2.4.2/lib/ruby/gems/2.4.0
    - /home/vagrant/.gem/ruby/2.4.0
    ...

以下がプラグインの保存先みたいだけど、このレポジトリを覗くにrbenvは使ってなさそう。

$ cd ~/.asdf/plugins/ruby/
$ git remote -v
origin	https://github.com/asdf-vm/asdf-ruby (fetch)
origin	https://github.com/asdf-vm/asdf-ruby (push)

$ git branch
* master

うーん、以下ら辺を見るに「このバージョンのRubyはこのURLな」とだけするからrc1とかも簡単に入りそうだけどそれは微妙だ。anyenvの方がいいかもしれない(使った事ないけどあっちはいまのところラッパーでない事だけがつらい)。branchを見たのはbranchによってオプションを指定する事ができるかもと思ってだけどそれ以前の話だった。

PRもIssueも見当たらないけど皆それでいいのかしら?(rbenvのruby-buildみたいにする事になると思うのだけど

とりあえず隔離環境でだけ使う事にしてもう少し詳しくなろう。でもanyenvにする気がする。

2017-08-07

8/26(土)は Matsue.rb 定例会

| 09:24 |  8/26(土)は Matsue.rb 定例会を含むブックマーク

8/26(土) 09:30〜17:00 に松江テルサ別館 2F で Matsue.rb の定例会をやります。87 回目の定例会でございます(募集ページをDoorkeeperに移したので久しぶりに書きました)。

はじめての方は(できればでいいので) PC をご用意くださいませ。m(_ _)m

2017-07-06

Chromeのflashって組み込みなのを今頃知った

21:32 | Chromeのflashって組み込みなのを今頃知ったを含むブックマーク

元々無効化してたflashアンインストールした。しかし、Chromeだけよくみたら「プリインストールされています」とか書いてあるのでなんかと思ったら組み込みだった。Chromeと一緒に更新されるらしい...というか、flashが更新されるとChromeのバージョンも上がるのねって思った。まぁ無効のままなんだけど。以下参考にしたURLのメモ。

Trend Micro CTF 2017に参加した

| 21:43 |  Trend Micro CTF 2017に参加したを含むブックマーク

6/24-25の事だけど、Trend Micro CTF 2017に参加した。今回は1問も解けなかった...orz

どれも1個ハードルを突破したと思ったら次のハードルが待ってたりして、マジなリクルート感を見たような気がした。次回もうちょっと頑張ろう。

チームのwrite upは以下。

2017-06-19

Windowsでbcrypt gemを使うのに一癖あった

| 10:39 |  Windowsでbcrypt gemを使うのに一癖あったを含むブックマーク

Windowsでbundle installで入ったbcryptを使おうとしたら以下のような感じで怒られた。

LoadError: cannot load such file -- bcrypt_ext
C:/.../config/application.rb:7:in `<top (required)>'
C:/.../Rakefile:4:in `require_relative'
...

確かにbcrypt_ext.soがないのでコンパイルされてなさそうだとコンパイル(DevKitが必要)。というか作っては削除し作っては削除しという稀有な環境なので一時的にインストールまでしてしまった。site-ruby以下にあると思うので、gem uninstallの時に注意しとこう。あるいは違うバージョン使う時とか。makeだけでもいい気もするけどそれで動くかは確認していない。

> cd \path\to\ruby\lib\ruby\gems\2.3.0\gems\bcrypt-3.1.11-x86-mingw32\ext\mri
> ruby extconf.rb
> make
> make install

さて当面は問題なくなったので、Issueがなければ報告しようとおもったらすでにあった。なんか長引いてるみたいなので修正にはしばらくかかるのかもしれない。