2017年12月1日金曜日

[Redmine Advent Calendar 2017 1日目] shields.ioでredmine.orgのプラグインレイティングのバッヂを表示する

Redmine Advent Calendar 2017の1日目です!

Redmineのオフィシャルサイトであるredmine.orgには、開発されているプラグインを確認できるPlugins Directoryがあります。

Plugins Directoryにプラグインを登録しておくと、Redmine上から最新バージョンのチェックも行えます(管理画面のCheck for updatesから行えます)。


しかし、ソースコードは別のリポジトリに登録してある状態になります。
例えばGitHubにソースを登録しておいた場合、READMEやWiki、Issuesなど、そこだけで足りてしまうのが実際のところです。
検索してGitHubに飛んだら、Plugins Directoryを見ることがない場合も多いと思います。

そこで何か誘導するものがあれば、Plugins Directoryで他のプラグインに巡り会う機械にもつながるな、ということで、Plugins Directoryのレイティングをバッヂとして表示する仕組みを考えました。
バッヂからPlugins Directoryへリンクしてレイティングしてもらう、というモチベーションでプラグイン開発者の方にも入れてもらいやすいかなと考えています。

shields.ioというサービスが、いろいろなサービスのバッヂを提供しています。
これにredmine.orgのプラグインレイティングが載れば、プラグイン開発者の方がみんなで使えるな、ということでプルリクエストを出したところ、入れてもらえました

以下はRedmine XLSX format issue exporterの GitHubにバッヂを入れた例です。
星がでるパターンですが、数字で出すパターンもあります。

