すえひろがりっっっっ! このページをアンテナに追加 RSSフィード

2015-06-03

管理者権限でログインしているかどうかをひと目で分かるようにする Redmine プラグインを作った

Redmine管理者と一般ユーザを分けていると、よくある失敗として、

管理者権限でログインしたままでいることを忘れたままチケットを作成・更新してしまう、

ということがあります。

そうすると、チケットの更新者が自分じゃなくて管理者ユーザになってしまって悲しい思いをします。

そういった事故を減らすために管理者ログインしているかどうかをテーマでひと目で分かるようにするプラグインを作りました。

環境

Redmine 3.0.0

ソースコード

https://github.com/suer/redmine_admin_class

機能

管理者ユーザでログインしている時のみ <body> タグの class に "admin" を追加します。

この class を利用したテーマを自作することで管理者と一般ユーザの画面の見た目を切り替えることができるようになります。

利用手順

テーマを作成します。

例えば、public/themes/admin/stylesheets/application.css を以下のように作成します。

@import url(../../../stylesheets/application.css);
body.admin #top-menu { background-color: #f0908d; }
body.admin #header { background-color: #f2a0a1; }

管理画面で作成したテーマを指定します。

f:id:suer:20150603232342p:image:w400


この例の場合は、一般ユーザでログインした場合は通常の画面

f:id:suer:20150603232344p:image:w400

管理者ログインした場合は別の見た目になります。

f:id:suer:20150603232345p:image:w400

これで誤ったアカウントでチケットを更新する事故をかなり防げるようになります。

まとめ

2013-07-06

Gitlab, AsakusaSatellite などの開発者向け Rails アプリを Redmine で OAuth 認証するための Omniauth プラグイン作った

Redmine・Gitlab・Jenkins のログインパスワードの管理が大変になったので OAuth 化した - すえひろがりっっっっ!RedmineOAuth プロバイダにできました。

Rails 製のクライアントアプリケーション側は Omniauth Strategy を都度 initializers 以下に設置するようにしていましたが、各アプリケーションに対して同じような作業をするのは DRY じゃないのでライブラリ化しました。

omniauth-redmine https://github.com/suer/omniauth-redmine

環境

ruby 1.9 以降

rails 3.x 以降

セットアップ

Gemfile に以下を追記します。

gem 'omniauth-redmine', :github => 'suer/omniauth-redmine'

設定

devise を利用している場合は RAILS_ROOT/config/initializers/devise.rb に

config.omniauth :redmine, "consumer key", "consumer secret", :redmine_base_url => "http://redmine.base.url/"

のように追記します。 :redmine_base_url オプションは必須項目です。

omniauth を生で扱ってる場合は RAILS_ROOT/config/initializers/omniauth.rb として以下の内容を記述します。

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :redmine, "consumer key", "consumer secret", :redmine_base_url => "http://redmine.base.url/"
end

まとめ

これで Rails 製のアプリケーションへの組み込みの敷居が下がったと思います。

以下のような開発者向けアプリケーションアカウントを共通化できるかと思います。

2013-05-30

Redmine・Gitlab・Jenkins のログインパスワードの管理が大変になったので OAuth 化した

開発環境として Gitlab、Jenkins、Redmine をセットで使っているのですが、それぞれにパスワードの設定が必要となって管理が面倒です。

アカウントを一つに統合したい。ということでやってみました。

環境

  • Redmine 2.3.0
  • Jenkins 1.499
  • Gitlab 5.2

方針

RedmineプラグインOAuth プロバイダの機能を追加し、Redmineアカウントで Jenkins と Gitlab へログインできるようにします。

RedmineOAuth プロバイダの機能をつける

やりたいことに近いプラグインがあったのですが、Rails3 以降の Redmine に対応していなかったので、fork して、ついでに日本語化しておきました。

http://redmine.root.url/oauth_clients/ にアクセスすると OAuth の consumer key を発行できるようになります。

