<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Чудо{вищные} заметки &#187; redmine</title>
	<atom:link href="http://miracle.rpz.name/tag/redmine/feed/" rel="self" type="application/rss+xml" />
	<link>http://miracle.rpz.name</link>
	<description>Sorry for my terrible english. My native language is PHP.</description>
	<lastBuildDate>Thu, 12 Jan 2012 20:42:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-alpha-19719</generator>
		<item>
		<title>Jabber-нотификация в redmine</title>
		<link>http://miracle.rpz.name/2011/06/27/redmine-with-jabber-notifications/</link>
		<comments>http://miracle.rpz.name/2011/06/27/redmine-with-jabber-notifications/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 17:35:38 +0000</pubDate>
		<dc:creator>MiRacLe</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[jabber]]></category>
		<category><![CDATA[node]]></category>
		<category><![CDATA[redmine]]></category>

		<guid isPermaLink="false">http://miracle.rpz.name/?p=498</guid>
		<description><![CDATA[Просматривая статистику посещений, обратил внимание на то, что многих интересует словосочетание &#171;redmine jabber&#187;. Пришла пора удовлетворить спрос. В начале &#171;как обычно&#187; небольшая предыстория о том, &#171;как всё начиналось&#187;: Несколько лет назад мне удалось внедрить redmine на &#171;производстве&#187;, коллеги потихоньку втягиваясь в процесс, затребовали &#171;книгу отзывов и предложений&#187;. Одним из первых пожеланий была замена стандартных уведомлений [...]]]></description>
			<content:encoded><![CDATA[<p>Просматривая статистику посещений, обратил внимание на то, что многих интересует словосочетание &laquo;redmine jabber&raquo;. Пришла пора удовлетворить спрос. В начале &laquo;как обычно&raquo; небольшая предыстория о том, &laquo;как всё начиналось&raquo;:</p>
<blockquote><p> Несколько лет назад мне удалось внедрить <a href="http://redmine.org/">redmine</a> на &laquo;производстве&raquo;, коллеги потихоньку втягиваясь в процесс, затребовали &laquo;книгу отзывов и предложений&raquo;. Одним из первых пожеланий была замена <span title="политика настройки которых мягко говоря идиотская">стандартных уведомлений по email</span> на, успевшие уже войти в моду, <a href="http://miracle.rpz.name/2009/02/24/commit-jabber-php/">jabber-уведомления, которые мы используем для нотификации о новых коммитах в svn</a>. Я вооружился тем самым поисковым запросом, о котором упомянул и немедленно нашёл нужной функциональности <a href="https://github.com/mszczytowski/redmine_messenger/tree" title="Messenger plugin for Redmine">готовый плагин</a>. Помимо уведомлений, автор обещал нам некие таймеры, которые можно стартовать/останавливать посредством команд боту в чате, тем самым &laquo;точно&raquo; подсчитывать затраченное на решение задачи время. В теории это казалось очень нужной и удобной игрушкой, на деле же оказалось, что плагин был выпилен для старой версии redmine и с trunk-версией работать по полной программе отказался. Худо-бедно он иногда стартовал какие-то таймеры, иногда присылал какие-то уведомления, от полученных команд иногда впадал в ступор и потом долго игнорировал собеседника, в общем  вёл себя непозволительно загадочно и непростительно таинственно, но скиллов для исправления обнаруженных проблем мне не хватало, а автор на открытые тикеты особо не реагировал. Мыши плакали, кололись и продолжали есть кактус до одного смешного стечения обстоятельств: я находился в другом городе, бессовестно тратил отпускное время на прогулки, осмотры достопримечательностей и дивных пейзажей, внезапно получил входящий звонок от коллег. Слёзно просили выручать &#8211; что-то мол случилось, трах-бах-тарарах &#8230;и всё, нет у нас больше redmine. Немного порассуждав вслух, источник проблемы вроде бы вычислили, каким-то временным образом проблему по телефону решили, но в тот же вечер, добравшись до интернета, плагин я без сожалений выкинул. Случилось следующее &mdash; при старте redmine, плагин коннектился к jabber-серверу, а уж затем поднимался сам редмайн, но в тот роковой момент соединение с интернетом пропало, от чего случился обширный exception и redmine умер не приходя в сознание.
</p></blockquote>
<div align="center">***</div>
<p>
Тогда стало понятно, что схема со злобным плагином не работает и уведомления надо рассылать внешним по отношению к redmine решением (здесь знатоки rails могли бы долго возражать, но уже поздно). Параллельно с этой проблемой существовали другие.<span id="more-498"></span> <a href="http://miracle.rpz.name/2009/02/24/commit-jabber-php/">Cкрипт, о котором уже упомянул выше</a>, работал прямо скажем неэффективно. Во-первых он <span title="казалось бы - какая разница?! часто что ли коммиты бывают? нет, но всё равно раздражает!">соединялся с xmpp-сервером после каждого коммита</span>, порой делал это долго, порой это у него не получалось, порой сообщения не доставлялись адресату, даже если соединение с сервером было успешным. Поэтому рассылку уведомлений сразу после коммита пришлось разбить на два шага: 1) положить в очередь сообщения для адресатов 2) забрать уведомление из очереди и разослать, после подтверждения доставки удалить его из очереди. Теперь второй скрипт запускался периодически (не после коммита) рассылал уведомления, удалял их из очереди (подтверждения о получении я реализовать не смог). По-прежнему оставалась проблема с пропадающими сообщениями. Немного покопавшись в недрах протокола я обнаружил что клиент получателя, сервер получателя или мой xmpp-сервер при возникновении ошибки возвращают моё сообщение но с типом <em>error</em>: это значило, что периодический запуск &laquo;рассылатора-уведомлятора&raquo; не подходит &mdash; надо держать постоянное соединение с сервером и должным образом обрабатывать входящие сообщения. Так &laquo;в муках&raquo; родился прототип <a href="http://miracle.rpz.name/2009/12/05/jabber-web-status/">бота webstatus-а</a>, а с ним и рабочая реализация механизма уведомлений по xmpp. Первоначально это был скрипт на php, который при запуске подключался к jabber-серверу, периодически дёргал mysql запросом на получение новых сообщений и рассылал их, помечал как отправленные, если потом возвращались ошибки &#8211; вновь отмечал сообщения как непрочитанные. В mysql-таблицу сообщения попадали от разных источников &#8211; от post-commit хука в svn, от различных скриптов, которые запускаются cron-ом и собирают необходимые нам данные. </p>
<div align="center">***</div>
<p>
Таким образом прикрутить это решение к redmine стало просто делом техники &mdash; требовалось лишь сделать &laquo;триггеры&raquo; в нужных моделях, которые бы добавляли новые записи в таблицу с очередью сообщений для xmpp-бота. Уже позднее <a href="http://miracle.rpz.name/2010/11/20/jabber-web-status-2/">php-решение было переписано на модной нынче node-платформе</a>. Потребовалась лишь прослойка в виде <a href="http://code.nytimes.com/projects/dbslayer">dbslayer</a> для того чтобы соединить node и mysql.</p>
<p> Теперь всё выглядит следующим образом:</p>
<ul>
<li>Сообщения от разных источников попадают в mysql (например :after_save в issue модели редмайна, post-commit хук в svn и т.д.)
<li>Jabber-бот (на <a href="http://nodejs.org">node</a>) периодически делает запрос в mysql (через <a href="http://code.nytimes.com/projects/dbslayer">dbslayer</a>) вида <code>select msg, recipient from msg where recipient in (cписок тех, кто сейчас в онлайне)</code>, если получен непустой результат, то сообщения отправляет адресату и отмечает их прочитанными.
<li> Если сообщение вернулось с ошибкой &#8211; бот отмечает его непрочитанным, а адресата на некоторое время отправляет &laquo;на скамейку запасных&raquo; (чтобы не долбить его повторяющимися запросами)
<li> Бот поддерживается на плаву с помощью <a href="http://supervisord.org/">supervisord</a> (случаются ошибки, как правило сетевые, которые не удаётся поймать стандартными try-catch в коде бота, после некоторых попыток обработать все возможные проблемы я пришёл к выводу, что проще &laquo;упасть и товарищи поднимут&raquo; нежели пытаться &laquo;любой ценой устоять&raquo; &mdash; всё-таки данные не настолько критичные и безвозратная потеря сообщения терпима.
</ul>
<div align="center">***</div>
<p id="download"> Тех, кто дочитал до этого места и всё ещё жаждет получить ссылку <a href="#download">&laquo;скачать&raquo;</a> мне придётся огорчить &mdash; описанный код сильно заточен под наши конкретные нужды и планов его публикации не было, поэтому redmine-зависимая часть кода просто на-тяп-ляплена посреди моделей самого редмайна безо всякой попытки вынести эти части в отдельный плагин, node-часть тоже не обошлась без влезания в &laquo;чужие&raquo; библиотеки. А это всё значит лишь одно: plug-n-play решения у меня нет. Но <a href="http://miracle.rpz.name/2011/06/27/redmine-with-jabber-notifications/#dsq-comments">в комментариях</a> вы можете попробовать наладить конструктивный диалог и мы совместными усилиями создадим работающий у вас плагин, с чаем и шахматистками. Вас это интересует?</p>
]]></content:encoded>
			<wfw:commentRss>http://miracle.rpz.name/2011/06/27/redmine-with-jabber-notifications/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>redmine mail reader</title>
		<link>http://miracle.rpz.name/2009/11/07/redmine-mail-reader/</link>
		<comments>http://miracle.rpz.name/2009/11/07/redmine-mail-reader/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 00:22:53 +0000</pubDate>
		<dc:creator>MiRacLe</dc:creator>
				<category><![CDATA[advertise]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://miracle.rpz.name/?p=293</guid>
		<description><![CDATA[Некоторое время назад для ведения &#8220;задачаоборота&#8221; мы c небольшой группой &#8220;единомышленников&#8221; решили использовать Redmine. Коллеги стали замечать, что волосы у нас стали шелковистыми, одежда сияет белизной, а главное &#8211; СУХО! Ну и постепенно начали вовлекаться в процесс. Сразу же, с порога, выдвинули претензию &#8211; а почему нельзя создать задачу из письма (Слава привет!) ? Главным [...]]]></description>
			<content:encoded><![CDATA[<p>Некоторое время назад для ведения &#8220;задачаоборота&#8221; мы c небольшой группой &#8220;единомышленников&#8221; решили использовать <a href="http://redmine.org">Redmine</a>. Коллеги стали замечать, что волосы у нас стали шелковистыми, одежда сияет белизной, а главное &#8211; СУХО! Ну и постепенно начали вовлекаться в процесс.<br />
Сразу же, с порога, выдвинули претензию &#8211; а почему нельзя создать задачу из письма (Слава привет!) ? Главным аргументом против магии седьмого уровня Copy-Paste было то, что им приходит множество аттачментов в письмах, которые и являются сутью поставленной задачи. Их надо сохранить на диск и лишь потом прикрепить к задаче&#8230; Неудобно, ага.</p>
<p>Сходу не смог найти необходимый функционал ни в самом redmine, ни в рабочих плагинах( использую redmine из trunk-а, с ним многие плагины или не работают вовсе или наполняют его &#8220;глюками&#8221; в самых неожиданных местах). Посему пришлось наваять оный плагин самостоятельно. Суть его работы такова:<br />
В gmail-ном ящике (да в принципе любой imap-сервер подойдёт) создаются ярлыки (папки) с названиями, соответствующими идентификаторам проектов в redmine.<br />
Rake-таск из плагина (нужно периодически запускать по <strong>cron</strong>-у) проверяет наличие писем с этими ярлыками и создаёт новые задачи, в соответствующих проектах, прикрепляя все вложения к тикету. Для защиты от всякого рода спама на всякий случай письма принимаются только от зарегистрированных пользователей. </p>
<p>На мой взгляд получилась довольно удобная схема &#8211; нужное письмо форвардируется на почтовый ящик, где ему <a href="http://mail.google.com/support/bin/answer.py?answer=6579">фильтрами Gmail-а</a> добавляется ярлык с названием нужного проекта.</p>
<p>Если вам такой функционал интересен, то вы можете <a href="http://miracle.rpz.name/shared/redmine/redmine_mail_reader.tar.gz">скачать плагин</a> себе. Установка ничем не отличается от других плагинов &#8211; распаковываем содержимое в <strong>vendor/plugins</strong>, копируем <em>config/mail_reader.yml.example</em> в <em>RAILS_ROOT/config/mail_reader.yml</em>, редактируем конфиг, рестартуем redmine, добавляем модуль в настройках проектов  и добавляем в <em>cron</em> задачу <strong>rake mailreader:check</strong></p>
<p>Для работы требуется <strong>gem tmail</strong> для корректного вытягивания имён файлов во вложениях. Да я знаю, что он (tmail) уже имеется в составе actionmailer, но я так и не сообразил как корректно его загрузить &#8211; буду рад, если кто-нибудь поможет правильно подключить этот класс.</p>
<p>Отзывы? Пожелания? Добро пожаловать в комментарии!</p>
]]></content:encoded>
			<wfw:commentRss>http://miracle.rpz.name/2009/11/07/redmine-mail-reader/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

<!-- Served from: miracle.rpz.name @ 2012-02-06 16:57:26 by W3 Total Cache -->