READMEには、Markdownで以下のように記載してPlugins Directoryへリンクしています。
[![Stars](https://img.shields.io/redmine/plugin/stars/redmine_xlsx_format_issue_exporter.svg)](https://www.redmine.org/plugins/redmine_xlsx_format_issue_exporter)
SVGのファイル名部分は、プラグインのPlugins DirectoryでのURL末端になります。


2日目はy503Unavailableさんです!

2017年10月28日土曜日

Redmine Auto Assign Group Pluginを作りました!

Redmine Auto Assign Group Pluginを作りました!

@akipiiさんが既にブログで取り上げてくださっています。ありがたや!
で、ブログ書いてないと気づいた。。。

きっかけ

redmine.orgのフォーラムに以下の投稿がありました。
Plugin to automatically assign new users to groups?

ユーザーの登録時に自動的にグループを設定したいという要求は、結構昔からあったようです。
上の投稿から参照されているスレッドは2012/04に開始されています。
パッチやプラグインの書き込みがありますが、条件によって別のグループを設定したい、というのが今回の投稿でした。

ユースケースとして挙げられていた、グループごとでアクセス権限を行なうような運用は、規模が大きかったり複数の組織が絡むようなときに、手間が大幅に削減できそうな感じがしました。
他にも思いつかないようなシーンが隠れてそうだなあとも思い、なんか既にありそうな感じ・・・と思ったんでググってもないから、面白そうだし作るか!ということにしました。

使い方

GitHubにインストール方法簡単な使い方を書きました。
グループの設定画面から、グループごとに正規表現でルールを設定できます。
ユーザーが追加された際に、ルールに合致するとそのグループに追加されます。

今後の方向性

とりあえず、正規表現のチェック機能が必要と思っています。
あとは、グループ横断でのルール一覧もあるといいかな、と思ったり、いらないんじゃないかな、と思ったり。
作ったばかりなので、フィードバックを頂いたら考えていこうかなあと思います。

2017年9月12日火曜日

RedmineプラグインでMroongaを使うときのテスト

Full text search pluginRedmine XLSX format issue exporterが競合した話。
パッチのロード順でチケットが表示(issues#show)できなった。
パッチを提示してもらい、パッチを適用する位置を変更して対処した。
https://github.com/two-pack/redmine_xlsx_format_issue_exporter/issues/50

ここからが本題。
いつも開発環境はsqlite3でやっているが、Full text search pluginがMroongaを使用するので、Unofficial Redmine CookingのRedmine AnsiblePlaybook Unofficial Cooking Edition(闇鍋版)を使用した。
すると、rake redmine:plugins:testでRedmine XLSX format issue exporterのテストを実行すると以下のようなエラーが出た。
Mysql2::Error: The used table type doesn't support FULLTEXT indexes: CREATE fulltext INDEX `index_issue_contents_on_contents` 

調べて見るとdb/schema.rbにテーブル作成時のオプション指定が入らないことが原因。
プラグインでは以下のようなmigrateが書かれている。
create_table :issue_contents, options: "ENGINE=Mroonga" do |t|
            t.integer :project_id
            t.integer :issue_id, unique: true, null: false
            t.string :subject
            t.text :contents, limit: 16.megabytes
            t.integer :status_id
            t.boolean :is_private
          end
対してschema.rbは以下のような感じ。
create_table "issue_contents", force: :cascade do |t|
    t.integer "project_id", limit: 4
    t.integer "issue_id",   limit: 4,          null: false
    t.string  "subject",    limit: 255
    t.text    "contents",   limit: 4294967295
    t.integer "status_id",  limit: 4
    t.boolean "is_private"
  end

  add_index "issue_contents", ["contents"], name: "index_issue_contents_on_contee
nts", type: :fulltext

rakeでテストを実行するの際に、db:test:prepareで一度テーブルが削除されてから、schema.rbを元に作成し直す。
その際に、schema.rbにはENGINEがMroongaではなくInnoDBになってしまうので、FULLTEXTのインデックスが作れない。

結局、db/tasks/redmine.rakeを書き換えた上で、db:drop -> db:create -> db:migrate -> redmine:plugins:test の順で実行した。
config/application.rbでconfig.active_record.schema_format = :sqlとするとSQLに書きだされるため大丈夫というのも検索しているとあったが、db/structure.sqlにplugin分が書き込まれてないため、rake taskではテーブルがないとエラーになってだめだった。

2017年6月18日日曜日

長岡IT開発者勉強会(NDS) 第52回勉強会に参加してきました #nds52

長岡IT開発者勉強会(NDS) 第52回勉強会に参加してきました。
http://nagaoka.techtalk.jp/no52
Togetterでまとめてくださっています。
https://togetter.com/li/1120966

今回のテーマは「初心者むけ」でした。
初心者とは・・・という哲学的な内容で非常に勉強になりましたw
メモを見ながら雑感です。へえと思ってばかりで何年やっても初心者だな、俺。。。

「はじめてのC#プログラミング」 ailightさん

  • 歴史的なあれ。N88BASIC、Quick C、Etc.... とても懐かしかった。
  • caseのbreak漏れでコンパイルエラーとか、へえと思った。
    機械、規約がうまく問題を解決してくれるのはうれしい。
  • 「分岐が複雑の始まりであることを理解する」、「ループは前処理と後処理がセットでループ」とか、その通りだなと思いつつ、普段から意識できているかというと怪しいと思った。。。

「なんてかんたんなJavaEE」 civicさん

  • Full Profile / Web Profile / Micro Profile
    薄いという選択肢があるのはいい。

「文字コードとプログラミング(仮)」 gonchan93さん

  • 「UNICODEを使え」、もうこれだね!w
  • JavaのStringがメモリ節約の方向にという話は、へえと思った。
    この辺の話。http://openjdk.java.net/jeps/254

「Netcatを使おう」 hayajoさん

  • telnetみたいなのか、と思ったらそれどころではなかった。すごいコマンドがあるもんだ!

「怖くないし役に立つ設計原則の話」 neko_gata_sさん

  • DRY原則おじさん。いるわー、おれだわー、こぴぺするなーいってるわーorz
  • 「設計原則同士は関連している」というところに集約されていると思った。おまけのデザパタも含めて。話を聞くとうんうん、と思うけど、こうやって筋立てて話をできることや反例の出せることは、本当にすごいと思う。
  • 硬い、柔らかい、のあたりが、理屈はわかっても初心者には判断が難しいところだと思う。
  • DRYにしないと!と言って見たり、こういう時は重複してもさ、とかいうことは確かにあるが、腑に落ちるように説明するのが難しいところ。

「はじめてのソフトウェアテスト(仮)」 kasacchifulさん

  • 工程や「バグ」など用語を揃えておくのは本当に大事。
  • 「テストが上手くなると設計が上手くなる」は、実感としてそう思う。
    違う視点、観点が入るというところなんだろうけど、そもそも作るべきもの、品質を捉え直すタイミング、意識ができるからかなと思う。

「今日から使えるCSSパターン」 Watanabeさん

  • Adobe Museで生成されるCSSは笑ったw
  • OOCSS、BEM(Block Element Modifier)は初めて聞いた。
  • 全体を貫く「設計方針」が必要という話も含めて、実践的なアプローチをされていて、すごいと思った。

「はじめての修羅場」 hiro_ishibashiさん

  • すごく良い話だった。
  • 発表にあったようなことを意識もしないようなPMも山ほどいる。メンバーは辛みしかない。
  • なにもマジな修羅場でなくても、修羅場予備軍でのカイゼンポイントばかりだと思った。
  • 「犯人にまかせた、放置したマネジメント層の問題」。これ。本当にこれ。

「フリーランスの始め方(初心者向け)」 nemuzukaさん

  • 税金とか普段は意識しないから、へえと思った。

「「新人研修の作り方」のその後」 masaru_b_clさん

  • どんどん改善されていくことがすばらしい。
  • 継続していることもすばらしい。
  • 外部に公開していることも本当にすばらしい!

「インターネットの契約から開通まで」 kam1nchuさん

  • ネット引くのって、すげーことなんだなと思った。
    こんなことかんがえたことなかったw
  • ひかり電話も使ってあげて欲しいと思ったw








2017年5月25日木曜日

RedmineのテストFixturesを手動テスト用に投入する

RedmineのテストFixturesを手動テスト用に投入するのに以下のようなスクリプトを作成しました。
https://github.com/jbbarth/redmine-scripts
を参考にしました。

#!/bin/bash
export RAILS_ENV=test
test -e test/.fixtures.core || cp -a test/fixtures test/.fixtures.core
rm -rf test/fixtures
mkdir test/fixtures
cp -i test/.fixtures.core/*yml test/fixtures/
cp -i plugins/*/test/fixtures/*yml test/fixtures/
cp -i plugins/*/spec/fixtures/*yml test/fixtures/
bundle exec rake db:drop db:create db:migrate redmine:plugins db:schema:dump db:fixtures:load
cp -f db/test.sqlite3 db/test.template.sqlite3

上記を実行してから、
$ RAILS_ENV=test ruby bin/rails server
で起動すると、Fixturesに含まれているeCookbookなどのプロジェクトが使えます。

2017年5月21日日曜日

Travis-CIで行っているRedmineプラグイン用テストをローカルで行う

Redmine XLSX format issue exporterのCIはTravis-CIを使わせてもらっています。
Travis Integration for Redmine Pluginsを使うとRubyとRedmineのバージョンの組み合わせなども結構簡単に環境を作れます。
ただGitHubへのPushがトリガーなのでローカルでもできると確認とかできていいかな、と思って、Travis-CI環境をローカルでというのをやってみました。
結論から言うと、Pushしちゃう方が早い、と言う感じでした。。。

まずは公式

Troubleshooting Locally in a Docker Imageで、Dockerで提供されているイメージと.travis.ymlからCI用のシェルスクリプトを出力するtravis-buildのインストールについて書かれています。
最後の最後で手動で依存関係解決しCIコマンド実行してね、で終わってて詰まりました。

実際にやった手順

環境

  • macOS Sierra 10.12.4
  • Docker version 17.03.1-ce, build c6d412e

手順

1. Dockerイメージを起動してログインする
~ $ docker pull travisci/ci-garnet:packer-1478744932
packer-1478744932: Pulling from travisci/ci-garnet
Digest: sha256:9380acbb65ed1ae6e5a0b545616f2f4a9f8d6855c264a45924dd52d3ff0589f5
Status: Image is up to date for travisci/ci-garnet:packer-1478744932
~ $ docker run --name travis-redmine-ci --rm -dit travisci/ci-garnet:packer-1478744932 /sbin/init
<snip>
~ $ docker exec -it travis-redmine-ci bash -l
root@foo:/# su - travis
travis@bar:~$

参考ページ
https://docs.docker.com/engine/reference/commandline/run/
http://docs.docker.jp/engine/reference/run.html
https://docs.docker.com/engine/reference/commandline/exec

2. Travis-CI CLIをインストールする
travis@bar:~$ gem install travis
<snip>
travis@bar:~$ git clone --depth=50 --branch=master https://github.com/travis-ci/travis-build.git
<snip>
travis@cc01d74d8710:~$ travis
Shell completion not installed. Would you like to install it now? |y|
<snip>
travis@bar:~$ cd travis-build
travis@bar:~$ ln -s `pwd` ~/.travis/travis-build
travis@bar:~$ bundle install --gemfile ~/.travis/travis-build/Gemfile
<snip>
travis@bar:~$

参考ページ
https://docs.travis-ci.com/user/common-build-problems/#Troubleshooting-Locally-in-a-Docker-Image
https://github.com/travis-ci/travis.rb

3. .travis.ymlからCI用のスクリプトを生成する
ここでは、Redmine XLSX issue exporterのリポジトリをクローンしています。
リポジトリのルートに.travis.ymlがあります。
travis@bar:~$ cd ~/builds
travis@bar:~$ git clone https://github.com/two-pack/redmine_xlsx_format_issue_exporter.git
travis@bar:~$ cd redmine_xlsx_format_issue_exporter
travis@bar:~$ travis compile 1.1 > ci.sh

4. スクリプトを修正する(その1)
Dockerの制約でスクリプト内で行っている/etc/hostsの変更ができなくなっています。
このため、無理やりですが参考ページを参考に、スクリプトを変更して対処します。

変更前
sudo sed -e 's/^\(127\.0\.0\.1.*\)$/\1 '`hostname`'/' -i'.bak' /etc/hosts
test -f ~/.m2/settings.xml && sed -i.bak -e 's|https://nexus.codehaus.org/snapshots/|https://oss.sonatype.org/content/repositories/codehaus-snapshots/|g' ~/.m2/settings.xml
sudo sed -e 's/^\([0-9a-f:]\+\) localhost/\1/' -i'.bak' /etc/hosts

変更後
cp /etc/hosts ./hosts.new
sudo sed -e 's/^\(127\.0\.0\.1.*\)$/\1 '`hostname`'/' -i'.bak' ./hosts.new
test -f ~/.m2/settings.xml && sed -i.bak -e 's|https://nexus.codehaus.org/snapshots/|https://oss.sonatype.org/content/repositories/codehaus-snapshots/|g' ~/.m2/settings.xml
sudo sed -e 's/^\([0-9a-f:]\+\) localhost/\1/' -i'.bak' ./hosts.new
cp -f ./hosts.new /etc/hosts

参考ページ
http://blog.jonathanargentiero.com/docker-sed-cannot-rename-etcsedl8ysxl-device-or-resource-busy/

5. スクリプトを修正する(その2
travis-buildのページに書いてありますが、.travis.ymlに書かれているenvやmatrixはスクリプト生成時に反映されません。このため、スクリプトでいくつかの修正が必要です。
赤字部分が該当箇所で.travis.ymlの定義に該当します。

  • 使用するRubyバージョンを書き換え
    travis_cmd rvm\ use\ 2.0.0\ --install\ --binary\ --fuzzy --assert --echo --timing
  • 使用するRedmineバージョンの書き換え
    travis_cmd export\ REDMINE_VERSION\=2.5.2 --echo
  • 対象ブランチの指定
    travis_cmd git\ clone\ --depth\=50\ --branch\=\'\'\ https://github.com/two-pack/redmine_xlsx_format_issue_exporter.git\ two-pack/redmine_xlsx_format_issue_exporter --assert --echo --retry --timing

6. スクリプトを実行する
travis@bar:~$ bash ci.sh

まとめ

.travis.ymlのmatrixやenvの設定を活かしたスクリプトをうまく生成できないため、手間がかかってしまいます。
Travis-CI上でのみ失敗するとかでなければ、大人しくブランチにプッシュしてクラウドで回してもらう方が良さそうです。


2017年5月1日月曜日

JaSST'17 Niigataの振り返り

2017/04/28(金)に、「JaSST'17 Niigata ソフトウェアテストシンポジウム 2017 新潟」行われました。
テーマは「ユーザビリティ / UX」。私は実行委員なのにテーマが決まってから本を読む、という有様でしたので、非常に勉強になりました。
そのうち資料の公開もあると思いますが、現時点での振り返りです。


基調講演

基調講演は、利用品質ラボの樽本 徹也さんから
「ユーザエクスペリエンスの要素とプロセス——UX/UCD概論」
でお話頂きました。
UXとは?なぜUXなのか?そしてUCDと、概論として非常に分かりやすい形でのお話でした。著書の「ユーザビリティエンジニアリング (第2版)」を読んでから臨みましたが、更に理解が深まった気がしました。
心にとまった幾つかピックアップ。
  • 効果、効率、満足度
  • Experienceが儲かる
  • UXの要素 表層、骨格、構造、要件、戦略
    (ジェス・ジェームス・ギャレットの「The Elements of User Experience」)

事例紹介

事例紹介として、日立ソリューションズの柳生 大介さんから、
「機能中心から人間中心へ ~日立ソリューションズの取り組み~」
でお話頂きました。
どんなきっかけでUXへの活動を始めたのかから、具体的な取り組みと非常に興味深かったです。
手法の紹介も具体的で実際のイメージがつかみやすかったのではないかと思います。
心にとまった幾つかピックアップ。
  • 共通の物差しとしてのペルソナ
  • ブレストでのアンチプロブレム
  • ユーザーに伝わるのか、まずは言葉を見直す

情報交換会

JaSST Niigataでは毎回、本会後に情報交換会が行われています。
お茶やお菓子とともに講演者の方々や参加者の方々と語り、交流を深めるという会です。
新潟だけではなく各地から参加してくださ方もおられ、いい刺激になりました。
そして、樽本さんからは「ユーザビリティエンジニアリング (第2版)」にサインを頂きました!

というわけで

ぼんやりな感じの振り返りになりましたが、UXを知る、というところからと考えていた私としては、得るものが多い場となりました。
このあとも、JaSSTは東北、関西、北海道と続いていきますので、足を運んでみてはいかがでしょうか?



RedmineプラグインをGitHub Actionsでテストする

Redmine Advent Calendar 2019 の Qiita で書きました。追っかけで もう一つ 。 Travis-CIで行っていたRedmineプラグインのCIを、GitHub Actionsに変更したものです。 GitHub Actionsをやってみようという...