f:id:suer:20130530210412p:image

f:id:suer:20130530213320p:image


Jenkins の認証を OAuth に対応する

@mallowlabs さんがあっさり作ってくれました。

Jenkins へログインしようとすると RedmineOAuth へリダイレクトさるようになります。

f:id:suer:20130530213038p:image

Gitlab の認証を OAuth に対応する

Gitlab は Omniauth でのログインに対応しているので、RedmineOAuth を使って認証するような Strategy を書いて config/initializers に突っ込みました。

こんなふうに書いています。


module OmniAuth
  module Strategies
    class Redmine < OmniAuth::Strategies::OAuth
      option :client_options, {
        :authorize_url => 'https://dev.example.com/redmine/oauth/authorize',
        :request_token_url => 'https://dev.example.com/redmine/oauth/request_token',
        :access_token_url => 'https://dev.example.com/redmine/oauth/access_token'
      }

      uid { raw_info['user']['id'] }

      info do
        {
          'nickname' => raw_info['user']['mail'],
          'email' => raw_info['user']['mail'],
          'name' => "#{raw_info['user']['lastname']} #{raw_info['user']['firstname']}"
        }
      end

      def raw_info
        @raw_info ||= MultiJson.decode(access_token.get("https://dev.example.com/redmine/oauth/user_info.json").body)
      end
    end
  end
end

Omniauth の Strategy の書き方はこちら。

さらに、assets/authbuttons/redmine_32.png に適当なアイコンを置いておくと、こんなふうにログインフォームの下に RedmineOAuth へのリンクが設置されます。

f:id:suer:20130530210410p:image

まとめ

以上で Redmineアカウントにパスワードを集約できました。

シングルサインオンとまではいかないまでも、一度 Redmineログインしてしまえば数クリックでそれぞれの環境にログインできるのでとても快適です。

2012-12-04

複数の Jenkins と Travis のビルドの失敗が最速で分かる Stoplight を Heroku にデプロイ

f:id:suer:20121204224733j:image:w400

複数のビルドサーバを一つのUIで確認できるStoplight - cynipeと読む を見て「これだっ!」と、この前まで隣だった人が叫んでいたので Heroku にデプロイしてみました。

iPad で表示したままにしておいて、チームのメンバが見えるところにおいておくと XFD っぽくていい感じです。


前提

以下が準備済みである必要があります。

  • Git がインストールされている
  • Heroku にアカウントをもっている
  • Heroku コマンドがインストールされている
  • Heroku のアカウントに公開鍵が登録されている

手順

1. stoplight を clone する

$ git clone git://github.com/customink/stoplight.git
$ cd stoplight

2. ログ出力パスの変更

Heroku は tmp/ ディレクトリ以外のファイル書き込みを禁止しているのですが、ログ出力で log/ ディレクトリに書き込みをしようとしているのでこのままでは実行時にエラーを吐いてしまします。

$ git grep application.log
config/boot.rb:$logger = ::Logger.new('log/application.log')
lib/stoplight/providers/provider.rb:  $logger = Logger.new('log/application.log')

そこでそれぞれのログ出力パスを tmp/ ディレクトリ以下に変更します。


$ git diff 
diff --git a/config/boot.rb b/config/boot.rb
index 036429e..2db6b98 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -16,5 +16,5 @@ require 'application'
 
 require 'logger'
 class ::Logger; alias_method :write, :<<; end
-$logger = ::Logger.new('log/application.log')
+$logger = ::Logger.new('tmp/application.log')
 use Rack::CommonLogger, $logger
diff --git a/lib/stoplight/providers/provider.rb b/lib/stoplight/providers/provider.rb
index 9bcadd9..77b7f44 100644
--- a/lib/stoplight/providers/provider.rb
+++ b/lib/stoplight/providers/provider.rb
@@ -7,7 +7,7 @@ require 'uri'
 
 unless $logger
   require 'logger'
-  $logger = Logger.new('log/application.log')
+  $logger = Logger.new('tmp/application.log')
 end
 
 # Provider is an abstract class that all providers inherit from. It requires that a specified format be returned. This way, stoplight

変更を commit しておきます。

$ git commit -am "change log file path"

3. 設定

設定は servers.yml に記載します。

example ファイルがあるので、これをコピーして編集します。

$ cp config/servers.yml.example config/servers.yml

以下のような内容を追記します。編集内容は 本家 README を参考にしましょう。

-
  type: 'jenkins'
  url: JenkinsのURL
-
  type: 'travis'
  url: http://travis-ci.org
  owner_name: ユーザ名

config/servers.yml は .gitignore で無視されるので、無視されないようにします.

$ git diff
diff --git a/.gitignore b/.gitignore
index e9461a4..1496818 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
 .bundle
 .rvmrc
 .sass-cache
-config/servers.yml
 log/*.log
 tmp
 vendor/ruby

設定を commit します。

$ git add .
$ git commit -a -m "settings"

4. Procfile を消す

Procfile の内容が実行されますが Heroku では失敗します。

運用環境では必要無いので消してしまいましょう。

$ rm Procfile
$ git commit -a -m "remove Procfile"

5. デプロイ

いよいよデプロイします。heroku create 時に URL が表示されるのでメモしておきましょう。

(忘れた場合でも Heroku にログインすれば確認できます)

$ heroku create
Creating stark-badlands-1640... done, stack is cedar
http://stark-badlands-1640.herokuapp.com/ | git@heroku.com:stark-badlands-1640.git
Git remote heroku added

$ git push heroku master

6. 確認する

デプロイ時に表示された URL に index.html をつけてアクセスします。

今回の場合なら http://stark-badlands-1640.herokuapp.com/index.html となります。

f:id:suer:20121204221700p:image:w300

まとめ

実際は試行錯誤しましたが、まとめてみると簡単にデプロイできるようになりました。

ビルドサーバが VPS などグローバルにアクセスできるところにあるのであれば、Heroku へのデプロイを検討してみてもいいかもしれません。

2010-10-03

履歴付チケット一覧出力プラグインを書いてみた

Redmineのチケット一覧のCSV出力は説明は出力されますが、履歴が付いてきません。

チケットを長らくメンテしてると、重要な情報は履歴にあったりするので、一覧するときには履歴が付いていた方が便利なことが多々あります。

そこで通常のCSV出力の末尾に履歴を追記するプラグインを書いてみました。

もしかしたら世の中には既に作っている人がいるかも知れません...

リポジトリ

http://github.com/suer/redmine_export_with_journals

環境

Redmine 1.0.0 で確認しています。

0.9 系でも使えるかも。

インストール

Redmineのルートディレクトリで

$ ruby script/plugin install git://github.com/suer/redmine_export_with_journals.git

してからRailsを再起動。

使用方法

設定

システム管理者アカウントログインし、

「管理」メニューの「ロールと権限」から許可したいロールの「Export csv with journals」にチェックを入れて保存します。

f:id:suer:20101004002234p:image

出力
  1. 許可したロールのユーザでログイン後、プロジェクトにアクセスし、「チケット」メニューをクリックします
  2. 適当に検索します
  3. チケットリストの右下の「csv with journals」をクリックします

f:id:suer:20101004002235p:image

こんな感じで履歴が後ろに出力されます。

f:id:suer:20101004002237p:image

まとめ

履歴まで一覧できたらどうだろう、ということでやってみましたがどうなんでしょう。

それなりに便利そうならメンテを続けるかもしれません。


2011/6/12 追記

出力件数の上限のロジックを変更しました。

チケット一覧で25件表示だったら25件しか出力していなかったのですが、標準のCSV出力と合わせました。

管理者アカウント

  • 「管理」 > 「設定」 > 「チケットトラッキング」タブ

と進み、「出力するチケット数の上限」の数値を設定してください。

f:id:suer:20110612225252p:image