<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Web applications testing and Selenium blog by Deep Shift Labs</title>
	
	<link>http://www.deepshiftlabs.com/sel_blog</link>
	<description />
	<lastBuildDate>Thu, 25 Apr 2013 05:54:59 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/deepshiftlabs/PrCF" /><feedburner:info uri="deepshiftlabs/prcf" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>В копилку виртуализатору – растим диск под Fedora на VMWare</title>
		<link>http://feedproxy.google.com/~r/deepshiftlabs/PrCF/~3/jk2jQBUdZR0/</link>
		<comments>http://www.deepshiftlabs.com/sel_blog/?p=2925&amp;lang=ru#comments</comments>
		<pubDate>Thu, 25 Apr 2013 05:54:59 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.deepshiftlabs.com/sel_blog/?p=2925</guid>
		<description><![CDATA[В данном посте я хотел бы показать как увеличить свободное место на диске на виртуальной машине Fedora по управлением VMWare. Задача, которую вам возможно понадобиться решить, если вы используете VMWare для виртуализации машин для тестирования. При установке Fedora я выделил 10GB, но позже мне пришлось работать с достаточно большими базами данных и место закончилось. View [...]]]></description>
			<content:encoded><![CDATA[<p>В данном посте я хотел бы показать как увеличить свободное место на диске на виртуальной машине Fedora по управлением VMWare. Задача, которую вам возможно понадобиться решить, если вы используете VMWare для виртуализации машин для тестирования.</p>
<p>При установке Fedora я выделил 10GB, но позже мне пришлось работать с достаточно большими базами данных и место закончилось.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2925code6'); return false;">View Code</a> SH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p29256"><td class="code" id="p2925code6"><pre class="sh" style="font-family:monospace;"># df -k
Filesystem                    1K-blocks    Used Available Use% Mounted on
devtmpfs                         498132       0    498132   0% /dev
tmpfs                            508060       0    508060   0% /dev/shm
tmpfs                            508060     772    507288   1% /run
/dev/mapper/vg_fedora-lv_root   7641992 6590912    656228  91% /
tmpfs                            508060       0    508060   0% /sys/fs/cgroup
tmpfs                            508060       0    508060   0% /media
/dev/sda1                        487652   84379    377673  19% /boot</pre></td></tr></table></div>


<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2925code7'); return false;">View Code</a> SH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p29257"><td class="code" id="p2925code7"><pre class="sh" style="font-family:monospace;"># fdisk -l
&nbsp;
Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000e3a8c
&nbsp;
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    20971519     9972736   8e  Linux LVM
&nbsp;
&nbsp;
Disk /dev/mapper/vg_fedora-lv_swap: 2113 MB, 2113929216 bytes
255 heads, 63 sectors/track, 257 cylinders, total 4128768 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
&nbsp;
&nbsp;
Disk /dev/mapper/vg_fedora-lv_root: 8086 MB, 8086618112 bytes
255 heads, 63 sectors/track, 983 cylinders, total 15794176 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes</pre></td></tr></table></div>

<p>Для увеличения файловой системы необходимо добавить дополнительный диск виртуальной машине нужного размера, как показано ниже.<br />
&nbsp;<br />
&nbsp;<br />
<img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2013/04/adding_disk_vm_vmware.png" alt="Adding a disk to existing VMWare VM" title="Adding a disk to existing VMWare VM" /><br />
&nbsp;<br />
&nbsp;<br />
Теперь мы увидим новый диск в выводе команды &#8220;fdisk -l&#8221;.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2925code8'); return false;">View Code</a> SH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p29258"><td class="code" id="p2925code8"><pre class="sh" style="font-family:monospace;">Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes</pre></td></tr></table></div>

<p>Нам остаётся создать создать раздел sdb1 использовав всё свободное место на диске с помощью &#8220;fdisk /dev/sdb&#8221;.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2925code9'); return false;">View Code</a> SH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p29259"><td class="code" id="p2925code9"><pre class="sh" style="font-family:monospace;">Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039):
Using default value 41943039
Partition 1 of type Linux and of size 20 GiB is set
&nbsp;
Command (m for help): v
Remaining 2047 unallocated 512-byte sectors
&nbsp;
Command (m for help): w
The partition table has been altered!</pre></td></tr></table></div>

<p>Теперь мы раширяем логический том и файловую систему:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2925code10'); return false;">View Code</a> SH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p292510"><td class="code" id="p2925code10"><pre class="sh" style="font-family:monospace;">pvcreate /dev/sdb1
vgextend vg_fedora /dev/sdb1
lvextend -l +100%FREE /dev/mapper/vg_fedora-lv_root
resize2fs /dev/mapper/vg_fedora-lv_root</pre></td></tr></table></div>


<img src="http://feeds.feedburner.com/~r/deepshiftlabs/PrCF/~4/jk2jQBUdZR0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.deepshiftlabs.com/sel_blog/?feed=rss2&amp;p=2925&amp;lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.deepshiftlabs.com/sel_blog/?p=2925&amp;lang=ru</feedburner:origLink></item>
		<item>
		<title>Функциональные мониторинги в Яндексе (перевод)</title>
		<link>http://feedproxy.google.com/~r/deepshiftlabs/PrCF/~3/ScbV2-qUsCE/</link>
		<comments>http://www.deepshiftlabs.com/sel_blog/?p=2886&amp;lang=ru#comments</comments>
		<pubDate>Tue, 19 Mar 2013 01:26:24 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.deepshiftlabs.com/sel_blog/?p=2886</guid>
		<description><![CDATA[Поскольку Nerrvana теперь обеспечивает возможность функционального мониторинга, нам показалось, что нашим англоязычным читателям будет интересно узнать, зачем функциональным мониторингом занимается Yandex, и зачем вообще он может понадобиться. Оригинал статьи Михаила Левина на русском языке находится на Хабре. О технических особенностях системы запуска тестов &#8211; Aqua &#8211; рассказывалось (автором этой статьи) на SeleniumCamp 2011 (видео и [...]]]></description>
			<content:encoded><![CDATA[<div style="float: left;"><img style="padding: 5px 20px 10px 0;" title="Functional monitoring at Yandex" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2013/03/functional_monitoring_Yandex.png" alt="Functional monitoring at Yandex" /></div>
<p><br />
Поскольку Nerrvana теперь обеспечивает возможность функционального мониторинга, нам показалось, что нашим англоязычным читателям будет интересно узнать, зачем функциональным мониторингом занимается Yandex, и зачем вообще он может понадобиться. Оригинал статьи <a href="http://mlevin.moikrug.ru/" target="_blank">Михаила Левина</a> на русском языке находится на <a href="http://habrahabr.ru/post/170797/" target="_blank">Хабре</a>.</p>
<p>О технических особенностях системы запуска тестов &#8211; Aqua &#8211; рассказывалось (автором этой статьи) на SeleniumCamp 2011 (<a href="http://video.yandex.ru/users/xpinjection/view/20#" target="_blank">видео</a> и <a href="http://www.slideshare.net/lev_sha/yandex-test-framework-talk-for-seleniumcamp?from=ss_embed" target="_blank">слайды</a>), о Terra &#8211; системе сбора, анализа и нотификаций &#8211; <a href="http://eroshenkoam.moikrug.ru/" target="_blank">Артёмом Ерошенко</a> на Yet Another Conference (<a href="http://events.yandex.ru/events/yac/2012/talks/360/" target="_blank">видео и слайды</a>)<br />
<span id="more-2886"></span></p>
<img src="http://feeds.feedburner.com/~r/deepshiftlabs/PrCF/~4/ScbV2-qUsCE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.deepshiftlabs.com/sel_blog/?feed=rss2&amp;p=2886&amp;lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.deepshiftlabs.com/sel_blog/?p=2886&amp;lang=ru</feedburner:origLink></item>
		<item>
		<title>Добавлены новые языки, браузеры и Selenium</title>
		<link>http://feedproxy.google.com/~r/deepshiftlabs/PrCF/~3/AhpjQg75y7k/</link>
		<comments>http://www.deepshiftlabs.com/sel_blog/?p=2867&amp;lang=ru#comments</comments>
		<pubDate>Mon, 18 Feb 2013 10:39:32 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.deepshiftlabs.com/sel_blog/?p=2867</guid>
		<description><![CDATA[Nerrvana теперь поддерживает &#8211; PHP 5.4.1 (с PHPUnit 3.6.10), Java 1.7.0, Python 2.7.3 (с nose 1.1.2, Selenium 1.0.3), Perl 5.14.2 и Ruby 1.9.3p194. Selenium обновлён до версии 2.29.0. Добавлена поддержка Firefox 18, Chrome 24, Opera 12.14 на Windows XP и Windows 7, а так же Internet Explorer 10 (только под Windows 7). Здесь &#8220;оглашён&#8221; полный [...]]]></description>
			<content:encoded><![CDATA[<p>Nerrvana теперь поддерживает &#8211; PHP 5.4.1 (с PHPUnit 3.6.10), Java 1.7.0, Python 2.7.3 (с nose 1.1.2, Selenium 1.0.3), Perl 5.14.2 и Ruby 1.9.3p194.</p>
<p>Selenium обновлён до версии 2.29.0. Добавлена поддержка Firefox 18, Chrome 24, Opera 12.14 на Windows XP и Windows 7, а так же Internet Explorer 10 (только под Windows 7).</p>
<p><a href="http://blog.nerrvana.com/wp-content/uploads/2013/02/nerrvana_update_Feb_2013.png">Здесь</a> &#8220;оглашён&#8221; полный список браузеров, поддерживаемых Nerrvana на сегодняшний день.<br />
<br />
</p>
<img src="http://feeds.feedburner.com/~r/deepshiftlabs/PrCF/~4/AhpjQg75y7k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.deepshiftlabs.com/sel_blog/?feed=rss2&amp;p=2867&amp;lang=ru</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.deepshiftlabs.com/sel_blog/?p=2867&amp;lang=ru</feedburner:origLink></item>
		<item>
		<title>Nerrvana теперь поддерживает Windows 7</title>
		<link>http://feedproxy.google.com/~r/deepshiftlabs/PrCF/~3/qAczEN9Iaxw/</link>
		<comments>http://www.deepshiftlabs.com/sel_blog/?p=2844&amp;lang=ru#comments</comments>
		<pubDate>Mon, 26 Nov 2012 23:28:58 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.deepshiftlabs.com/sel_blog/?p=2844</guid>
		<description><![CDATA[Рады сообщить o добавлении поддержки Windows 7 в Nerrvana. Полный список операционных систем и браузеров теперь выглядит вот так (скриншот UI Nerrvana): В планах &#8211; мы переехали с CentOS на Fedoru и потому линейка браузеров Linux будет раширена и обновлена. Добавится возможность запуска Selenium тестов, написанных на Python и Ruby. Затем начнем работать над добавлением [...]]]></description>
			<content:encoded><![CDATA[<p>Рады сообщить o добавлении поддержки Windows 7 в Nerrvana. Полный список операционных систем и браузеров теперь выглядит вот так (скриншот UI Nerrvana): </p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;"  src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/windows_7_selenium_nerrvana.jpg" alt="Nerrvana теперь поддерживает Windows 7" title="Nerrvana теперь поддерживает Windows 7" /></p>
<p>В планах &#8211; мы переехали с CentOS на Fedoru и потому линейка браузеров Linux будет раширена и обновлена. Добавится возможность запуска Selenium тестов, написанных на Python и Ruby. Затем начнем работать над добавлением Windows 8.<br />
<br />
</p>
<img src="http://feeds.feedburner.com/~r/deepshiftlabs/PrCF/~4/qAczEN9Iaxw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.deepshiftlabs.com/sel_blog/?feed=rss2&amp;p=2844&amp;lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.deepshiftlabs.com/sel_blog/?p=2844&amp;lang=ru</feedburner:origLink></item>
		<item>
		<title>Nerrvana в работе – заключение</title>
		<link>http://feedproxy.google.com/~r/deepshiftlabs/PrCF/~3/23sMnhPTrS4/</link>
		<comments>http://www.deepshiftlabs.com/sel_blog/?p=2628&amp;lang=ru#comments</comments>
		<pubDate>Thu, 22 Nov 2012 10:18:53 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.deepshiftlabs.com/sel_blog/?p=2628</guid>
		<description><![CDATA[Тестирование приложения с двумя базами данных &#8211; конфигурационные файлы &#8220;как есть&#8221; &#8211; дальнейшие планы Part 1 &#8211; Nerrvana в работе – как это делается у нас Part 2 &#8211; Nerrvana в работе – SVN втыкается в Jenkins Part 3 &#8211; Nerrvana в работе – сборка приложения и Jenkins (часть 1) Part 4 &#8211; Nerrvana в [...]]]></description>
			<content:encoded><![CDATA[<div style="float: left;"><img style="padding: 5px 20px 10px 0;" title="Using Nerrvana - final notes" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/final_300.png" alt="Using Nerrvana - final notes" /></div>
<p>
<p style="text-align: center;"><em>Тестирование приложения с двумя базами данных &#8211; конфигурационные файлы &#8220;как есть&#8221; &#8211; дальнейшие планы</em></p>
<p>Part 1 &#8211; <a href="http://www.deepshiftlabs.com/sel_blog/?p=2251&#038;lang=ru" target="_blank">Nerrvana в работе – как это делается у нас</a><br />
Part 2 &#8211; <a href="http://www.deepshiftlabs.com/sel_blog/?p=2253&#038;lang=ru" target="_blank">Nerrvana в работе – SVN втыкается в Jenkins</a><br />
Part 3 &#8211; <a href="http://www.deepshiftlabs.com/sel_blog/?p=2255&#038;lang=ru" target="_blank">Nerrvana в работе – сборка приложения и Jenkins (часть 1)</a><br />
Part 4 &#8211; <a href="http://www.deepshiftlabs.com/sel_blog/?p=2343&#038;lang=ru" target="_blank">Nerrvana в работе – сборка приложения и Jenkins (часть 2)</a><br />
Part 5 &#8211; <a href="http://www.deepshiftlabs.com/sel_blog/?p=2257&#038;lang=ru" target="_blank">Nerrvana в работе &#8211; настройка Jenkins для Selenium тестирования</a><br />
Part 6 &#8211; Nerrvana в работе &#8211; заключение &#8211; этот пост</p>
<p>К этому моменту мы рассказали о том, как мы тестируем свои приложения при помощи Jenkins и Nerrvana. В нашем рассказе некоторые детали были намеренно опущены, дабы не усложнять описание сути процесса.</p>
<p>Пришло время показать реальные файлы конфигурации.<br />
<span id="more-2628"></span><br />
Вот скрипт publish.sh. Как вы видите, в нём не одна секция, как было показано ранее, а две. Одна занимается распаковкой и настройкой на deployment-хосте приложения Answers для работы с MySQL, а другая &#8211; с PostgreSQL.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code25'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262825"><td class="code" id="p2628code25"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
&nbsp;
<span style="color: #007800;">WWW_MYSQL_DIR</span>=<span style="color: #ff0000;">'/var/www/answers/answers_mysql'</span>
<span style="color: #007800;">WWW_PGSQL_DIR</span>=<span style="color: #ff0000;">'/var/www/answers/answers_postgres'</span>
<span style="color: #007800;">DB_NAME</span>=<span style="color: #ff0000;">'answers'</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-Rf</span> <span style="color: #007800;">$WWW_PGSQL_DIR</span><span style="color: #000000; font-weight: bold;">/*</span>
<span style="color: #c20cb9; font-weight: bold;">unzip</span> <span style="color: #660033;">-o</span> prj.zip <span style="color: #660033;">-d</span> <span style="color: #007800;">$WWW_PGSQL_DIR</span>
<span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #007800;">$WWW_PGSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>Settings.class.php.pgsql <span style="color: #007800;">$WWW_PGSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>Settings.class.php
<span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #660033;">-R</span> <span style="color: #000000;">777</span> <span style="color: #007800;">$WWW_PGSQL_DIR</span>
psql <span style="color: #660033;">-U</span> postgres <span style="color: #660033;">-f</span> <span style="color: #007800;">$WWW_PGSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">install</span><span style="color: #000000; font-weight: bold;">/</span>crt-pgsql.sql
psql <span style="color: #660033;">-U</span> postgres <span style="color: #660033;">-f</span> <span style="color: #007800;">$WWW_PGSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">install</span><span style="color: #000000; font-weight: bold;">/</span>postgres.sql <span style="color: #007800;">$DB_NAME</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-Rf</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/*</span>
<span style="color: #c20cb9; font-weight: bold;">unzip</span> <span style="color: #660033;">-o</span> prj.zip <span style="color: #660033;">-d</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span>
<span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>Settings.class.php.mysql <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>Settings.class.php
<span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #660033;">-R</span> <span style="color: #000000;">777</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span>
mysql <span style="color: #660033;">-v</span> <span style="color: #660033;">-u</span> root  <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">install</span><span style="color: #000000; font-weight: bold;">/</span>crt-mysql.sql
mysql <span style="color: #660033;">-v</span> <span style="color: #660033;">-u</span> root  <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">install</span><span style="color: #000000; font-weight: bold;">/</span>mysql.sql <span style="color: #007800;">$DB_NAME</span></pre></td></tr></table></div>

<p>Вот как выглядит наш build.xml. Фактически то же самое, что и показывали ранее, но добавились аналогичные MySQL действия для PostgreSQL (строки 13-14, 22-23 и 35-36).</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code26'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262826"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
</pre></td><td class="code" id="p2628code26"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;project</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;${env.JOB_NAME}&quot;</span> <span style="color: #000066;">default</span>=<span style="color: #ff0000;">&quot;build&quot;</span> <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;.&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">environment</span>=<span style="color: #ff0000;">&quot;env&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;tests&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/tests&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;ci&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/ci&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;code&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/code&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;make_settings&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;sed&quot;</span> <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${code}/config/Settings.class.php.mysql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> </span>
<span style="color: #009900;">            <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;-f ${ci}/deployment/config/mysql/settings-mysql.sed ${code}/config/Settings.class.template.php&quot;</span></span>
<span style="color: #009900;">        <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;sed&quot;</span> <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${code}/config/Settings.class.php.pgsql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> </span>
<span style="color: #009900;">            <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;-f ${ci}/deployment/config/pgsql/settings-pgsql.sed ${code}/config/Settings.class.template.php&quot;</span></span>
<span style="color: #009900;">        <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;make_sql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;sed&quot;</span> <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${code}/install/mysql.sql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> </span>
<span style="color: #009900;">           <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;-f ${ci}/deployment/config/mysql/install-mysql.sed ${code}/install/mysql.sql&quot;</span></span>
<span style="color: #009900;">      <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;sed&quot;</span> <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${code}/install/postgres.sql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span></span>
<span style="color: #009900;">          <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;-f ${ci}/deployment/config/pgsql/install-pgsql.sed ${code}/install/postgres.sql&quot;</span> </span>
<span style="color: #009900;">      <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;move_files&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;make_settings,make_sql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #808080; font-style: italic;">&lt;!-- Move authentication files to WAUT root --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/misc/login.php&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${code}/login.php&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/misc/logout.php&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${code}/logout.php&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
    <span style="color: #808080; font-style: italic;">&lt;!-- Move MySQL db creation files to install folder --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span></span>
<span style="color: #009900;">         <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/config/mysql/crt-mysql.sql&quot;</span></span>
<span style="color: #009900;">         <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${code}/install/crt-mysql.sql&quot;</span></span>
<span style="color: #009900;">    <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
    <span style="color: #808080; font-style: italic;">&lt;!-- Move PGSQL db creation files to install folder --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> </span>
<span style="color: #009900;">         <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/config/pgsql/crt-pgsql.sql&quot;</span> </span>
<span style="color: #009900;">         <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${code}/install/crt-pgsql.sql&quot;</span> </span>
<span style="color: #009900;">    <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
    <span style="color: #808080; font-style: italic;">&lt;!-- Move publish script to the workspace root, so it will be beside prj.zip --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> </span>
<span style="color: #009900;">         <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/publish-over-ssh/publish.sh&quot;</span></span>
<span style="color: #009900;">         <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/publish.sh&quot;</span></span>
<span style="color: #009900;">    <span style="color: #000000; font-weight: bold;">/&gt;</span></span> 
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;save_commit_info&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;move_files&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #808080; font-style: italic;">&lt;!-- Temp fix for SVN client and SVN plugin incompatibility --&gt;</span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}&quot;</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;svn&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> </span>
<span style="color: #009900;">              <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;--username jenkins --password 123456 upgrade&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}&quot;</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;svn&quot;</span>  <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/version.txt&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>  
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;--username jenkins --password 123456 log -r ${env.SVN_REVISION}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}&quot;</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;svn&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>  
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;--username jenkins --password 123456 log -r ${env.SVN_REVISION}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>          
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>	
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;svn&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;save_commit_info&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;java</span></span>
<span style="color: #009900;">           <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;.&quot;</span></span>
<span style="color: #009900;">           <span style="color: #000066;">jar</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/scm-decorator.jar&quot;</span></span>
<span style="color: #009900;">           <span style="color: #000066;">fork</span>=<span style="color: #ff0000;">&quot;true&quot;</span></span>
<span style="color: #009900;">           <span style="color: #000066;">failonerror</span>=<span style="color: #ff0000;">&quot;true&quot;</span></span>
<span style="color: #009900;">      <span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;svn&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/version.txt&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span> 
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/java<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>    	
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;zip&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;svn&quot;</span> <span style="color: #000066;">description</span>=<span style="color: #ff0000;">&quot;Compress project files&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jar</span> <span style="color: #000066;">destfile</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/prj.zip&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/code&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">excludes</span>=<span style="color: #ff0000;">&quot;.svn&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;build&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;zip&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/project<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>На конфигурационной странице плагина Nerrvana добавлен ещё один build шаг. То есть сначала тестируем приложение под MySQL, а потом &#8211; под PostgreSQL. Чем отличаются настройки этих шагов build-а?</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;"  src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/two_nerrvana_steps.png" /></p>
<p><strong>Во-первых</strong>, они используют разные имена для создания Test Run-ов и разные исполняемые файлы.</p>
<p><a href="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/comp_1.png" target="_blank"><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/comp_1_690.png" /></a></p>
<p>С именами всё понятно &#8211; они должны отличаться. Вот как выглядят результаты тестирования после запуска build-a, когда приложение тестировалось с двойным вызовом плагина Nerrvana. Сразу понятно, что есть что.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/in_ui.jpg" /></p>
<p>Я не говорил о том, куда же стучатся тесты. URL прописан непосредственно в build-файле Ant уже самих тестов. Мы просто не касались этой темы. Есть два build.xml, и в каждом из них прописан URL на соответствующий виртуальный хост для Answers, работающих с MySQL и с PostgreSQL соответственно.</p>
<p>То есть, например, xbuild-mysql.sh используется для запуска тестов приложения, работающего с MySQL.  Его содержимое:</p>
<p><code>ant -f build-mysql.xml all  > build.log 2 >&#038; 1</code></p>
<p>build-mysql.xml в свою очередь внутри себя делает:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code27'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262827"><td class="code" id="p2628code27"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;copy</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${resources}/config-mysql.xml&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${output}/config.xml&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></td></tr></table></div>

<p>А вот уже в файле config-mysql.xml мы увидим и какие тесты запустятся, и какой URL будет использоваться.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code28'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262828"><td class="code" id="p2628code28"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;properties<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;entry</span> <span style="color: #000066;">key</span>=<span style="color: #ff0000;">&quot;suite-title&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Answers Test Suite<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/entry<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;entry</span> <span style="color: #000066;">key</span>=<span style="color: #ff0000;">&quot;tests-disabled&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        com.deepshiftlabs.testui.AnswersStartyCo. TestLogin,
        com.deepshiftlabs.testui.AnswersStartyCo.TestAddRemoveQuestionByAnonymous,
        com.deepshiftlabs.testui.AnswersStartyCo.TestAddRemoveQuestionByUser,
        com.deepshiftlabs.testui.AnswersStartyCo.TestSearch,
        com.deepshiftlabs.testui.AnswersStartyCo.TestReply,
        com.deepshiftlabs.testui.AnswersStartyCo.TestFilterSort,
        com.deepshiftlabs.testui.AnswersStartyCo.TestTags,
        com.deepshiftlabs.testui.AnswersStartyCo.TestSmoke,
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/entry<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;entry</span> <span style="color: #000066;">key</span>=<span style="color: #ff0000;">&quot;website&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>http://answers.dslabs.lan/mysql<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/entry<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Видно, что сейчас отключены все тесты кроме TestLogin.</p>
<p><strong>Во-вторых</strong>, в первом вызове плагина мы синхронизируем тесты с Nerrvana, а во втором уже нет, так как это один и тот же код. Это экономит нам время. Ещё вы видите, что в первом шаге, тестирующем MySQL, отключен анализ сообщений, а во втором &#8211; наоборот, включен. Таким образом, мы даём тестам закончиться на обоих хостах и только потом анализируем сообщения.</p>
<p><a href="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/comp_2.jpg" target="_blank"><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/comp_2_690.jpg" /></a></p>
<p>Отчёт, подготовленный плагином на основе анализа сообщений, составлен с учётом того, что плагин был запущен два раза и содержит две секции.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/report.jpg" /></p>
<p>Наконец, под спойлером вы найдёте пример консольного лога такого двойного выполнения (я немного подсократил серединки выводов некоторых команд)</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code29'); return false;">View Code</a> TXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262829"><td class="code" id="p2628code29"><pre class="txt" style="font-family:monospace;">Started by an SCM change
Building in workspace /var/lib/jenkins/jobs/Answers/workspace
Cleaning local Directory .
Checking out http://192.168.3.97/repos/answers/trunk at revision 146
A         tests
----------- SOME LINES REMOVED ---------------------------------
A         ci/toolchain/build-toolchain.xml
At revision 146
[deployment] $ ant -file build.xml build
Buildfile: build.xml
&nbsp;
make_settings:
&nbsp;
make_sql:
&nbsp;
move_files:
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers/workspace/code
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers/workspace/code
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers/workspace/code/install
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers/workspace/code/install
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers/workspace
&nbsp;
save_commit_info:
     [exec] Upgraded '.'
----------- SOME LINES REMOVED ---------------------------------
     [exec] Upgraded 'ci/deployment/misc'
     [exec] Upgraded 'ci/toolchain'
     [exec] ------------------------------------------------------------------------
     [exec] r146 | igork | 2012-11-14 08:22:44 +0000 (Wed, 14 Nov 2012) | 1 line
     [exec] 
     [exec] &quot;Fixed&quot; robots.txt to initiate Jenkins build
     [exec] ------------------------------------------------------------------------
&nbsp;
svn:
&nbsp;
zip:
      [jar] Building jar: /var/lib/jenkins/jobs/Answers/workspace/prj.zip
&nbsp;
build:
&nbsp;
BUILD SUCCESSFUL
Total time: 0 seconds
SSH: Connecting from host [phpbb.deepshiftlabs.com]
SSH: Connecting with configuration [Answers test server] ...
SSH: EXEC: STDOUT/STDERR from command [chmod +x publish.sh
./publish.sh] ...
Archive:  prj.zip
   creating: /var/www/answers/answers_postgres/META-INF/
  inflating: /var/www/answers/answers_postgres/META-INF/MANIFEST.MF  
   creating: /var/www/answers/answers_postgres/config/
   creating: /var/www/answers/answers_postgres/include/
----------- SOME LINES REMOVED ---------------------------------
   creating: /var/www/answers/answers_postgres/utils/
  inflating: /var/www/answers/answers_postgres/ask.php  
----------- SOME LINES REMOVED ---------------------------------
  inflating: /var/www/answers/answers_postgres/utils/DBUtils.class.php  
  inflating: /var/www/answers/answers_postgres/utils/Utils.class.php  
  inflating: /var/www/answers/answers_postgres/utils/init.php  
DROP DATABASE
CREATE DATABASE
REVOKE
DROP ROLE
You are now connected to database &quot;answers&quot;.
psql:/var/www/answers/answers_postgres/install/crt-pgsql.sql:7: NOTICE:  table &quot;USERS_SOURCE_TABLE&quot; does not exist, skipping
DROP TABLE
psql:/var/www/answers/answers_postgres/install/crt-pgsql.sql:17: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index &quot;users_source_table_pkey&quot; for table &quot;users_source_table&quot;
CREATE TABLE
INSERT 0 1
INSERT 0 1
----------- SOME LINES REMOVED ---------------------------------
GRANT
Archive:  prj.zip
   creating: /var/www/answers/answers_mysql/META-INF/
  inflating: /var/www/answers/answers_mysql/META-INF/MANIFEST.MF  
   creating: /var/www/answers/answers_mysql/config/
   creating: /var/www/answers/answers_mysql/include/
----------- SOME LINES REMOVED ---------------------------------
   creating: /var/www/answers/answers_mysql/utils/
  inflating: /var/www/answers/answers_mysql/ask.php  
----------- SOME LINES REMOVED ---------------------------------
  inflating: /var/www/answers/answers_mysql/utils/DBUtils.class.php  
  inflating: /var/www/answers/answers_mysql/utils/Utils.class.php  
  inflating: /var/www/answers/answers_mysql/utils/init.php  
--------------
drop database answers
--------------
&nbsp;
--------------
create database answers
--------------
&nbsp;
--------------
DROP TABLE if exists USERS_SOURCE_TABLE
--------------
&nbsp;
--------------
CREATE TABLE `USERS_SOURCE_TABLE` (
  USERS_ID_COLUMN int(11),
  username varchar(50),
  USERS_DISPLAY_NAME_COLUMN varchar(50),
  USERS_EMAIL_COLUMN varchar(50),
  CONSTRAINT USERS_SOURCE_TABLE_pkey PRIMARY KEY (USERS_ID_COLUMN)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
--------------
&nbsp;
----------- SOME LINES REMOVED ---------------------------------
&nbsp;
--------------
CREATE VIEW `USERS_VIEW_NAME` AS
  SELECT
    `USERS_ID_COLUMN` AS `USERS_ID_COLUMN`,
    `USERS_DISPLAY_NAME_COLUMN` AS `USERS_DISPLAY_NAME_COLUMN`,
    `USERS_EMAIL_COLUMN` AS `USERS_EMAIL_COLUMN`
  FROM
    `USERS_SOURCE_TABLE`
--------------
&nbsp;
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_users TO 'ANSWERS_DB_USER'@localhost
--------------
&nbsp;
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_answers TO 'ANSWERS_DB_USER'@localhost
--------------
&nbsp;
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_questions TO 'ANSWERS_DB_USER'@localhost
--------------
&nbsp;
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_tags TO 'ANSWERS_DB_USER'@localhost
--------------
&nbsp;
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_tags_to_quest TO 'ANSWERS_DB_USER'@localhost
--------------
&nbsp;
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_subscribers TO 'ANSWERS_DB_USER'@localhost
--------------
&nbsp;
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_votes_a TO 'ANSWERS_DB_USER'@localhost
--------------
&nbsp;
--------------
GRANT SELECT ON USERS_VIEW_NAME TO 'ANSWERS_DB_USER'@localhost
--------------
&nbsp;
SSH: EXEC: completed after 1,003 ms
SSH: Disconnecting configuration [Answers test server] ...
SSH: Transferred 2 file(s)
Build step 'Send files or execute commands over SSH' changed build result to SUCCESS
2012-11-14 08:22:49 
&nbsp;
---BEGIN PLUGIN EXECUTION---
2012-11-14 08:22:49 ---INITIALIZATION STARTED---
2012-11-14 08:22:49 
---BEGIN PLUGIN SETTINGS---
	Nerrvana HTTP address: https://api.nerrvana.com
	Nerrvana API key: 2bf7c81-a031f-1ad2-fd3a6-f59b9e0668e
	Secret key:  wctfFwelygx3tXS4TasrsOS4oXV7YadcPppvEnx55WG7qPk6jrAHjJi1TRoLlhrarIlabte4H9zWROXVkLnXto2LlVC47EXx91Uu
	Space ID: 4144
	Space: Answers
	Space path[FTPS folder]: Answers/_files
	Selenium nodes per platform: 1
	Test run name: Answers TRUNK MySQL
	Nerrvana platforms:
		Opera 12.02 (WinXP)
		Firefox 15.0 (WinXP)
	Executable file: xbuild-mysql.sh
	Nerrvana FTPS address: ftp.nerrvana.com
	Nerrvana FTPS user: demo154
	Nerrvana FTPS pass: dem0l54
	Workspace folder: ./tests
	Max execution time: 3600
	Poll period: 20
	Parse user messages mode[results analyzer]: OFF
-----END PLUGIN SETTINGS---
2012-11-14 08:22:49 -----INITIALIZATION COMPLETED---
&nbsp;
2012-11-14 08:22:49 Generated test run name: Answers TRUNK MySQL build #55
2012-11-14 08:22:49 Generated test run description:
Created by Nerrvana-Jenkins plugin
Revision: 146
Committer: igork
Date: 2012-11-14 08:22:44 +0000 (Wed, 14 Nov 2012)
&quot;Fixed&quot; robots.txt to initiate Jenkins build
&nbsp;
2012-11-14 08:22:49 ---BEGIN UPLOADING TESTS TO NERRVANA FTPS---
[workspace] $ lftp -f upload-build-55-1352863447229969289.ftp
2012-11-14 08:23:22 -----END UPLOADING TESTS TO NERRVANA FTPS
&nbsp;
2012-11-14 08:23:25 Creating and starting test run via Nerrvana HTTP API call...done.
2012-11-14 08:23:25 New test run ID#952.
2012-11-14 08:23:25 New execution ID#5769.
2012-11-14 08:23:25 ---BEGIN NERRVANA POLLING CYCLE (waiting for tests to complete)
2012-11-14 08:23:47 	Current execution status: run
&nbsp;
2012-11-14 08:24:09 	Current execution status: run
&nbsp;
----------- SOME LINES REMOVED ---------------------------------
&nbsp;
2012-11-14 08:26:42 	Current execution status: run
&nbsp;
2012-11-14 08:27:04 	Current execution status: ok
&nbsp;
2012-11-14 08:27:04 -----END NERRVANA POLLING CYCLE---
2012-11-14 08:27:04 Saving execution results into /var/lib/jenkins/jobs/Answers/builds/2012-11-14_08-22-45/results.xml...
2012-11-14 08:27:04 Done.
2012-11-14 08:27:04 
-----END PLUGIN EXECUTION---
&nbsp;
&nbsp;
2012-11-14 08:27:04 
&nbsp;
---BEGIN PLUGIN EXECUTION---
2012-11-14 08:27:04 ---INITIALIZATION STARTED---
2012-11-14 08:27:04 
---BEGIN PLUGIN SETTINGS---
	Nerrvana HTTP address: https://api.nerrvana.com
	Nerrvana API key: 2bf7c81-a031f-1ad2-fd3a6-f59b9e0668e
	Secret key:  wctfFwelygx3tXS4TasrsOS4oXV7YadcPppvEnx55WG7qPk6jrAHjJi1TRoLlhrarIlabte4H9zWROXVkLnXto2LlVC47EXx91Uu
	Space ID: 4144
	Space: Answers
	Space path[FTPS folder]: Answers/_files
	Selenium nodes per platform: 1
	Test run name: Answers TRUNK PostgreSQL
	Nerrvana platforms:
		Opera 12.02 (WinXP)
		Firefox 15.0 (WinXP)
	Executable file: xbuild-pgsql.sh
	Nerrvana FTPS address: ftp.nerrvana.com
	Nerrvana FTPS user: demo154
	Nerrvana FTPS pass: dem0l54
	Workspace folder: ./tests
	Max execution time: 3600
	Poll period: 20
	Parse user messages mode[results analyzer]: ON
	User message threshold: ERROR
-----END PLUGIN SETTINGS---
2012-11-14 08:27:04 -----INITIALIZATION COMPLETED---
&nbsp;
2012-11-14 08:27:04 Generated test run name: Answers TRUNK PostgreSQL build #55
2012-11-14 08:27:04 Generated test run description:
Created by Nerrvana-Jenkins plugin
Revision: 146
Committer: igork
Date: 2012-11-14 08:22:44 +0000 (Wed, 14 Nov 2012)
&quot;Fixed&quot; robots.txt to initiate Jenkins build
&nbsp;
2012-11-14 08:27:04 ---TESTS UPLOAD SKIPPED---
2012-11-14 08:27:06 Creating and starting test run via Nerrvana HTTP API call...done.
2012-11-14 08:27:06 New test run ID#953.
2012-11-14 08:27:06 New execution ID#5770.
2012-11-14 08:27:06 ---BEGIN NERRVANA POLLING CYCLE (waiting for tests to complete)
2012-11-14 08:27:28 	Current execution status: run
&nbsp;
2012-11-14 08:27:49 	Current execution status: run
&nbsp;
----------- SOME LINES REMOVED ---------------------------------
&nbsp;
2012-11-14 08:30:03 	Current execution status: run
&nbsp;
2012-11-14 08:30:26 	Current execution status: ok
&nbsp;
2012-11-14 08:30:26 -----END NERRVANA POLLING CYCLE---
2012-11-14 08:30:26 Saving execution results into /var/lib/jenkins/jobs/Answers/builds/2012-11-14_08-22-45/results.xml...
2012-11-14 08:30:26 Done.
2012-11-14 08:30:26 ---BEGIN TEST EXECUTION RESULTS---
2012-11-14 08:30:26 At least 11 message(s) from Nerrvana side reach(es) or exceed(s) threshold level (ERROR).
Message analyzer marks execution as failure.
2012-11-14 08:30:26 -----END TEST EXECUTION RESULTS---
2012-11-14 08:30:26 
-----END PLUGIN EXECUTION---
&nbsp;
&nbsp;
Build step 'Nerrvana plug-in' marked build as failure
Finished: FAILURE</pre></td></tr></table></div>

<p>Как вы видите, непосредственно процесс Selenium-тестирования занял 8 минут (начало 08:22:49, конец 08:30:26). Всё, что происходит до него &#8211; deployment, занимает всего несколько секунд. В данном случае использовалось 2 платформы Nerrvana, но тестировались последовательно Answers с MySQL и с PostgreSQL.</p>
<p>Всего у нас 8 тестов при этом каждый выполняет много действий, но тестирует свой функционал приложения &#8211; поиск, работа с тегами, добавление вопросов и ответов, удаление и редактирование вопросов и ответов авторами, модераторами и администраторами итд. Мы можем запускать тесты в 4 потока по 2 теста в потоке. Распараллелив в 4 потока и добавив ещё 4 платформы, мы остаёмся примерно в рамках тех же 8 минут. Распараллелив в 8 потоков (по одному тесту на поток), мы можем добавить больше платформ или уменьшить время тестирования. </p>
<p>Давайте посмотрим детальнее, как распределились эти 8 минут в логах, которые я привёл.</p>
<p>Инициализация и генерация имени первого Test Run-a &#8211; 1 секунда</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code30'); return false;">View Code</a> TXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262830"><td class="code" id="p2628code30"><pre class="txt" style="font-family:monospace;">2012-11-14 08:22:49 ---INITIALIZATION STARTED---
----------- SOME LINES REMOVED ---------------------------------
2012-11-14 08:22:49 -----INITIALIZATION COMPLETED---
2012-11-14 08:22:49 Generated test run name: Answers TRUNK MySQL build #55
2012-11-14 08:22:49 Generated test run description:
Created by Nerrvana-Jenkins plugin
Revision: 146
Committer: igork
Date: 2012-11-14 08:22:44 +0000 (Wed, 14 Nov 2012)
&quot;Fixed&quot; robots.txt to initiate Jenkins build</pre></td></tr></table></div>

<p>Синхронизация &#8211; 33 секунды</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code31'); return false;">View Code</a> TXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262831"><td class="code" id="p2628code31"><pre class="txt" style="font-family:monospace;">2012-11-14 08:22:49 ---BEGIN UPLOADING TESTS TO NERRVANA FTPS---
[workspace] $ lftp -f upload-build-55-1352863447229969289.ftp
2012-11-14 08:23:22 -----END UPLOADING TESTS TO NERRVANA FTPS</pre></td></tr></table></div>

<p>Создание Test Runa-a в Nerrvana и запуск из API &#8211; 3 секунды.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code32'); return false;">View Code</a> TXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262832"><td class="code" id="p2628code32"><pre class="txt" style="font-family:monospace;">2012-11-14 08:23:25 Creating and starting test run via Nerrvana HTTP API call...done.
2012-11-14 08:23:25 New test run ID#952.
2012-11-14 08:23:25 New execution ID#5769.</pre></td></tr></table></div>

<p>Выполнение тестов &#8211; 3 минуты 39 секунд</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code33'); return false;">View Code</a> TXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262833"><td class="code" id="p2628code33"><pre class="txt" style="font-family:monospace;">2012-11-14 08:23:25 ---BEGIN NERRVANA POLLING CYCLE (waiting for tests to complete)
2012-11-14 08:23:47 	Current execution status: run
----------- SOME LINES REMOVED ---------------------------------
2012-11-14 08:27:04 	Current execution status: ok
2012-11-14 08:27:04 -----END NERRVANA POLLING CYCLE---
2012-11-14 08:27:04 Saving execution results into /var/lib/jenkins/jobs/Answers/builds/2012-11-14_08-22-45/results.xml...
2012-11-14 08:27:04 Done.
2012-11-14 08:27:04 
-----END PLUGIN EXECUTION---</pre></td></tr></table></div>

<p>Второй вызов плагина.</p>
<p>Инициализация и генерация имени второго Test Run-a &#8211; 1 секунда</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code34'); return false;">View Code</a> TXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262834"><td class="code" id="p2628code34"><pre class="txt" style="font-family:monospace;">---BEGIN PLUGIN EXECUTION---
2012-11-14 08:27:04 ---INITIALIZATION STARTED---
2012-11-14 08:27:04 
2012-11-14 08:27:04 -----INITIALIZATION COMPLETED---
2012-11-14 08:27:04 Generated test run name: Answers TRUNK PostgreSQL build #55
2012-11-14 08:27:04 Generated test run description:
Created by Nerrvana-Jenkins plugin
Revision: 146
Committer: igork
Date: 2012-11-14 08:22:44 +0000 (Wed, 14 Nov 2012)
&quot;Fixed&quot; robots.txt to initiate Jenkins build</pre></td></tr></table></div>

<p>Уже не синхронизируем.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code35'); return false;">View Code</a> TXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262835"><td class="code" id="p2628code35"><pre class="txt" style="font-family:monospace;">2012-11-14 08:27:04 ---TESTS UPLOAD SKIPPED---</pre></td></tr></table></div>

<p>Создание Test Run-a в Nerrvana и запуск из API &#8211; 2 секунды</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code36'); return false;">View Code</a> TXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262836"><td class="code" id="p2628code36"><pre class="txt" style="font-family:monospace;">2012-11-14 08:27:06 Creating and starting test run via Nerrvana HTTP API call...done.
2012-11-14 08:27:06 New test run ID#953.
2012-11-14 08:27:06 New execution ID#5770.</pre></td></tr></table></div>

<p>Выполнение тестов &#8211; 3 минуты 20 секунд</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code37'); return false;">View Code</a> TXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262837"><td class="code" id="p2628code37"><pre class="txt" style="font-family:monospace;">2012-11-14 08:27:06 ---BEGIN NERRVANA POLLING CYCLE (waiting for tests to complete)
2012-11-14 08:27:28 	Current execution status: run
----------- SOME LINES REMOVED ---------------------------------
2012-11-14 08:30:26 	Current execution status: ok
2012-11-14 08:30:26 -----END NERRVANA POLLING CYCLE---</pre></td></tr></table></div>

<p>Анализ результатов и подготовка отчёта &#8211; 1 секунда</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2628code38'); return false;">View Code</a> TXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p262838"><td class="code" id="p2628code38"><pre class="txt" style="font-family:monospace;">2012-11-14 08:30:26 Saving execution results into /var/lib/jenkins/jobs/Answers/builds/2012-11-14_08-22-45/results.xml...
2012-11-14 08:30:26 Done.
2012-11-14 08:30:26 ---BEGIN TEST EXECUTION RESULTS---
2012-11-14 08:30:26 At least 11 message(s) from Nerrvana side reach(es) or exceed(s) threshold level (ERROR).
Message analyzer marks execution as failure.
2012-11-14 08:30:26 -----END TEST EXECUTION RESULTS---
2012-11-14 08:30:26</pre></td></tr></table></div>

<p>Таким образом, мы видим, что основное время &#8211; это работа тестов. Всё остальное, включая синхронизацию тестов между Jenkins и Nerrvana (помните, что LFTP обновляет только изменившийся код тестов) занимает суммарно несколько секунд. Данные цифры приведены для конфигурации приведенной мной в самом <a href="http://www.deepshiftlabs.com/sel_blog/?p=2251&#038;lang=ru">первом посте</a> &#8211; deployment и jenkins хосты находятся в домашней сети на виртуалках, я подключён к интернету по ADSL2+, нахожусь в Сиднее, Nerrvana &#8211; в Техасе. Никаких супер-скоростей или близости расположения.</p>
<p>Каким образом можно сократить выполнение тестов в 2 раза в нашем случае?</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/c1.png" /></p>
<p>Мы можем просто тестировать наше приложение на MySQL и PostgreSQL не последовательно, а параллельно. Но в этом случае, как показано на картинке ниже, у нас на Jenkins Dashboard будет не один job, а три (один upstream и два downstream)</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/c2.png" /></p>
<p>или четыре (два upstream и два downstream).</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/c3.png" /></p>
<p>К тому же отчет, создаваемый плагином Nerrvana и показанный на <a href="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/report.jpg" target="_blank">картинке выше</a>, будет находиться внутри двух разных jobs, что усложнит и замедлит просмотр. Ещё одной закавыкой будет являться синхронизация тестов. Поскольку два плагина Nerrvana будут выполняться параллельно, они будут оба вынуждены делать синхронизацию. Это добавит 33 секунды, но сократит время тестирования почти в 2 раза. То есть получим общее время где-то 4.5 минуты. </p>
<p>В общем, пока мы запускаем тесты параллельно в одном job-e, как вы уже наверное догадались. Хотя с агрегацией отчётов (об этом далее) возможно, перейдём и к параллельному тестированию приложений, работающих с разными базами данных &#8211; ожидается добавление поддержки MS SQL (гулять так гулять). В этом случае можно будет забыть о кратком отчёте плагина Nerrvana в Jenkins, а использовать единый агрегированный отчёт.</p>
<p>Основное неудобство сейчас &#8211; это необходимость просматривать столько отчётов, на скольких платформах тестировали приложение. Краткие отчёты плагина Nerrvana не в счёт, так как тут у нас единый отчёт, но краткий. Иногда его достаточно, а иногда нет. Потому мы переделаем наш открытый фреймворк на генерацию результатов в XML формате. Эту информацию будет забирать Jenkins, и далее мы сделаем генератор/агрегатор отчётов. Как будут выглядеть такие отчеты, мы <a href="http://www.deepshiftlabs.com/sel_blog/?p=1840&#038;lang=ru" target="_blank">описали ранее</a>. О деталях реализации расскажем, когда до неё доберёмся. </p>
<p>Схематически это будет работать так:</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/c4.png" /></p>
<p>Если вам не нужно тестировать разные установки, вы по прежнему сможете делать всё это в рамках одного build-а, добавив шаг агрегирования после Selenium тестирования.  </p>
<p>Ну и последнее что хотелось бы сделать так это получать логи веб-сервера и лог ошибок PHP (или того инструмента, на котором работает тестируемое вами приложение) и внедрить их в наши Selenium отчёты. Тогда было бы удобно как переходить от ошибок в логах к месту в Selenium отчёте, так и наоборот.</p>
<p>На этом мы заканчиваем рассказ о Selenium-тестировании веб-приложений в Deep Shift Labs с помошью Jenkins и Nerrvana. Надеемся, что вы нашли его полезным для себя.</p>
<p>Далее в блоге рассказ об экспорте результатов Selenium-тестирования в <a href="http://ru.wikipedia.org/wiki/HP_Quality_Center" target="_blank">HP Quality Center</a> (HP QC) с помощью веб-сервиса <a href="http://www.agiletestware.com/bumblebee-features/" target="_blank">Bumblebee</a> от <a href="http://www.agiletestware.com/" target="_blank">Agiletestware</a>.</p>
<img src="http://feeds.feedburner.com/~r/deepshiftlabs/PrCF/~4/23sMnhPTrS4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.deepshiftlabs.com/sel_blog/?feed=rss2&amp;p=2628&amp;lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.deepshiftlabs.com/sel_blog/?p=2628&amp;lang=ru</feedburner:origLink></item>
		<item>
		<title>Nerrvana в работе – настройка Jenkins для Selenium тестирования</title>
		<link>http://feedproxy.google.com/~r/deepshiftlabs/PrCF/~3/rtXLCIoKGE8/</link>
		<comments>http://www.deepshiftlabs.com/sel_blog/?p=2257&amp;lang=ru#comments</comments>
		<pubDate>Fri, 16 Nov 2012 01:26:54 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.deepshiftlabs.com/sel_blog/?p=2257</guid>
		<description><![CDATA[Создание и настройка конфигурационного файла для плагина Nerrvana &#8211; запуск тестов &#8211; просмотр результатов тестирования Part 1 &#8211; Nerrvana в работе – как это делается у нас Part 2 &#8211; Nerrvana в работе – SVN втыкается в Jenkins Part 3 &#8211; Nerrvana в работе – сборка приложения и Jenkins (часть 1) Part 4 &#8211; Nerrvana [...]]]></description>
			<content:encoded><![CDATA[<div style="float: left;"><img style="padding: 5px 20px 10px 0;" title="Using Nerrvana - Jenkins setup for Selenium testing" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/08/testing_300.png" alt="Using Nerrvana - Jenkins setup for Selenium testing" /></div>
<p>
<p style="text-align: center;"><em>Создание и настройка конфигурационного файла для плагина Nerrvana &#8211; запуск тестов &#8211; просмотр результатов тестирования<br />
</em></p>
<p>Part 1 &#8211; <a href="http://www.deepshiftlabs.com/sel_blog/?p=2251&#038;lang=ru" target="_blank">Nerrvana в работе – как это делается у нас</a><br />
Part 2 &#8211; <a href="http://www.deepshiftlabs.com/sel_blog/?p=2253&#038;lang=ru" target="_blank">Nerrvana в работе – SVN втыкается в Jenkins</a><br />
Part 3 &#8211; <a href="http://www.deepshiftlabs.com/sel_blog/?p=2255&#038;lang=ru" target="_blank">Nerrvana в работе – сборка приложения и Jenkins (часть 1)</a><br />
Part 4 &#8211; <a href="http://www.deepshiftlabs.com/sel_blog/?p=2343&#038;lang=ru" target="_blank">Nerrvana в работе – сборка приложения и Jenkins (часть 2)</a><br />
Part 5 &#8211; Nerrvana в работе &#8211; настройка Jenkins для Selenium тестирования &#8211; этот пост</p>
<p>В <a href="http://www.deepshiftlabs.com/sel_blog/?p=2343&#038;lang=ru">предыдущем посте</a> мы автоматизировали процесс установки нашего приложения для тестирования. Сейчас Jenkins умеет реагировать на коммит, подготавливать и устанавливать наше приложение на deployment хосте. Мы также извлекли информацию о вновь закоммиченной ревизии приложения и сохранили её в файл version.txt.</p>
<p>Сегодня мы запустим тесты Selenium в Nerrvana с помощью плагина Jenkins. Плагин Nerrvana доступен на вкладке http://your_jenkins_instance/pluginManager/available. Не забудьте установить LFTP (yum install lftp) на том же сервере, где запущен Jenkins, так как он используется плагином для синхронизации тестов перед их запуском.<br />
<span id="more-2257"></span><br />
Рекомендуется запустить тесты из Nerrvana UI и проверить, что они выполняются без ошибок by Nerrvana. Процесс запуска тестов вручную описан на странице &#8216;<a href="http://www.nerrvana.com/docs/test-runs" target="_blank">Get Started</a>&#8216;.</p>
<p>Предположим, что тесты работают. Для того, чтобы создать конфигурационный файл для плагина Nerrvana, нужно зайти на страницу &#8220;Add new test run&#8221; или &#8220;Edit test run&#8221;. В секции, показанной ниже, выберите нужный Space (А), введите Test Run name (B) (постарайтесь не давать тест рану длинное имя, так как плaгин будет добавлять к имени номер Jenkins build и результат будет ещё длиннее), выберите executable file (C). Поле Description (D) рекомендуется оставить пустым и использовать возможность плагина добавлять в это поле информацию о коммите (созданный нами файл version.txt как раз используется для этого). Выберите интересующие вас платформы (E) и, если ваши тесты могут выполняться параллельно, &#8211; количество потоков на платформу (F). Теперь Nerrvana сможет создать конфигурационный файл (G), в котором вам нужно будет сделать лишь несколько изменений. Сохраните этот файл.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/jenkins_doc_generate.png" alt="Generate Nerrvana Jenkins config in UI" title="Generate Nerrvana Jenkins config in UI" /></p>
<p>В разделе &#8216;api-params&#8217; находятся ключи доступа к Nerrvana API. Они подставляются автоматически при генерации файла. Вы можете изменить их на странице Settings, если в этом возникнет необходимость.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code57'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225757"><td class="code" id="p2257code57"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;api-params<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #808080; font-style: italic;">&lt;!-- Address of the Nerrvana gateway. --&gt;</span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;gateway<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>https://api.nerrvana.com<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/gateway<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #808080; font-style: italic;">&lt;!-- User-specific key which identifies user on Nerrvana side. --&gt;</span>
        <span style="color: #808080; font-style: italic;">&lt;!-- Available as an 'API public key' on Settings page </span>
<span style="color: #808080; font-style: italic;">            (https://cloud.nerrvana.com/user/editAccount) </span>
<span style="color: #808080; font-style: italic;">            in Nerrvana. --&gt;</span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;apikey<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>a6c171d-20eb5-61e3-60991-8a1e523ce<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/apikey<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #808080; font-style: italic;">&lt;!-- This key is used by the Nerrvana plug-in to create a checksum of API </span>
<span style="color: #808080; font-style: italic;">            call parameters to ensure their consistency. --&gt;</span>
        <span style="color: #808080; font-style: italic;">&lt;!-- Available as an 'API private key' on Settings page in Nerrvana. --&gt;</span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;secretkey<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>z3rCWlLdAP35eCCYAmQZ2kPw9X0LByrcc3XGh<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/secretkey<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/api-params<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Имя Test Run-a указывается в секции &#8216;test-run-name&#8217;. Плагин будет добавлять к нему номер Jenkins build, таким образом генерируя новое имя для каждого нового Test Run-a.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code58'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225758"><td class="code" id="p2257code58"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- Parameters related to Nerrvana-driven Selenium tests. --&gt;</span>
    <span style="color: #808080; font-style: italic;">&lt;!-- Test Run name template, Jenkins build number will be added to the </span>
<span style="color: #808080; font-style: italic;">        end automatically. --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;test-run-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Answers TRUNK<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/test-run-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Далее в элементе &#8216;test-run-descr&#8217; идет описание Test Run-a &#8211; test-run-descr. Его можно оставить пустым или добавить, например, &#8220;Сгенерировано Jenkins плагином&#8221;.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code59'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225759"><td class="code" id="p2257code59"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- Test Run description. All Test Runs created by this Jenkins build </span>
<span style="color: #808080; font-style: italic;">        step will have this description. --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;test-run-descr<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/test-run-descr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>В комментариях к элементу &#8216;test-run-descr-file&#8217; поясняется, как можно использовать файл для добавления описания динамически. Мы заменим название файла на version.txt, так как именно такой файл генерируется в deployment части нашего build-а. Вы можете создавать файл и включать в него информацию, которую считаете необходимой.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code60'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225760"><td class="code" id="p2257code60"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- Content of this file, if not empty, will be added to a description,</span>
<span style="color: #808080; font-style: italic;">        defined by ‘test-run-descr’ parameter above.</span>
<span style="color: #808080; font-style: italic;">        File path is relative to the Jenkins job workspace.</span>
<span style="color: #808080; font-style: italic;">        During deployment phase you can extract revision number, commiter name and a</span>
<span style="color: #808080; font-style: italic;">        commit message from your version control system, put them into this file and</span>
<span style="color: #808080; font-style: italic;">        use them as a description.</span>
<span style="color: #808080; font-style: italic;">        You can extract and parse SVN information into info.txt file with our little</span>
<span style="color: #808080; font-style: italic;">        tool - https://github.com/deepshiftlabs/nerrvana-plugin-for-jenkins-ci</span>
<span style="color: #808080; font-style: italic;">        You can read how we do it with SVN in our blog. --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;test-run-descr-file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>version.txt<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/test-run-descr-file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Вот как будет выглядеть созданный плагином Test Run, если:</p>
<p>- test-run-name &#8211; Answers TRUNK MySQL</p>
<p>- test-run-descr &#8211; Created by Nerrvana-Jenkins plugin</p>
<p>- содержимое test-run-descr-file:<br />
<em>Revision: 142<br />
Commiter: igork<br />
Date: 2012-10-17 07:39:20 +0000 (Wed, 17 Oct 2012)</em></p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/name_description.png" alt="Dynamic description" title="Dynamic description" /></p>
<p>К &#8216;test-run-name&#8217; добавлен номер Jenkins build-a &#8211; &#8216;build #51&#8242;. Описание получено конкатенацией &#8216;test-run-descr&#8217; с содержимым &#8216;test-run-descr-file&#8217;.</p>
<p>Параметр &#8216;executable-file&#8217; содержит, выбранный нами при генерации плагина, выполняемый файл &#8211; xbuild-mysql.sh.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code61'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225761"><td class="code" id="p2257code61"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- Which executable file Nerrvana should use to start tests. --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;executable-file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>xbuild-mysql.sh<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/executable-file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Будучи исполненным, он должен быть в состоянии запустить ваши тесты. Вот его содержимое:</p>
<p><code>ant -f build-mysql.xml all  > build.log 2 >&#038; 1</code></p>
<p>Приведу под спойлером также и файл build-mysql.xml, но не буду останавливаться на том, что и как он делает. Если у вас возникнут вопросы &#8211; мы с радостью ответим.</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code62'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225762"><td class="code" id="p2257code62"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;project</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;dslabs-test&quot;</span> <span style="color: #000066;">default</span>=<span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;.&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #808080; font-style: italic;">&lt;!-- BEGIN versions --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;title&quot;</span>          <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Tests of http://answers.starty.co&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;version&quot;</span>          <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;0.02.000&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #808080; font-style: italic;">&lt;!-- END versions --&gt;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;">&lt;!-- BEGIN build properties --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;build.compiler&quot;</span>       <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;javac1.6&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;libdir&quot;</span>               <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${basedir}/lib&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;output&quot;</span>               <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${basedir}/output&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;sources&quot;</span>              <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${basedir}/src&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;resources&quot;</span>            <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${basedir}/res&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;dist&quot;</span>                 <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${basedir}/dist&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;logdir&quot;</span>               <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${basedir}/log&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;bindir&quot;</span>               <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${basedir}/bin&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;logs&quot;</span>            	<span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${basedir}/logs&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;test.failonerror&quot;</span>     <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;compile.debug&quot;</span>        <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;compile.debuglevel&quot;</span>   <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;lines,vars,source&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;compile.deprecation&quot;</span>  <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #808080; font-style: italic;">&lt;!-- END build properties --&gt;</span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;taskdef</span> <span style="color: #000066;">resource</span>=<span style="color: #ff0000;">&quot;testngtasks&quot;</span> <span style="color: #000066;">classpath</span>=<span style="color: #ff0000;">&quot;${libdir}/testng-5.8-jdk15.jar&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;path</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;classpath&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${libdir}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;include</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;*.jar&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/fileset<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/path<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;clean&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;delete</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${output}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;delete</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${logs}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;prepare&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;clean&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mkdir</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${output}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mkdir</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${logs}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #808080; font-style: italic;">&lt;!-- !!!--&gt;</span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mkdir</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${logs}/html&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;copy</span> <span style="color: #000066;">todir</span>=<span style="color: #ff0000;">&quot;${logs}/html/js&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${resources}/js&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/copy<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;copy</span> <span style="color: #000066;">todir</span>=<span style="color: #ff0000;">&quot;${logs}/html/img&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${resources}/img&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/copy<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;copy</span> <span style="color: #000066;">todir</span>=<span style="color: #ff0000;">&quot;${logs}/html/css&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${resources}/css&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/copy<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;copy</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${resources}/log4j.xml&quot;</span> <span style="color: #000066;">todir</span>=<span style="color: #ff0000;">&quot;${output}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;copy</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${resources}/testng.xml&quot;</span> <span style="color: #000066;">todir</span>=<span style="color: #ff0000;">&quot;${output}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;copy</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${resources}/config-mysql.xml&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${output}/config.xml&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;bld&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;prepare&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;javac</span></span>
<span style="color: #009900;">            <span style="color: #000066;">srcdir</span>=<span style="color: #ff0000;">&quot;${sources}&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">destdir</span>=<span style="color: #ff0000;">&quot;${output}&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">excludes</span>=<span style="color: #ff0000;">&quot;&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF8&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">debug</span>=<span style="color: #ff0000;">&quot;${compile.debug}&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">deprecation</span>=<span style="color: #ff0000;">&quot;${compile.deprecation}&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">optimize</span>=<span style="color: #ff0000;">&quot;${compile.optimize}&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">debuglevel</span>=<span style="color: #ff0000;">&quot;${compile.debuglevel}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;classpath</span> <span style="color: #000066;">refid</span>=<span style="color: #ff0000;">&quot;classpath&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/javac<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;path</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;tests_classpath&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fileset</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${libdir}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;include</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;*.jar&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/fileset<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;pathelement</span> <span style="color: #000066;">location</span>=<span style="color: #ff0000;">&quot;${output}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/path<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;run&quot;</span> <span style="color: #000066;">description</span>=<span style="color: #ff0000;">&quot;${title}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;java</span> <span style="color: #000066;">classpathref</span>=<span style="color: #ff0000;">&quot;tests_classpath&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">fork</span>=<span style="color: #ff0000;">&quot;true&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${output}&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">classname</span>=<span style="color: #ff0000;">&quot;org.testng.TestNG&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">failonerror</span>=<span style="color: #ff0000;">&quot;false&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;-d&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${logs}/testng_reports&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;testng.xml&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/java<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #808080; font-style: italic;">&lt;!--delete dir=&quot;${output}&quot;/--&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
  <span style="color: #808080; font-style: italic;">&lt;!-- build all --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;all&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;bld,run&quot;</span> <span style="color: #000066;">description</span>=<span style="color: #ff0000;">&quot;Clean, build, and deploy project&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/project<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Раздел &#8216;platforms&#8217; содержит платформы, на которых мы решили выполнять тесты. В список включены все поддерживаемые платформы, а выбранные раскомментированы.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code63'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225763"><td class="code" id="p2257code63"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- List of platforms to run tests against for this config. --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;platforms<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #808080; font-style: italic;">&lt;!-- List of available platforms. Uncomment to use. --&gt;</span>
        <span style="color: #808080; font-style: italic;">&lt;!--platform&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;code&gt;centos_58_firefox_36&lt;/code&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;name&gt;Firefox 3.6 (CentOS)&lt;/name&gt;</span>
<span style="color: #808080; font-style: italic;">        &lt;/platform--&gt;</span>
        <span style="color: #808080; font-style: italic;">&lt;!--platform&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;code&gt;winxp_sp3_firefox_110&lt;/code&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;name&gt;Firefox 11.0 (WinXP)&lt;/name&gt;</span>
<span style="color: #808080; font-style: italic;">        &lt;/platform--&gt;</span>
        <span style="color: #808080; font-style: italic;">&lt;!--platform&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;code&gt;winxp_sp3_firefox_150&lt;/code&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;name&gt;Firefox 15.0 (WinXP)&lt;/name&gt;</span>
<span style="color: #808080; font-style: italic;">        &lt;/platform--&gt;</span>
        <span style="color: #808080; font-style: italic;">&lt;!--platform&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;code&gt;winxp_sp3_firefox_36&lt;/code&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;name&gt;Firefox 3.6 (WinXP)&lt;/name&gt;</span>
<span style="color: #808080; font-style: italic;">        &lt;/platform--&gt;</span>
        <span style="color: #808080; font-style: italic;">&lt;!--platform&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;code&gt;winxp_sp3_ie_8&lt;/code&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;name&gt;IE 8 (WinXP)&lt;/name&gt;</span>
<span style="color: #808080; font-style: italic;">        &lt;/platform--&gt;</span>
        <span style="color: #808080; font-style: italic;">&lt;!--platform&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;code&gt;winxp_sp3_opera_1162&lt;/code&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;name&gt;Opera 11.62 (WinXP)&lt;/name&gt;</span>
<span style="color: #808080; font-style: italic;">        &lt;/platform--&gt;</span>
        <span style="color: #808080; font-style: italic;">&lt;!--platform&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;code&gt;winxp_sp3_opera_1202&lt;/code&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;name&gt;Opera 12.02 (WinXP)&lt;/name&gt;</span>
<span style="color: #808080; font-style: italic;">        &lt;/platform--&gt;</span>
        <span style="color: #808080; font-style: italic;">&lt;!--platform&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;code&gt;winxp_sp3_safari_515&lt;/code&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;name&gt;Safari 5.1.5 (WinXP)&lt;/name&gt;</span>
<span style="color: #808080; font-style: italic;">        &lt;/platform--&gt;</span>
        <span style="color: #808080; font-style: italic;">&lt;!--platform&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;code&gt;winxp_sp3_safari_517&lt;/code&gt;</span>
<span style="color: #808080; font-style: italic;">            &lt;name&gt;Safari 5.1.7 (WinXP)&lt;/name&gt;</span>
<span style="color: #808080; font-style: italic;">        &lt;/platform--&gt;</span>
&nbsp;
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;platform<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;code<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>winxp_sp3_chrome_2001132<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/code<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Chrome 20.0.1132 (WinXP)<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/platform<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;platform<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;code<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>winxp_sp3_chrome_2101180<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/code<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Chrome 21.0.1180 (WinXP)<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/platform<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/platforms<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Параметром &#8216;nodes-count&#8217; можно сконфигурировать плагин на запуск тестов параллельно. Подробнее о параллельном выполнении тестов читайте в <a href="http://www.nerrvana.com/docs/running-parallel-tests" target="_blank">документации</a>. Если ваши тесты не работают параллельно, необходимо изменить количество nodes на 1.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code64'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225764"><td class="code" id="p2257code64"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- How many Selenium nodes should be used for each platform. --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;nodes-count<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/nodes-count<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Следующий параметр <folder-with-tests> требует настройки. Он указывает на месторасположение тестов в Jenkins workspace.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code65'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225765"><td class="code" id="p2257code65"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- Parameters related to the transfer of the tests from Jenkins </span>
<span style="color: #808080; font-style: italic;">        to Nerrvana. --&gt;</span>
    <span style="color: #808080; font-style: italic;">&lt;!-- Folder in the workspace of Jenkins job where Selenium tests will be </span>
<span style="color: #808080; font-style: italic;">        located. It is assumed that the SCM build step, which always occurs </span>
<span style="color: #808080; font-style: italic;">        BEFORE other steps, will put tests there. --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;folder-with-tests<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>.<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/folder-with-tests<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Наши Selenium-тесты находятся в том же репозитории в <a href="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/08/project_structure_for_continuous_integration.gif" target="_blank">папке tests</a>. Структура проекта была показана нами в посте <a href="http://www.deepshiftlabs.com/sel_blog/?p=2255&#038;lang=ru" target="_blank">Nerrvana в работе &#8211; сборка приложения и Jenkins (часть 1)</a>. Таким образом, в нашем случае этот параметр будет указан так:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code66'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225766"><td class="code" id="p2257code66"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;folder-with-tests<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>./tests<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/folder-with-tests<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Space ID, Space name и папка FTPS задаются внутри секции &#8216;space&#8217;. Эти параметры менять не нужно.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code67'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225767"><td class="code" id="p2257code67"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- Nerrvana space previously created by you through the Nerrvana UI. --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;space<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>4144<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Answers<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ftp-path<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Answers/_files<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ftp-path<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/space<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>В разделе &#8216;ftp&#8217; находятся параметры доступа по FTPS. Здесь необходимо указать пароль вашей учётной записи в Nerrvana.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code68'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225768"><td class="code" id="p2257code68"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- Address and credentials of the Nerrvana FTPS connection. Note that </span>
<span style="color: #808080; font-style: italic;">        a system running Jenkins should have LFTP application installed. --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ftp<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ftp.nerrvana.com<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #808080; font-style: italic;">&lt;!-- Your username --&gt;</span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;username<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>demo123<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/username<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #808080; font-style: italic;">&lt;!-- Replace this value with your password!! --&gt;</span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>[p a s s w o r d]<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/password<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ftp<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Следующий параметр &#8211; &#8216;skip-tests-sync&#8217; &#8211; позволяет ускорить тестирование, избежав ненужной повторной синхронизации тестов, если плагин Nerrvana вызывается несколько раз подряд в одном build-е. Сейчас мы оставим значение по умолчанию &#8211; false, так как вызываем плагин один раз. В следующем посте я покажу, как он используется нами в случае, когда тесты вначале запускаются для тестирования нашего приложения с MySQL, а потом с PostgreSQL.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code69'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225769"><td class="code" id="p2257code69"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- You can skip test sync when you call the Nerrvana plugin many times </span>
<span style="color: #808080; font-style: italic;">        in a single job and tests were synced in a previous step. --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;skip-tests-sync<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>false<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/skip-tests-sync<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Параметры определяемые далее, понадобятся вам в том случае, если вы используете <a href="http://www.nerrvana.com/docs/using-messages" target="_blank">messages</a>, которые может анализировать Nerrvana. Нами даны достаточно подробные описания этих параметров прямо в конфигурационном файле плагина.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code70'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225770"><td class="code" id="p2257code70"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- Job status will be set to FAILED if test execution in Nerrvana is </span>
<span style="color: #808080; font-style: italic;">        unsuccessful (tests did not sync, executable file did not start your </span>
<span style="color: #808080; font-style: italic;">        tests, etc).</span>
<span style="color: #808080; font-style: italic;">            If tests were executed successfully, you have a few options:</span>
<span style="color: #808080; font-style: italic;">        1. Mark build as successful in Jenkins and analyse generated reports </span>
<span style="color: #808080; font-style: italic;">        for problems your tests discovered.</span>
<span style="color: #808080; font-style: italic;">        2. If you want to mark a build as FAILED based on errors your tests </span>
<span style="color: #808080; font-style: italic;">        found, you can:</span>
<span style="color: #808080; font-style: italic;">            (a) Add additional step, load results, parse them to analyse errors </span>
<span style="color: #808080; font-style: italic;">            your tests discovered, and mark build as FAILED based on it. Keep </span>
<span style="color: #808080; font-style: italic;">            this parameter as 'false' in this case.</span>
<span style="color: #808080; font-style: italic;">            (b) Use Nerrvana &quot;Messages&quot; and let the Nerrvana plugin analyse </span>
<span style="color: #808080; font-style: italic;">            results, and change build status to FAILED based on it. Keep this </span>
<span style="color: #808080; font-style: italic;">            parameter as 'true' in this case and use additional parameter </span>
<span style="color: #808080; font-style: italic;">            'message-threshold' to add additional logic.</span>
<span style="color: #808080; font-style: italic;">            If you use messages and invoke the Nerrvana plug-in several times </span>
<span style="color: #808080; font-style: italic;">            in the same build, keep this option as 'false' for all invocations </span>
<span style="color: #808080; font-style: italic;">            except the last one to let the build complete all tests and analyse </span>
<span style="color: #808080; font-style: italic;">            errors at the very end. --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;use-messages-to-set-build-status<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>false<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/use-messages-to-set-build-status<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #808080; font-style: italic;">&lt;!-- Defines the level at which a FAILED status is generated. If this </span>
<span style="color: #808080; font-style: italic;">        value is set to 'WARN', for example, and your tests generate one or more </span>
<span style="color: #808080; font-style: italic;">        'WARN' or higher severity messages (ERROR or FATAL), Nerrvana execution </span>
<span style="color: #808080; font-style: italic;">        status, and Jenkins build, will be FAILED. For the full list of levels, </span>
<span style="color: #808080; font-style: italic;">        visit http://www.nerrvana.com/docs/using-messages page. --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;message-threshold<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ERROR<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/message-threshold<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Поскольку наши тесты генерируют такие messages, мы установим эти параметры таким образом:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code71'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225771"><td class="code" id="p2257code71"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;use-messages-to-set-build-status<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/use-messages-to-set-build-status<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;message-threshold<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ERROR<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/message-threshold<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Это значит, что плагин будет получать и сохранять messages в процессе выполнения тестов и проанализирует, нет ли в них сообщений уровня ERROR или выше (FATAL). Если есть &#8211; то build статус будет выставлен как FAILED в Jenkins.</p>
<p>Если вы не используете Nerrvana messages, и всё равно хотите выставлять статус build-а основываясь не на факте его успешного завершения, а на результатах тестирования, вы можете добавить дополнительный шаг build-а после выполнения Nerrvana плагина. Он получит файл с результатами тестирования из Nerrvana по FTPS, сделает его анализ и обновит статус build-а Jenkins.</p>
<p>Параметр &#8216;max-execution-time&#8217; помогает прервать выполнение, если тесты, например, зациклились. Если вы уже выполнили тесты в Nerrvana, используя UI, то вы можете установить реальное значение с запасом уже сейчас.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code72'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225772"><td class="code" id="p2257code72"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- Maximum execution time (in seconds). Defines how long the Nerrvana </span>
<span style="color: #808080; font-style: italic;">        plug-in will wait for tests to complete. Start by setting to a large </span>
<span style="color: #808080; font-style: italic;">        value and adjust accordingly after a few runs.--&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;max-execution-time<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>3600<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/max-execution-time<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Последний параметр &#8211; &#8216;poll-period&#8217; &#8211; определяет, насколько часто плагин Nerrvana будет опрашивать API о статусе выполнения тестов.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code73'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225773"><td class="code" id="p2257code73"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- How often the Nerrvana plug-in will update test execution status </span>
<span style="color: #808080; font-style: italic;">        from Nerrvana (in seconds). --&gt;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;poll-period<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>20<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/poll-period<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Схема работы плагина, особенно в части опроса и выставления статуса build-а в зависимости от этих параметров, более подробно показана на странице <a href="http://www.nerrvana.com/docs/jenkins-plugin" target="_blank">документации</a>.</p>
<p>Внеся все необходимые изменения в конфигурационный файл, мы можем добавить последний шаг в наш build &#8230;</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/nerrvana_step.png" alt="Add Nerrvana plugin step" title="Add Nerrvana plugin step" /></p>
<p>&#8230; и просто скопировать содержимое нашего файла в окошко конфигурации плагина.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/nerrvana_step_2.png" alt="Add Nerrvana plugin step - just copy/paste" title="Add Nerrvana plugin step - just copy/paste" /></p>
<p>Сохранив Jenkins job, мы можем сделать коммит и наблюдать за выполнением наших тестов в Nerrvana. Сначала я выполнил один тест на одной платформе. В UI можно видеть, как плагин создаёт Test Run и он сразу начинает выполняться.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/2012-10-17_182343.png" alt="Nerrvana Test Run started by Jenkins" title="Nerrvana Test Run started by Jenkins" /></p>
<p>К названию Test Run-а был добавлен номер build-а Jenkins, и описание содержит информацию, собранную из описания, которое мы задали в плагине и содержимого version.txt, которое преобразовал наш декоратор. Видно, что тест успешно завершился &#8211; нет сгенерированных сообщений.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/tr_one_test_one_platform.png" alt="Nerrvana Test Run completed" title="Nerrvana Test Run completed" /></p>
<p>Из Nerrvana по ссылке (показано стрелкой на картинке выше) можем перейти к отчёту, который сгенерировал наш тест.</p>
<p><a class="zoom" href="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/report.png" target="_blank"><img class="aligncenter"  src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/report_700.png" style="-ms-interpolation-mode: bicubic;"  title="Our Selenium report for one test" alt="Our Selenium report for one test" /></a></p>
<p>В первый раз для того, чтобы быстро убедиться, что всё работает, я отключил все тесты, кроме одного &#8211; теста логина. Теперь я включу все тесты, сделаю коммит, и Jenkins запустит ещё один Test Run. Да, и я добавил ещё одну платформу.</p>
<p>Под спойлером вы увидите консольный лог Jenkins build-a, который как бы продолжается с того места, где мы закончили deployment в предыдущем посте (там вы тоже найдёте консольный лог с комментариями под спойлером).</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2257code74'); return false;">View Code</a> TXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p225774"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
</pre></td><td class="code" id="p2257code74"><pre class="txt" style="font-family:monospace;">---BEGIN PLUGIN EXECUTION---
2012-10-17 07:39:24 ---INITIALIZATION STARTED---
2012-10-17 07:39:24
---BEGIN PLUGIN SETTINGS---
   Nerrvana HTTP address: https://api.nerrvana.com
   Nerrvana API key: a6c171d-20eb5-61e3-60991-8a1e523ce
   Secret key: z3rCWlLdAP35eCCYAmQZ2kPw9X0LByrcc
   Space ID: 4144
   Space: Answers
   Space path[FTPS folder]: Answers/_files
   Selenium nodes per platform: 1
   Test run name: Answers TRUNK
   Nerrvana platforms:
      Opera 12.02 (WinXP)
      Firefox 15.0 (WinXP)
   Executable file: xbuild-mysql.sh
   Nerrvana FTPS address: ftp.nerrvana.com
   Nerrvana FTPS user: demo123
   Nerrvana FTPS pass: dem0I23
   Workspace folder: ./tests
   Max execution time: 3600
   Poll period: 20
   Parse user messages mode[results analyzer]: ON
   User message threshold: ERROR
-----END PLUGIN SETTINGS---
2012-10-17 07:39:24 -----INITIALIZATION COMPLETED---
&nbsp;
2012-10-17 07:39:24 Generated test run name: Answers TRUNK MySQL build #51
2012-10-17 07:39:24 Generated test run description:
Created by Nerrvana-Jenkins plugin
Revision: 142
Committer: igork
Date: 2012-10-17 07:39:20 +0000 (Wed, 17 Oct 2012)
Launching all tests on two platforms
&nbsp;
2012-10-17 07:39:24 ---BEGIN UPLOADING TESTS TO NERRVANA FTPS---
[workspace] $ lftp -f upload-build-51-8414449724631519802.ftp
&nbsp;
2012-10-17 07:40:16 -----END UPLOADING TESTS TO NERRVANA FTPS
&nbsp;
2012-10-17 07:40:18 Creating and starting test run 
                    via Nerrvana HTTP API call...done.
2012-10-17 07:40:18 New test run ID#884.
2012-10-17 07:40:18 New execution ID#5486.
2012-10-17 07:40:18 ---BEGIN NERRVANA POLLING CYCLE 
                       (waiting for tests to complete)
&nbsp;
2012-10-17 07:40:40    Current execution status: run
&nbsp;
2012-10-17 07:41:02    Current execution status: run
&nbsp;
------ Some оutput removed ---------------------------------
&nbsp;
2012-10-17 07:44:17    Current execution status: run
&nbsp;
2012-10-17 07:44:38    Current execution status: ok
&nbsp;
2012-10-17 07:44:38 -----END NERRVANA POLLING CYCLE---
2012-10-17 07:44:38 Saving execution results into results.xml...
2012-10-17 07:44:38 Done.
2012-10-17 07:44:38 ---BEGIN TEST EXECUTION RESULTS---
2012-10-17 07:44:38 At least 43 message(s) from Nerrvana side reach(es) 
                    or exceed(s) threshold level (ERROR).
Message analyzer marks execution as failure.
2012-10-17 07:44:38 -----END TEST EXECUTION RESULTS---
2012-10-17 07:44:38
-----END PLUGIN EXECUTION---
&nbsp;
Build step 'Nerrvana plug-in' marked build as failure
Finished: FAILURE</pre></td></tr></table></div>

<p>До строки 27 плагин показывает параметры, извлеченные из своего конфигурационного файла. В строках 28-34 создаются имя и описание нового Test Run-а.</p>
<p>В строках 36-39 тесты, находящиеся на стороне Jenkins синхронизируются с тестами находящимися в Nerrvana Space.</p>
<p>Затем создаётся новый Test Run и через API плагин получает ID Test Run-а и ID его выполнения (один и тот же Test Run можно запустить несколько раз, но каждое выполнение имеет свой уникальный внутренний ID) &#8211; строки 41-44. На этом этапе Test Run становится видимым в UI Nerrvana &#8211; &#8220;Answers TRUNK MySQL build #51&#8243; создан и начинает выполняться.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/new_tr.png" alt="Nerrvana Test Run started by Jenkins - all tests and two platforms" title="Nerrvana Test Run started by Jenkins - all tests and two platforms" /></p>
<p>Теперь плагин опрашивает Nerrvana каждые 20 секунд (polling parameter), одновременно считывая появляющиеся в процессе выполнения Nerrvana messages &#8211; строки 45-58.</p>
<p>Как только тесты завершились (строки 59-60), плагин анализирует уровень ошибок (строки 61-63) и на основании анализа выставляет статус builda-а (строки 64-70). Если бы мы не анализировали сообщения Nerrvana, то build бы завершился успешно.</p>
<p>Воспользовавшись Nerrvana UI, мы видим, сколько времени заняло выполнение всех тестов на каждой платформе. </p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/tests_2_platforms.png" alt="Nerrvana Test Run completed - all tests and two platforms" title="Nerrvana Test Run completed - all tests and two platforms" /></p>
<p>Так выглядят сообщения, которые считывает и анализирует плагин в UI.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/messages.png" alt="Nerrvana messages can be analyzed by plugin" title="Nerrvana messages can be analyzed by plugin" /></p>
<p>Видно, что отчеты (генерируемые нашим framework-ом) содержат больше тестов, чем при прошлом запуске (левая панелька).</p>
<p><a href="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/report_all_tests.png" target="_blank"><img class="aligncenter"  src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/report_all_tests_700.png" style="-ms-interpolation-mode: bicubic;"  title="Our Selenium report for all tests" alt="Our Selenium report for all test" /></a></p>
<p>Ещё одним достоинством использования Nerrvana messages является тот факт, что плагин умеет создавать простые отчёты &#8211; (1). Нажмите на картинке ниже, чтобы увеличить её и увидеть цифры, на которые я ссылаюсь. В отчётах можно увидеть статус build-а и message threshold, используемые плагином (2), описание Test Run-а (3). В нашем случае &#8211; информация о коммите. Ссылки на названиях платформ (4) ведут на FTPS-сервер Nerrvana, где будут находиться подробные отчеты, сгенерированные вашими тестами. Ну и кликнув в последней колонке (5), мы раскроем таблицу и увидим сообщения, которые послали тесты из Nerrvana.</p>
<p>Очень часто разработчику достаточно только этого (особенно если он сам и писал тесты <img src='http://www.deepshiftlabs.com/sel_blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).</p>
<p><a href="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/Jenkins_report.png" target="_blank"><img class="aligncenter"  src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/Jenkins_report_700.png" style="-ms-interpolation-mode: bicubic;" title="Nerrvana plugin report in Jenkins" alt="Nerrvana plugin report in Jenkins" /></a></p>
<p>Мы описали весь процесс настройки и запуска тестирования. Однако, как вы уже поняли, мы тестируем наше приложение с двумя базами данных, а следовательно, используем немного более сложную конфигурацию &#8211; мы делаем два deployment-а и вызываем Nerrvana плагин два раза в одном и том же job-е Jenkins.</p>
<p>Об этом мы расскажем в последнем посте цикла. Поразмышляем мы и о том, как процесс можно улучшить и когда в этом есть смысл.</p>
<img src="http://feeds.feedburner.com/~r/deepshiftlabs/PrCF/~4/rtXLCIoKGE8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.deepshiftlabs.com/sel_blog/?feed=rss2&amp;p=2257&amp;lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.deepshiftlabs.com/sel_blog/?p=2257&amp;lang=ru</feedburner:origLink></item>
		<item>
		<title>Выполнение тестов Selenium IDE без IDE</title>
		<link>http://feedproxy.google.com/~r/deepshiftlabs/PrCF/~3/U4GxHgazqC8/</link>
		<comments>http://www.deepshiftlabs.com/sel_blog/?p=2626&amp;lang=ru#comments</comments>
		<pubDate>Wed, 14 Nov 2012 02:27:49 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.deepshiftlabs.com/sel_blog/?p=2626</guid>
		<description><![CDATA[Мы рады показать вам форматтер Selenium IDE для Nerrvana. Что такое Nerrvana? Nerrvana &#8211; это облачный сервис, который запускает ваши функциональные тесты в разных браузерах по требованию. Мы надеемся, что наш форматтер позволит вам с помощью Selenium IDE очень просто записывать и запускать в нашем облаке тесты или скрипты для мониторинга. Возможно, постепенно вы станете [...]]]></description>
			<content:encoded><![CDATA[<div style="float: left;"><img style="padding: 5px 20px 10px 0;" title="Running Selenium IDE without IDE" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/cloud_300.jpg" alt="Running Selenium IDE without IDE" /></div>
<p>Мы рады показать вам форматтер Selenium IDE для Nerrvana.</p>
<p>Что такое Nerrvana? Nerrvana &#8211; это облачный сервис, который запускает ваши функциональные тесты в разных браузерах по требованию.</p>
<p>Мы надеемся, что наш форматтер позволит вам с помощью Selenium IDE очень просто записывать и запускать в нашем облаке тесты или скрипты для мониторинга. Возможно, постепенно вы станете использовать более гибкий способ создания Java-тестов &#8211; без использования Selenium IDE. Надеемся, это подтолкнёт вас вначале к модификации сгенерированных тестов на Java, а потом и полному отказу от IDE, как средства создания тестов.</p>
<p><iframe width="700" height="394" src="http://www.youtube.com/embed/fEzvimZCkr8" frameborder="0" allowfullscreen></iframe></p>
<p style="text-align: center;"><em>Используйте 720p для просмотра </em></p>
<p>Если нашим клиентам это будет нужно, мы интегрируем форматтер Selenium IDE для Неррваны c нашим <a href="http://www.deepshiftlabs.com/sel_blog/?p=1930&#038;lang=ru" target="_blank">фреймворком</a>, чтобы сгенерированные тесты сразу создавали удобные отчёты.</p>
<p>Хотя тесты, сгенерированные с помощью Selenium IDE, имеют некоторые ограничения, это не повлияет на качество отчётов, и позволит вам максимально быстро их анализировать.<br />
Поэтому мы приглашаем вас создать аккаунт в <a href="http://www.nerrvana.com" target="_blank">Nerrvana</a> и попробовать, как всё работает.</p>
<img src="http://feeds.feedburner.com/~r/deepshiftlabs/PrCF/~4/U4GxHgazqC8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.deepshiftlabs.com/sel_blog/?feed=rss2&amp;p=2626&amp;lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.deepshiftlabs.com/sel_blog/?p=2626&amp;lang=ru</feedburner:origLink></item>
		<item>
		<title>Nerrvana Jenkins плагин запущен</title>
		<link>http://feedproxy.google.com/~r/deepshiftlabs/PrCF/~3/wS8sjj_6anU/</link>
		<comments>http://www.deepshiftlabs.com/sel_blog/?p=2730&amp;lang=ru#comments</comments>
		<pubDate>Mon, 12 Nov 2012 01:52:14 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.deepshiftlabs.com/sel_blog/?p=2730</guid>
		<description><![CDATA[Рады сообщить вам о запуске плагина Jenkins для Nerrvana. Почему-то в голове сидит Чебурашка со своим &#8220;мы строили, строили и наконец построили!&#8221;. У вас эта фраза не крутится в голове в такие моменты? Мы используем последнюю версию плагина уже несколько месяцев и очень ей довольны. Подробности можно найти в документации, а получить помощь &#8211; написав [...]]]></description>
			<content:encoded><![CDATA[<div style="float: left;"><img style="padding: 5px 20px 10px 0;" title="Nerrvana Jenkins plugin released" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/11/plugin_tn_300.png" alt="Nerrvana Jenkins plugin released" /></div>
<p>Рады сообщить вам о запуске плагина Jenkins для Nerrvana.</p>
<p>Почему-то в голове сидит Чебурашка со своим &#8220;мы строили, строили и наконец построили!&#8221;. У вас эта фраза не крутится в голове в такие моменты? <img src='http://www.deepshiftlabs.com/sel_blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Мы используем последнюю версию плагина уже несколько месяцев и очень ей довольны. Подробности можно найти в <a href="http://www.nerrvana.com/docs/jenkins-plugin" target="_blank">документации</a>, а получить помощь &#8211; написав нам по почте.</p>
<p>В следующей статье нашего цикла, посвящённого автоматизации тестирования с Jenkins и Nerrvana, мы как раз и покажем, как мы это делаем. Следите за обновлениями в блоге!</p>
<p>Что дальше?</p>
<p>Selenium IDE форматтер для Nerrvana. Он позволит экспортировать записанные в Selenium IDE тесты так, чтобы их можно было запускать в Nerrvana вообще без изменений.</p>
<img src="http://feeds.feedburner.com/~r/deepshiftlabs/PrCF/~4/wS8sjj_6anU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.deepshiftlabs.com/sel_blog/?feed=rss2&amp;p=2730&amp;lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.deepshiftlabs.com/sel_blog/?p=2730&amp;lang=ru</feedburner:origLink></item>
		<item>
		<title>Nerrvana в работе – сборка приложения и Jenkins (часть 2)</title>
		<link>http://feedproxy.google.com/~r/deepshiftlabs/PrCF/~3/8PwB3R2kSsc/</link>
		<comments>http://www.deepshiftlabs.com/sel_blog/?p=2343&amp;lang=ru#comments</comments>
		<pubDate>Wed, 24 Oct 2012 07:32:32 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.deepshiftlabs.com/sel_blog/?p=2343</guid>
		<description><![CDATA[Создание Jenkins job &#8211; подробностисборки приложения у нас &#8211; установкаприложения для тестирования Part 1 &#8211; Nerrvana в работе – как это делается у нас Part 2 &#8211; Nerrvana в работе – SVN втыкается в Jenkins Part 3 &#8211; Nerrvana в работе – сборка приложения и Jenkins (часть 1) Part 4 &#8211; Nerrvana в работе – [...]]]></description>
			<content:encoded><![CDATA[<div style="float: left;"><img style="padding: 5px 20px 10px 0;" title="Using Nerrvana - deployment &amp; Jenkins (part 2)" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/08/deployment_2_300.png" alt="Using Nerrvana - deployment &amp; Jenkins (part 2)" /></div>
<p>
<p style="text-align: center;"><em>Создание Jenkins job &#8211; подробности</br>сборки приложения у нас &#8211; установка</br>приложения для тестирования</em></p>
<p>Part 1 &#8211; <a href="http://www.deepshiftlabs.com/sel_blog/?p=2251&#038;lang=ru" target="_blank">Nerrvana в работе – как это делается у нас</a><br />
Part 2 &#8211; <a href="http://www.deepshiftlabs.com/sel_blog/?p=2253&#038;lang=ru" target="_blank">Nerrvana в работе – SVN втыкается в Jenkins</a><br />
Part 3 &#8211; <a href="http://www.deepshiftlabs.com/sel_blog/?p=2255&#038;lang=ru" target="_blank">Nerrvana в работе – сборка приложения и Jenkins (часть 1)</a><br />
Part 4 &#8211; Nerrvana в работе – сборка приложения и Jenkins (часть 2) &#8211; этот пост</p>
<p>В <a href="http://www.deepshiftlabs.com/sel_blog/?p=2255&#038;lang=ru" target="_blank">предыдущем посте</a> мы закончили конфигурирование Jenkins и теперь можем создать задачу по тестированию нашего приложения.</p>
<p>Открываем страницу http://your_jenkins_host/view/All/newJob и вводим название job. Поскольку наше приложение называется <a href="http://answers.starty.co" target="_blank">Answers</a>, то мы используем его.</p>
<p>На практике удобно добавить информацию о версии. Например, job &#8216;Answers TRUNK&#8217; тестирует TRUNK, job &#8216;Answers Release 1.4&#8242; тестирует Release 1.4.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_1.png" alt="New Jenkins job" title="New Jenkins job" /></p>
<p>Далее в секции &#8216;Advanced Project Options&#8217; нажимаем кнопку &#8216;Advanced &#8230;&#8217; и выставляем &#8216;Quiet period&#8217; в 0 секунд. Мы знаем, что многие делают build несколько раз в день. В этом случае параметры запуска Jenkins job будут иными. Мы же делаем build под каждый коммит и потому нам нет смысла ждать 5 секунд. Помощь в Jenkins к этому пункту очень хорошо описывает практические случаи, когда эта опция нужна.<br />
<span id="more-2343"></span></p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_advanced_1_5.png" alt="New Jenkins job - Advanced project options" title="New Jenkins job - Advanced project options" /></p>
<p>Теперь переходим к секции &#8216;Source Code Management&#8217;, выбираем SVN, который мы используем.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_svn_1.png" alt="New Jenkins job - Source Code Management" title="New Jenkins job - Source Code Management" /></p>
<p>Jenkins попросит ввести детали пользователя SVN. Выбираем &#8216;Check-out strategy&#8217; &#8211; &#8216;Always check-out a fresh copy&#8217;.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_svn_2.png" alt="New Jenkins job - Check out strategy" title="New Jenkins job - Check out strategy" /></p>
<p>Следующая секция &#8211; &#8216;Build Triggers&#8217;. Используем &#8216;Poll SCM&#8217;. В нашем случае push-триггером, который советует использовать справка к этому пункту, является SVN-хук, который мы <a href="http://www.deepshiftlabs.com/sel_blog/?p=2253&#038;lang=ru" target="_blank">добавили ранее</a>. Если вы откроете справку к опции &#8216;Build periodically&#8217;, вы увидите следующее замечание: &#8220;When people first start continuous integration, they are often so used to the idea of regularly scheduled builds like nightly/weekly that they use this feature. However, the point of continuous integration is to start a build as soon as a change is made, to provide a quick feedback to the change.&#8221; Как раз поэтому наши builds запускаются сразу при изменении кода проекта.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_triggers_3.png" alt="New Jenkins job - Build Triggers" title="New Jenkins job - Build Triggers" /></p>
<p>Далее пропускаем секцию &#8216;Build Environment&#8217; и переходим к &#8216;Build&#8217;. Нажимаем кнопку &#8216;Add build step&#8217; и выбираем опцию &#8216;Invoke Ant&#8217;.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_step_4.png" alt="New Jenkins job - Add Build Step" title="New Jenkins job - Add Build Step" /></p>
<p>Как вы видите, конфигурационный файл Ant находится тоже в SVN. После извлечения кода на предыдущем шаге он оказывается в нужном месте в нужное время (хочется ему в этом позавидовать). Задача этого шага в том, чтобы подготовить код, извлеченный из системы контроля версий, к передаче на deployment хост для дальнейшей установки приложения на нём. Мы хотим по возможности сделать максимум операций на jenkins хосте.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_ant.png" alt="New Jenkins job - Invoke Ant" title="New Jenkins job - Invoke Ant" /></p>
<p>Далее я расскажу, чем мы озадачили Ant. Вот так выглядит наш build.xml.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code122'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343122"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
</pre></td><td class="code" id="p2343code122"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;project</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;${env.JOB_NAME}&quot;</span> <span style="color: #000066;">default</span>=<span style="color: #ff0000;">&quot;build&quot;</span> <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;.&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">environment</span>=<span style="color: #ff0000;">&quot;env&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;tests&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/tests&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;ci&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/ci&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;code&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/code&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;make_settings&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;sed&quot;</span> <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${code}/config/Settings.class.php.mysql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;-f ${ci}/deployment/config/mysql/settings-mysql.sed ${code}/config/Settings.class.template.php&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;make_sql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;sed&quot;</span> <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${code}/install/mysql.sql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;-f ${ci}/deployment/config/mysql/install-mysql.sed ${code}/install/mysql.sql&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;move_files&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;make_settings,make_sql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #808080; font-style: italic;">&lt;!-- Move authentication files to WAUT root --&gt;</span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/misc/login.php&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${code}/login.php&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/misc/logout.php&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${code}/logout.php&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
        <span style="color: #808080; font-style: italic;">&lt;!-- Move MySQL db creation files to install folder --&gt;</span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/config/mysql/crt-mysql.sql&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${code}/install/crt-mysql.sql&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
        <span style="color: #808080; font-style: italic;">&lt;!-- Move publish script to the workspace root, so it will be beside prj.zip --&gt;</span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/publish-over-ssh/publish.sh&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/publish.sh&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;save_commit_info&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;move_files&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}&quot;</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;svn&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span></span>
                    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;--username jenkins --password 123456 upgrade&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>    
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}&quot;</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;svn&quot;</span>  <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/version.txt&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>  
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;--username jenkins --password 123456 log -r ${env.SVN_REVISION}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}&quot;</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;svn&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>  
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;--username jenkins --password 123456 log -r ${env.SVN_REVISION}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>   
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;svn&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;save_commit_info&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;java</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;.&quot;</span> <span style="color: #000066;">jar</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/scm-decorator.jar&quot;</span> <span style="color: #000066;">fork</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">failonerror</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;svn&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/version.txt&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span> 
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/java<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>       
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;zip&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;svn&quot;</span> <span style="color: #000066;">description</span>=<span style="color: #ff0000;">&quot;Compress project files&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jar</span> <span style="color: #000066;">destfile</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/prj.zip&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/code&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">excludes</span>=<span style="color: #ff0000;">&quot;.svn&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;build&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;zip&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/project<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Все остальные операции выполняются на стороне deployment хоста после передачи результатов этого шага с помощью &#8216;Send files or execute commands over SSH&#8217;.</p>
<p>Надеюсь, мои пояснения помогут вам создать Ant build ещё лучше и ещё быстрее. </p>
<p>Прежде всего, хочу сказать, что если вы запутаетесь с путями &#8211; вставьте в ваш Ант файл следующий target и тогда в логе build-a вы увидите какими путями оперирует Jenkins.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code123'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343123"><td class="code" id="p2343code123"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;test&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;Jenkins workspace: ${env.WORKSPACE}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;Job directory: ${env.WORKSPACE}/../../${env.JOB_NAME}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;Build data: ${env.WORKSPACE}/../../${env.JOB_NAME}/builds/${env.BUILD_ID}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>В строках 4-6 мы даём более краткие имена (aliases),чтобы дальше было удобнее прописывать пути.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code124'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343124"><td class="code" id="p2343code124"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;tests&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/tests&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;ci&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/ci&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;code&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/code&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></td></tr></table></div>

<p>Далее (строки 8-12) наша задача &#8211; создать конфигурационный файл приложения. Как мы <a href="http://www.deepshiftlabs.com/sel_blog/?p=2255&#038;lang=ru#anchor1">писали ранее</a>, наше приложение &#8211; загружаемое и инсталлируется с помощью поставляемого с ним инсталляционного скрипта. Здесь же мы просто используем sed для превращения шаблона Settings.class.template в нужный нам конфигурационный файл Settings.class.php.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code125'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343125"><td class="code" id="p2343code125"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;make_settings&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;sed&quot;</span> <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${code}/config/Settings.class.php.mysql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;-f ${ci}/deployment/config/mysql/settings-mysql.sed ${code}/config/Settings.class.template.php&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Я не буду приводить файлы целиком, а просто покажу несколько строк из файла заготовки &#8211; Settings.class.template, несколько строк settings-mysql.sed файла и те же строки во вновь созданном конфигурационном файле Settings.class.php.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code126'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343126"><td class="code" id="p2343code126"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Database IP or hostname (use colon, if runs on non-standard port: 127.0.0.1:563)</span>
    <span style="color: #000000; font-weight: bold;">const</span> DB_HOST <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Username to connect to DB</span>
    <span style="color: #000000; font-weight: bold;">const</span> DB_USER <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>


<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code127'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343127"><td class="code" id="p2343code127"><pre class="bash" style="font-family:monospace;">s<span style="color: #000000; font-weight: bold;">/</span>const DB_USER = <span style="color: #ff0000;">&quot;&quot;</span>;<span style="color: #000000; font-weight: bold;">/</span>const DB_USER = <span style="color: #ff0000;">&quot;ANSWERS_DB_USER&quot;</span>;<span style="color: #000000; font-weight: bold;">/</span>g
s<span style="color: #000000; font-weight: bold;">/</span>const DB_HOST = <span style="color: #ff0000;">&quot;&quot;</span>;<span style="color: #000000; font-weight: bold;">/</span>const DB_HOST = <span style="color: #ff0000;">&quot;localhost&quot;</span>;<span style="color: #000000; font-weight: bold;">/</span>g</pre></td></tr></table></div>


<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code128'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343128"><td class="code" id="p2343code128"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Database IP or hostname (use colon, if runs on non-standard port: 127.0.0.1:563)</span>
    <span style="color: #000000; font-weight: bold;">const</span> DB_HOST <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;localhost&quot;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Username to connect to DB</span>
    <span style="color: #000000; font-weight: bold;">const</span> DB_USER <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;ANSWERS_DB_USER&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Вы видите, что в именах файлов и путях присутствует &#8216;mysql&#8217; Это потому, что мы тестируем наше приложение ещё и с PostgreSQL. Я убрал из описания всё, что касается PostgreSQL &#8211; как и обещал, приведу реальные конфиги в самом конце цикла. Сам не люблю, когда объясняя мне что-то новое, вываливают кучу не важной информации, от которой всё только запутывается.</p>
<p>В результате этого шага мы получили конфигурационный файл приложения для работы с MySQL &#8211; Settings.class.php.mysql, который лежит рядышком с Settings.class.template.php в папке ${code}/config/.</p>
<p>В строках 14-18 мы создаём необходимый SQL файл, который, будучи запущенным на deployment хосте, пересоздаст MySQL базу данных приложения.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code129'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343129"><td class="code" id="p2343code129"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;make_sql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;sed&quot;</span> <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${code}/install/mysql.sql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;-f ${ci}/deployment/config/mysql/install-mysql.sed ${code}/install/mysql.sql&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Опять же, инсталлятор Answers использует заранее приготовленный файл mysql.sql, в котором в процессе установки на основании введённых пользователей данных заменяются, например, имена таблиц. Но мы можем его использовать практически без изменений. Изменения, которые необходимы, делаем с помощью sed. В данном случае модифицируем оригинальный файл ${code}/install/mysql.sql.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code130'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343130"><td class="code" id="p2343code130"><pre class="bash" style="font-family:monospace;">s<span style="color: #000000; font-weight: bold;">/</span>USERS_TABLE<span style="color: #000000; font-weight: bold;">/</span>USERS_VIEW_NAME<span style="color: #000000; font-weight: bold;">/</span>g
s<span style="color: #000000; font-weight: bold;">/</span>USE ANSWERS_DATABASE<span style="color: #000000; font-weight: bold;">/</span>USE answers<span style="color: #000000; font-weight: bold;">/</span>g</pre></td></tr></table></div>

<p>Идём далее &#8211; target &#8220;move_files&#8221; (строки 20-30). Как вы, наверное, помните, наше приложение &#8211; встраиваемое и не имеет своей собственной страницы авторизации. Однако для тестирования нам всё равно нужны страницы login и logout, поэтому нам пришлось их создать специально для тестирования. Лежат они в ${ci}/deployment/misc/, и теперь самое время передвинуть их в корень приложения &#8211; ${code}/, так как этими страницами будут пользоваться Selenium тесты (строки 21-23).</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code131'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343131"><td class="code" id="p2343code131"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;move_files&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;make_settings,make_sql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #808080; font-style: italic;">&lt;!-- Move authentication files to WAUT root --&gt;</span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/misc/login.php&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${code}/login.php&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/misc/logout.php&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${code}/logout.php&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
        <span style="color: #808080; font-style: italic;">&lt;!-- Move MySQL db creation files to install folder --&gt;</span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/config/mysql/crt-mysql.sql&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${code}/install/crt-mysql.sql&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
        <span style="color: #808080; font-style: italic;">&lt;!-- Move publish script to the workspace root, so it will be beside prj.zip --&gt;</span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/publish-over-ssh/publish.sh&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/publish.sh&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>В строках 25-26 мы перемещаем ещё один SQL файл &#8211; crt-mysql.sql, из ${ci}/deployment/config/mysql/ в ${code}/install/, так как мы отправляем на deployment хост только содержимое ${code}/. </p>
<p>Что же находится в файле crt-mysql.sql? Приложения встраиваемое, поэтому создаёт свои таблицы в базе данных основного приложения. Чтобы смоделировать эту ситуацию, нам нужно (пере)создать базу этого основного приложения, чтобы потом после этого мы смогли бы выполнить файл mysql.sql. То есть задача скрипта &#8211; создание базы &#8220;основного&#8221; приложения и наполнение нужными Answers данными. Вот так он выглядит без купюр:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code132'); return false;">View Code</a> SQL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343132"><td class="code" id="p2343code132"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> answers;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> answers;
<span style="color: #993333; font-weight: bold;">use</span> answers;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">if</span> <span style="color: #993333; font-weight: bold;">exists</span> USERS_SOURCE_TABLE;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`USERS_SOURCE_TABLE`</span> <span style="color: #66cc66;">&#40;</span>
  USERS_ID_COLUMN int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
  username varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
  USERS_DISPLAY_NAME_COLUMN varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
  USERS_EMAIL_COLUMN varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
  CONSTRAINT USERS_SOURCE_TABLE_pkey <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>USERS_ID_COLUMN<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> ENGINE<span style="color: #66cc66;">=</span>InnoDB <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARSET<span style="color: #66cc66;">=</span>utf8;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> USERS_SOURCE_TABLE <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'answ_test_admin@dslabs.lan'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Arnie - Admin'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'answ_test_admin@dslabs.lan'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> USERS_SOURCE_TABLE <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'answ_test_user@dslabs.lan'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Ivan Danko - Captain'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'answ_test_user@dslabs.lan'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> USERS_SOURCE_TABLE <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'answ_test_staff@dslabs.lan'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Lee - Guru(Staff)'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'answ_test_staff@dslabs.lan'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> USER <span style="color: #ff0000;">'ANSWERS_DB_USER'</span>@localhost;
<span style="color: #993333; font-weight: bold;">FLUSH</span> PRIVILEGES;</pre></td></tr></table></div>

<p>И в заключение этой части в строках 28-29, мы переносим скрипт publish.sh в корень WORKSPACE. Этот скрипт знает, что делать з запакованным в zip /code, который мы подготовили. О его содержимом мы поговорим, когда будем описывать шаг &#8216;Send files or execute commands over SSH&#8217;.</p>
<p>В строках 32-43 мы сохраняем в текстовый файл информацию о коммите, который будем тестировать.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code133'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343133"><td class="code" id="p2343code133"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;save_commit_info&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;move_files&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}&quot;</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;svn&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span></span>
                    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;--username jenkins --password 123456 upgrade&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>    
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}&quot;</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;svn&quot;</span>  <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/version.txt&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>  
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;--username jenkins --password 123456 log -r ${env.SVN_REVISION}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}&quot;</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;svn&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>  
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;--username jenkins --password 123456 log -r ${env.SVN_REVISION}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>                  
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>В строках 33-35 у меня находится решение проблемы, когда SVN-сервер имеет более свежую версию, чем поддерживается SVN-плагином для Jenkins. В этом случае команда ‘svn info’ выдаёт ошибку о несовпадении версий и просит сделать upgrade рабочей копии, что я и делаю до выполнения ‘svn info’. Строки 39-41 только для того, чтобы та же информация попала и в консольный лог Jenkins. Эту информацию мы преобразуем на следующем шаге в более приятный формат и добавим позже в описание Nerrvana test run.</p>
<p>Теперь мы используем написанную нами и доступную на GitHub <a href="https://github.com/deepshiftlabs/scm-decorator" target="_blank">утилитку</a>, которая получает на входе такой файл и &#8230;</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code134'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343134"><td class="code" id="p2343code134"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#cat version.txt</span>
<span style="color: #660033;">------------------------------------------------------------------------</span>
r69 <span style="color: #000000; font-weight: bold;">|</span> igork <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000;">2012</span>-<span style="color: #000000;">10</span>-03 07:<span style="color: #000000;">38</span>:<span style="color: #000000;">38</span> +0000 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Wed, 03 Oct <span style="color: #000000;">2012</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000;">1</span> line
&nbsp;
Fixed bug <span style="color: #666666; font-style: italic;">#342</span>
<span style="color: #660033;">------------------------------------------------------------------------</span></pre></td></tr></table></div>

<p>&#8230; преобразовывает его в такой.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code135'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343135"><td class="code" id="p2343code135"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#cat version.txt</span>
Revision: <span style="color: #000000;">69</span>
Committer: igork
Date: <span style="color: #000000;">2012</span>-<span style="color: #000000;">10</span>-03 07:<span style="color: #000000;">38</span>:<span style="color: #000000;">38</span> +0000 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Wed, 03 Oct <span style="color: #000000;">2012</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
Fixed bug <span style="color: #666666; font-style: italic;">#342</span></pre></td></tr></table></div>

<p>Вы можете расширить наш код, добавив поддержку системы контроля версий, которую используете вы, если она окажется вам полезной.</p>
<p>Вот так это делается:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code136'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343136"><td class="code" id="p2343code136"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;svn&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;save_commit_info&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;java</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;.&quot;</span> <span style="color: #000066;">jar</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/scm-decorator.jar&quot;</span> <span style="color: #000066;">fork</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">failonerror</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;svn&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/version.txt&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span> 
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/java<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>       
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Как вы видите, специально с учётом возможных расширений предусмотрен параметр value=&#8221;svn&#8221;.</p>
<p>И наконец мы zip-уем папку /code/ в строках 51-55 в файл prj.zip.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code137'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343137"><td class="code" id="p2343code137"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;zip&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;svn&quot;</span> <span style="color: #000066;">description</span>=<span style="color: #ff0000;">&quot;Compress project files&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jar</span> <span style="color: #000066;">destfile</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/prj.zip&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/code&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">excludes</span>=<span style="color: #ff0000;">&quot;.svn&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Переходим к следуюшему шагу build-a (и на сегодня последнему) &#8211; передаче приготовленных файлов и завершению deploymenta-а</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_ssh.png" alt="New Jenkins job - Send files or execute commands over SSH" title="New Jenkins job - Send files or execute commands over SSH" /></p>
<p>Вы видите, что мы просим передать на deployment хост (определяется первым параметром &#8220;SSH Server&#8221;, который мы создали, когда конфигурировали Jenkins) два файла prj.zip и publish.sh, а также выполнить после передачи:</p>
<p><code>chmod +x publish.sh<br />
./publish.sh</code></p>
<p>Теперь самое время посмотреть, что же делает publish.sh скрипт.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code138'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343138"><td class="code" id="p2343code138"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
&nbsp;
<span style="color: #007800;">WWW_MYSQL_DIR</span>=<span style="color: #ff0000;">'/var/www/answers/answers_mysql'</span>
<span style="color: #007800;">DB_NAME</span>=<span style="color: #ff0000;">'answers'</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-Rf</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/*</span>
<span style="color: #c20cb9; font-weight: bold;">unzip</span> <span style="color: #660033;">-o</span> prj.zip <span style="color: #660033;">-d</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span>
<span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>Settings.class.php.mysql <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>Settings.class.php
<span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #660033;">-R</span> <span style="color: #000000;">777</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span>
mysql <span style="color: #660033;">-v</span> <span style="color: #660033;">-u</span> root  <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">install</span><span style="color: #000000; font-weight: bold;">/</span>crt-mysql.sql
mysql <span style="color: #660033;">-v</span> <span style="color: #660033;">-u</span> root  <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">install</span><span style="color: #000000; font-weight: bold;">/</span>mysql.sql <span style="color: #007800;">$DB_NAME</span></pre></td></tr></table></div>

<p>Чистит папку веб серера:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code139'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343139"><td class="code" id="p2343code139"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-Rf</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/*</span></pre></td></tr></table></div>

<p>Распаковывает туда Answers</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code140'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343140"><td class="code" id="p2343code140"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">unzip</span> <span style="color: #660033;">-o</span> prj.zip <span style="color: #660033;">-d</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span></pre></td></tr></table></div>

<p>Переименовывает подготовленный конфигурационный файл для MySQL</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code141'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343141"><td class="code" id="p2343code141"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>Settings.class.php.mysql <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>Settings.class.php</pre></td></tr></table></div>

<p>Устанавливает права на файлы нашего приложения (мы могли бы быть здесь немножечко консервативнее)</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code142'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343142"><td class="code" id="p2343code142"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #660033;">-R</span> <span style="color: #000000;">777</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span></pre></td></tr></table></div>

<p>Создаёт &#8216;основное&#8217; приложение (-v добавлено для verbose вывода работы SQL скрипта в консольный лог Jenkins):</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code143'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343143"><td class="code" id="p2343code143"><pre class="bash" style="font-family:monospace;">mysql <span style="color: #660033;">-v</span> <span style="color: #660033;">-u</span> root <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">install</span><span style="color: #000000; font-weight: bold;">/</span>crt-mysql.sql</pre></td></tr></table></div>

<p>Интегрирует в него Answers:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code144'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343144"><td class="code" id="p2343code144"><pre class="bash" style="font-family:monospace;">mysql <span style="color: #660033;">-v</span> <span style="color: #660033;">-u</span> root <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">install</span><span style="color: #000000; font-weight: bold;">/</span>mysql.sql <span style="color: #007800;">$DB_NAME</span></pre></td></tr></table></div>

<p>Всё готово! Делаем пробный коммит и смотрим консольные логи Jenkins, пока не добьёмся работающего приложения на http://deployment_host/answers_mysql.</p>
<p>Как вы видите, все файлы, используемые Jenkins-ом, находятся в системе контроля версий. Это позволяет не использовать custom workspaces в Jenkins, которые потребовали бы предварительной конфигурации и поддержки в актуальном состоянии (вначале у нас было именно так и это было неудобно). Все файлы попадают на свои места после извлечения кода Jenkins-ом. Также при таком подходе мы можем использовать переменные окружения Jenkins в файлах.</p>
<p>Под спойлером пример консольного лога выполненного build-а, с моими комментариями. Вырезаны и помечены как вырезанные логи, соответствующие одному шагу (например, ‘svn checkout’).</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code145'); return false;">View Code</a> TXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343145"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
</pre></td><td class="code" id="p2343code145"><pre class="txt" style="font-family:monospace;">Started by an SCM change
Building in workspace /var/lib/jenkins/jobs/Answers_deployment_only/workspace
Cleaning local Directory .
Checking out http://192.168.3.97/repos/answers/trunk at revision 140
A         tests
------ Output removed - comment by Igor --------------------------------- 
AU        ci/deployment/scm-decorator.jar
A         ci/deployment/build.xml
A         ci/toolchain
A         ci/toolchain/build-toolchain.xml
At revision 140
[deployment] $ ant -file build.xml build
Buildfile: build.xml
&nbsp;
make_settings:
&nbsp;
make_sql:
&nbsp;
move_files:
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers_deployment_only/workspace/code
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers_deployment_only/workspace/code/install
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers_deployment_only/workspace
&nbsp;
save_commit_info:
     [exec] Upgraded '.'
------ Output removed - comment by Igor --------------------------------- 
     [exec] Upgraded 'ci/deployment/misc'
     [exec] Upgraded 'ci/toolchain'
     [exec] ------------------------------------------------------------------------
     [exec] r140 | igork | 2012-10-08 11:46:01 +0000 (Mon, 08 Oct 2012) | 1 line
     [exec] 
     [exec] Test 2345
     [exec] ------------------------------------------------------------------------
&nbsp;
svn:
&nbsp;
zip:
      [jar] Building jar: /var/lib/jenkins/jobs/Answers_deployment_only/workspace/prj.zip
&nbsp;
build:
&nbsp;
BUILD SUCCESSFUL
Total time: 0 seconds
SSH: Connecting from host [mantis.deepshiftlabs.com]
SSH: Connecting with configuration [Answers test server] ...
SSH: EXEC: STDOUT/STDERR from command [chmod +x publish.sh
./publish.sh] ...
Archive:  prj.zip&lt;div style=&quot;float: left;&quot;&gt;&lt;img style=&quot;padding: 5px 20px 10px 0;&quot; title=&quot;Using Nerrvana - deployment &amp;amp; Jenkins (part 2)&quot; src=&quot;http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/08/deployment_2_300.png&quot; alt=&quot;Using Nerrvana - deployment &amp;amp; Jenkins (part 2)&quot; /&gt;&lt;/div&gt;
[lang_ru]
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;em&gt;Создание Jenkins job - подробности&lt;/br&gt;сборки приложения у нас - установка&lt;/br&gt;приложения для тестирования&lt;/em&gt;&lt;/p&gt;
&nbsp;
В &lt;a href=&quot;http://www.deepshiftlabs.com/sel_blog/?p=2255&amp;lang=ru&quot; target=&quot;_blank&quot;&gt;предыдущем посте&lt;/a&gt; мы закончили конфигурирование Jenkins и теперь можем создать задачу по тестированию нашего приложения.
&nbsp;
Открываем страницу http://your_jenkins_host/view/All/newJob и вводим название job. Поскольку наше приложение называется &lt;a href=&quot;http://answers.starty.co&quot; target=&quot;_blank&quot;&gt;Answers&lt;/a&gt;, то мы используем его.
&nbsp;
На практике удобно добавить информацию о версии. Например, job 'Answers TRUNK' тестирует TRUNK, job 'Answers Release 1.4' тестирует Release 1.4.
[/lang_ru][lang_en-us]
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;em&gt;What is a web application deployment - Jenkins installation and configuration - preparing Jenkins for deployment&lt;/em&gt;&lt;/p&gt;
Let’s talk about deployment. In the most general case, it is a transformation of the source code retrieved from a version control system into a running application. We do not use Jenkins to update our live sites and services yet, but we assume that the deployment for testing is not very different from deployment for upgrade or install. In the latter case, you need to take care of users, informing them in advance about the service downtime, and to give attention to security - access rights to files, the possibility of a rollback automatically in case of failure. These problems do not interest us at the moment anyway. We need to get the application running on an internal server which can be accessed by Selenium tests. Each application will have a slightly different deployment, and we will describe how we deploy, with some simplifications. In the last post of this mini-series, we will show our real configuration, but for now this information will be excessive.
[/lang_en-us]&lt;!--more--&gt;[lang_ru]
&nbsp;
&lt;img class=&quot;aligncenter&quot; style=&quot;-ms-interpolation-mode: bicubic;&quot; src=&quot;http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_1.png&quot; alt=&quot;New Jenkins job&quot; title=&quot;New Jenkins job&quot; /&gt;
&nbsp;
Далее в секции 'Advanced Project Options' нажимаем кнопку 'Advanced ...' и выставляем 'Quiet period' в 0 секунд. Мы знаем, что многие делают build несколько раз в день. В этом случае параметры запуска Jenkins job будут иными. Мы же делаем build под каждый коммит и потому нам нет смысла ждать 5 секунд. Помощь в Jenkins к этому пункту очень хорошо описывает практические случаи, когда эта опция нужна.
&nbsp;
&lt;img class=&quot;aligncenter&quot; style=&quot;-ms-interpolation-mode: bicubic;&quot; src=&quot;http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_advanced_1_5.png&quot; alt=&quot;New Jenkins job - Advanced project options&quot; title=&quot;New Jenkins job - Advanced project options&quot; /&gt;
&nbsp;
Теперь переходим к секции 'Source Code Management', выбираем SVN, который мы используем.
&nbsp;
&lt;img class=&quot;aligncenter&quot; style=&quot;-ms-interpolation-mode: bicubic;&quot; src=&quot;http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_svn_1.png&quot; alt=&quot;New Jenkins job - Source Code Management&quot; title=&quot;New Jenkins job - Source Code Management&quot; /&gt;
&nbsp;
Jenkins попросит ввести детали пользователя SVN. Выбираем 'Check out strategy' - 'Always check out a fresh copy'.
&nbsp;
&lt;img class=&quot;aligncenter&quot; style=&quot;-ms-interpolation-mode: bicubic;&quot; src=&quot;http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_svn_2.png&quot; alt=&quot;New Jenkins job - Check out strategy&quot; title=&quot;New Jenkins job - Check out strategy&quot; /&gt;
&nbsp;
Следующая секция 'Build Triggers'. Используем 'Poll SCM'. В нашем случае 'push' trigger-ом, который советует использовать справка к этому пункту, является SVN хук, который мы &lt;a href=&quot;http://www.deepshiftlabs.com/sel_blog/?p=2253&amp;lang=ru&quot; target=&quot;_blank&quot;&gt;добавили ранее&lt;/a&gt;. Если вы откроете справку к опции 'Build periodically', вы увидите следующее замечание: &quot;When people first start continuous integration, they are often so used to the idea of regularly scheduled builds like nightly/weekly that they use this feature. However, the point of continuous integration is to start a build as soon as a change is made, to provide a quick feedback to the change.&quot; Как раз, поэтому наши builds запускаются сразу при изменении кода проекта.
&nbsp;
&lt;img class=&quot;aligncenter&quot; style=&quot;-ms-interpolation-mode: bicubic;&quot; src=&quot;http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_triggers_3.png&quot; alt=&quot;New Jenkins job - Build Triggers&quot; title=&quot;New Jenkins job - Build Triggers&quot; /&gt;
&nbsp;
Далее пропускаем секцию 'Build Environment' и переходим к 'Build'. Нажимаем кнопку 'Add build step' и выбираем опцию 'Invoke Ant'.
&nbsp;
&lt;img class=&quot;aligncenter&quot; style=&quot;-ms-interpolation-mode: bicubic;&quot; src=&quot;http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_step_4.png&quot; alt=&quot;New Jenkins job - Add Build Step&quot; title=&quot;New Jenkins job - Add Build Step&quot; /&gt;
&nbsp;
Как вы видите, конфигурационный файл Ant находится тоже в SVN. По завершении извлечении кода на предыдущем шаге, он оказывается в нужном месте в нужное время (хочется ему в этом позавидовать). Задача этого шага в том, чтобы подготовить код, извлеченный из системы контроля версий, к передаче на deployment хост для дальнейшей установки приложения на нём. Мы хотим по возможности сделать максимум операций на jenkins хосте.
&nbsp;
&lt;img class=&quot;aligncenter&quot; style=&quot;-ms-interpolation-mode: bicubic;&quot; src=&quot;http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_ant.png&quot; alt=&quot;New Jenkins job - Invoke Ant&quot; title=&quot;New Jenkins job - Invoke Ant&quot; /&gt;
&nbsp;
Далее я расскажу, чем мы озадачили Ant. Вот так выглядит наш build.xml. 
&nbsp;
&lt;pre lang=&quot;xml&quot; line=&quot;1&quot;&gt;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;project name=&quot;${env.JOB_NAME}&quot; default=&quot;build&quot; basedir=&quot;.&quot;&gt;
    &lt;property environment=&quot;env&quot;/&gt;
    &lt;property name=&quot;tests&quot; value=&quot;${env.WORKSPACE}/tests&quot;/&gt;
    &lt;property name=&quot;ci&quot; value=&quot;${env.WORKSPACE}/ci&quot;/&gt;
    &lt;property name=&quot;code&quot; value=&quot;${env.WORKSPACE}/code&quot;/&gt;
&nbsp;
    &lt;target name=&quot;make_settings&quot;&gt;
        &lt;exec executable=&quot;sed&quot; output=&quot;${code}/config/Settings.class.php.mysql&quot;&gt;
            &lt;arg line=&quot;-f ${ci}/deployment/config/mysql/settings-mysql.sed ${code}/config/Settings.class.template.php&quot; /&gt;
        &lt;/exec&gt;
    &lt;/target&gt;
&nbsp;
    &lt;target name=&quot;make_sql&quot;&gt;
        &lt;exec executable=&quot;sed&quot; output=&quot;${code}/install/mysql.sql&quot;&gt;
            &lt;arg line=&quot;-f ${ci}/deployment/config/mysql/install-mysql.sed ${code}/install/mysql.sql&quot; /&gt;
        &lt;/exec&gt;
    &lt;/target&gt;
&nbsp;
    &lt;target name=&quot;move_files&quot; depends=&quot;make_settings,make_sql&quot;&gt;
        &lt;!-- Move authentication files to WAUT root --&gt;
       &lt;move file=&quot;${ci}/deployment/misc/login.php&quot; tofile=&quot;${code}/login.php&quot; /&gt;
        &lt;move file=&quot;${ci}/deployment/misc/logout.php&quot; tofile=&quot;${code}/logout.php&quot; /&gt;
&nbsp;
        &lt;!-- Move MySQL db creation files to install folder --&gt;
        &lt;move file=&quot;${ci}/deployment/config/mysql/crt-mysql.sql&quot; tofile=&quot;${code}/install/crt-mysql.sql&quot; /&gt;
&nbsp;
        &lt;!-- Move publish script to the workspace root, so it will be beside prj.zip --&gt;
       &lt;move file=&quot;${ci}/deployment/publish-over-ssh/publish.sh&quot; tofile=&quot;${env.WORKSPACE}/publish.sh&quot; /&gt;
    &lt;/target&gt;
&nbsp;
    &lt;target name=&quot;save_commit_info&quot; depends=&quot;move_files&quot;&gt;
        &lt;exec dir=&quot;${env.WORKSPACE}&quot; executable=&quot;svn&quot; &gt;
                    &lt;arg line=&quot;--username jenkins --password 123456 upgrade&quot; /&gt;
        &lt;/exec&gt;    
      &lt;exec dir=&quot;${env.WORKSPACE}&quot; executable=&quot;svn&quot;  output=&quot;${env.WORKSPACE}/version.txt&quot;&gt;  
          &lt;arg line=&quot;--username jenkins --password 123456 log -r ${env.SVN_REVISION}&quot; /&gt;
      &lt;/exec&gt;
      &lt;exec dir=&quot;${env.WORKSPACE}&quot; executable=&quot;svn&quot;&gt;  
          &lt;arg line=&quot;--username jenkins --password 123456 log -r ${env.SVN_REVISION}&quot; /&gt;
      &lt;/exec&gt;
&nbsp;
    &lt;/target&gt;   
&nbsp;
    &lt;target name=&quot;svn&quot; depends=&quot;save_commit_info&quot;&gt;
       &lt;java dir=&quot;.&quot; jar=&quot;${ci}/deployment/scm-decorator.jar&quot; fork=&quot;true&quot; failonerror=&quot;true&quot;&gt;
         &lt;arg value=&quot;svn&quot;/&gt;
         &lt;arg value=&quot;${env.WORKSPACE}/version.txt&quot;/&gt; 
       &lt;/java&gt;       
    &lt;/target&gt;
&nbsp;
    &lt;target name=&quot;zip&quot; depends=&quot;svn&quot; description=&quot;Compress project files&quot;&gt;
        &lt;jar destfile=&quot;${env.WORKSPACE}/prj.zip&quot;
            basedir=&quot;${env.WORKSPACE}/code&quot;
            excludes=&quot;.svn&quot; /&gt;
    &lt;/target&gt;
&nbsp;
   &lt;target name=&quot;build&quot; depends=&quot;zip&quot; /&gt;
&lt;/project&gt;</pre></td></tr></table></div>

<p>Все остальные операции выполняются на стороне deployment хоста после передачи результатов этого шага с помощью &#8216;Send files or execute commands over SSH&#8217;.</p>
<p>Надеюсь, мои пояснения помогут вам создать Ant build ещё лучше и ещё быстрее. </p>
<p>Прежде всего, хочу сказать, что если вы запутаетесь с путями &#8211; вставьте в ваш Ант файл следующий target и тогда в логе build-a вы увидите какими путями оперирует Jenkins.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code146'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343146"><td class="code" id="p2343code146"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;test&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;Jenkins workspace: ${env.WORKSPACE}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;Job directory: ${env.WORKSPACE}/../../${env.JOB_NAME}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;echo</span> <span style="color: #000066;">message</span>=<span style="color: #ff0000;">&quot;Build data: ${env.WORKSPACE}/../../${env.JOB_NAME}/builds/${env.BUILD_ID}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>В строках 4-6 мы даём более краткие имена (aliases),чтобы дальше было удобнее прописывать пути.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code147'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343147"><td class="code" id="p2343code147"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;tests&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/tests&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;ci&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/ci&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;code&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/code&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></td></tr></table></div>

<p>Далее (строки 8-12) наша задача создать конфигурационный файл приложения. Как мы <a href="http://www.deepshiftlabs.com/sel_blog/?p=2255&#038;lang=ru#anchor1">писали ранее</a> наше приложение, загружаемое и инсталлируется с помощью поставляемого с ним инсталляционного скрипта. Здесь же мы просто используем sed для превращения заготовки используемой инсталляционным скриптом Settings.class.template в нужный нам конфигурационный файл Settings.class.php.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code148'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343148"><td class="code" id="p2343code148"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;make_settings&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;sed&quot;</span> <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${code}/config/Settings.class.php.mysql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;-f ${ci}/deployment/config/mysql/settings-mysql.sed ${code}/config/Settings.class.template.php&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Я не буду приводить файлы целиком,  а просто покажу несколько строк из файла заготовки &#8211; Settings.class.template, несколько строк settings-mysql.sed файла и те же строки во вновь созданном конфигурационном файле Settings.class.php.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code149'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343149"><td class="code" id="p2343code149"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Database IP or hostname (use colon, if runs on non-standard port: 127.0.0.1:563)</span>
    <span style="color: #000000; font-weight: bold;">const</span> DB_HOST <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Username to connect to DB</span>
    <span style="color: #000000; font-weight: bold;">const</span> DB_USER <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>


<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code150'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343150"><td class="code" id="p2343code150"><pre class="bash" style="font-family:monospace;">s<span style="color: #000000; font-weight: bold;">/</span>const DB_USER = <span style="color: #ff0000;">&quot;&quot;</span>;<span style="color: #000000; font-weight: bold;">/</span>const DB_USER = <span style="color: #ff0000;">&quot;ANSWERS_DB_USER&quot;</span>;<span style="color: #000000; font-weight: bold;">/</span>g
s<span style="color: #000000; font-weight: bold;">/</span>const DB_HOST = <span style="color: #ff0000;">&quot;&quot;</span>;<span style="color: #000000; font-weight: bold;">/</span>const DB_HOST = <span style="color: #ff0000;">&quot;localhost&quot;</span>;<span style="color: #000000; font-weight: bold;">/</span>g</pre></td></tr></table></div>


<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code151'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343151"><td class="code" id="p2343code151"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Database IP or hostname (use colon, if runs on non-standard port: 127.0.0.1:563)</span>
    <span style="color: #000000; font-weight: bold;">const</span> DB_HOST <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;localhost&quot;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Username to connect to DB</span>
    <span style="color: #000000; font-weight: bold;">const</span> DB_USER <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;ANSWERS_DB_USER&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Вы видите, что в именах файлов и путях присутствует &#8216;mysql&#8217; Это потому, что мы ещё тестируем наше приложение с PostgreSQL. Я убрал все, что касается PostgreSQL из описания и, как и обещал, приведу реальные конфиги в самом конце цикла. Сам не люблю, когда объясняя мне что-то новое, вываливают кучу не важной информации, от которой всё только запутывается.</p>
<p>В результате этого шага мы получили конфигурационный файл приложения для работы с MySQL &#8211; Settings.class.php.mysql, который лежит рядышком с Settings.class.template.php в папке ${code}/config/.</p>
<p>В строках 14-18 мы создаём необходимый SQL файл, который, будучи запущенным на deployment хосте, пересоздаст MySQL базу данных приложения.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code152'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343152"><td class="code" id="p2343code152"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;make_sql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;sed&quot;</span> <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${code}/install/mysql.sql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;-f ${ci}/deployment/config/mysql/install-mysql.sed ${code}/install/mysql.sql&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Опять же, инсталлятор Answers использует заранее приготовленный файл mysql.sql в котором в процессе установки, на основании введённых пользователей данных, заменяются, например, имена таблиц, но мы можем его использовать практически без изменений. Изменения, которые необходимы, делаем с помощью sed. В данном случае модифицируем оригинальный файл ${code}/install/mysql.sql.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code153'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343153"><td class="code" id="p2343code153"><pre class="bash" style="font-family:monospace;">s<span style="color: #000000; font-weight: bold;">/</span>USERS_TABLE<span style="color: #000000; font-weight: bold;">/</span>USERS_VIEW_NAME<span style="color: #000000; font-weight: bold;">/</span>g
s<span style="color: #000000; font-weight: bold;">/</span>USE ANSWERS_DATABASE<span style="color: #000000; font-weight: bold;">/</span>USE answers<span style="color: #000000; font-weight: bold;">/</span>g</pre></td></tr></table></div>

<p>Идём далее &#8211; target &#8220;move_files&#8221; (строки 20-30). Как вы наверное помните, наше приложение встраиваемое и не имеет своей собственной страницы авторизации. Однако для тестирования нам нугны страницы login и logout, которые мы и создали. Лежат они в ${ci}/deployment/misc/ и теперь самое время передвинуть их в корень приложения &#8211; ${code}/, так как этими страницами будут пользоваться Selenium тесты (строки 21-23).</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code154'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343154"><td class="code" id="p2343code154"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;move_files&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;make_settings,make_sql&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #808080; font-style: italic;">&lt;!-- Move authentication files to WAUT root --&gt;</span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/misc/login.php&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${code}/login.php&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/misc/logout.php&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${code}/logout.php&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
        <span style="color: #808080; font-style: italic;">&lt;!-- Move MySQL db creation files to install folder --&gt;</span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/config/mysql/crt-mysql.sql&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${code}/install/crt-mysql.sql&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
        <span style="color: #808080; font-style: italic;">&lt;!-- Move publish script to the workspace root, so it will be beside prj.zip --&gt;</span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;move</span> <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/publish-over-ssh/publish.sh&quot;</span> <span style="color: #000066;">tofile</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/publish.sh&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>В строках 25-26 мы перемещаем ещё один SQL файл &#8211; crt-mysql.sql, из ${ci}/deployment/config/mysql/ в ${code}/install/, так как мы отправляем на deployment хост только содержимое ${code}/. </p>
<p>Что же находится в файле crt-mysql.sql? Здесь опять из за встраиваемости приложения, которое создаёт свои таблицы в базе данных вашего основного приложения ннам нужно как бы (пере)создать базу этого основного приложения, чтобы потом после этого мы смогли бы выполнить файл mysql.sql, который мы подготовили ранее. То есть роль скрипта &#8211; пересоздание базы, создание &#8220;основного&#8221; приложения и его пользователей и удаление пользователя базы, которого создал предыдущий deployment. Вот так он выглядит без купюр:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code155'); return false;">View Code</a> SQL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343155"><td class="code" id="p2343code155"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> answers;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> answers;
<span style="color: #993333; font-weight: bold;">use</span> answers;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">if</span> <span style="color: #993333; font-weight: bold;">exists</span> USERS_SOURCE_TABLE;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`USERS_SOURCE_TABLE`</span> <span style="color: #66cc66;">&#40;</span>
  USERS_ID_COLUMN int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
  username varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
  USERS_DISPLAY_NAME_COLUMN varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
  USERS_EMAIL_COLUMN varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
  CONSTRAINT USERS_SOURCE_TABLE_pkey <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>USERS_ID_COLUMN<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> ENGINE<span style="color: #66cc66;">=</span>InnoDB <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARSET<span style="color: #66cc66;">=</span>utf8;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> USERS_SOURCE_TABLE <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'answ_test_admin@dslabs.lan'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Arnie - Admin'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'answ_test_admin@dslabs.lan'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> USERS_SOURCE_TABLE <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'answ_test_user@dslabs.lan'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Ivan Danko - Captain'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'answ_test_user@dslabs.lan'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> USERS_SOURCE_TABLE <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'answ_test_staff@dslabs.lan'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Lee - Guru(Staff)'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'answ_test_staff@dslabs.lan'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> USER <span style="color: #ff0000;">'ANSWERS_DB_USER'</span>@localhost;
<span style="color: #993333; font-weight: bold;">FLUSH</span> PRIVILEGES;</pre></td></tr></table></div>

<p>И в заключение этой части в строках 28-29, мы переносим скрипт publish.sh в корень Jenkins workspace. Этот скрипт знает, что делать с запакованным в zip /code, который мы подготовили. О его содержимом мы поговорим, когда будем описывать шаг &#8216;Send files or execute commands over SSH&#8217;.</p>
<p>В строках 32-43 мы сохраняем информацию о коммите, который будем тестировать в текстовый файл.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code156'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343156"><td class="code" id="p2343code156"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;save_commit_info&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;move_files&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}&quot;</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;svn&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span></span>
                    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;--username jenkins --password 123456 upgrade&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>    
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}&quot;</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;svn&quot;</span>  <span style="color: #000066;">output</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/version.txt&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>  
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;--username jenkins --password 123456 log -r ${env.SVN_REVISION}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;exec</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}&quot;</span> <span style="color: #000066;">executable</span>=<span style="color: #ff0000;">&quot;svn&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>  
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">line</span>=<span style="color: #ff0000;">&quot;--username jenkins --password 123456 log -r ${env.SVN_REVISION}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/exec<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>                  
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>В строках 33-35 у меня находится решение проблемы, когда ваш SVN сервер работает на более высокой версии, чем поддерживается Jenkins SVN плагином. Так может случиться. В этом случае команда ‘svn info’ выдаёт ошибку о несовпадении версий и просит сделать upgrade рабочей копии, что я и делаю до выполнения ‘svn info’. Строки 39-41 только для того чтобы та же информация попала в консольный лог Jenkins. Эту информацию мы преобразуем на следующем шаге в более приятный формат и добавим позже в описание Nerrvana test run.</p>
<p>Теперь мы используем написанную нами и доступную на GitHub (link) утилитку, которая получает на входе такой файл и &#8230;</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code157'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343157"><td class="code" id="p2343code157"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#cat version.txt</span>
<span style="color: #660033;">------------------------------------------------------------------------</span>
r69 <span style="color: #000000; font-weight: bold;">|</span> igork <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000;">2012</span>-<span style="color: #000000;">10</span>-03 07:<span style="color: #000000;">38</span>:<span style="color: #000000;">38</span> +0000 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Wed, 03 Oct <span style="color: #000000;">2012</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000;">1</span> line
&nbsp;
Fixed bug <span style="color: #666666; font-style: italic;">#342</span>
<span style="color: #660033;">------------------------------------------------------------------------</span></pre></td></tr></table></div>

<p>&#8230; преобразовывает его в такой.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code158'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343158"><td class="code" id="p2343code158"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#cat version.txt</span>
Revision: <span style="color: #000000;">69</span>
Committer: igork
Date: <span style="color: #000000;">2012</span>-<span style="color: #000000;">10</span>-03 07:<span style="color: #000000;">38</span>:<span style="color: #000000;">38</span> +0000 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Wed, 03 Oct <span style="color: #000000;">2012</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
Fixed bug <span style="color: #666666; font-style: italic;">#342</span></pre></td></tr></table></div>

<p>Вы можете расширить наш код, добавив поддержку системы контроля версий, которую используете вы, если она окажется вам полезной.</p>
<p>Вот так это делается:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code159'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343159"><td class="code" id="p2343code159"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;svn&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;save_commit_info&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;java</span> <span style="color: #000066;">dir</span>=<span style="color: #ff0000;">&quot;.&quot;</span> <span style="color: #000066;">jar</span>=<span style="color: #ff0000;">&quot;${ci}/deployment/scm-decorator.jar&quot;</span> <span style="color: #000066;">fork</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">failonerror</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;svn&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;arg</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/version.txt&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span> 
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/java<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>       
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Как вы видите специально с учётом возможных расширений предусмотрен параметр <arg value="svn"/>.</p>
<p>И наконец мы zip-уем папку /code/ в строках 51-55 в файл prj.zip.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code160'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343160"><td class="code" id="p2343code160"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;target</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;zip&quot;</span> <span style="color: #000066;">depends</span>=<span style="color: #ff0000;">&quot;svn&quot;</span> <span style="color: #000066;">description</span>=<span style="color: #ff0000;">&quot;Compress project files&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jar</span> <span style="color: #000066;">destfile</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/prj.zip&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">basedir</span>=<span style="color: #ff0000;">&quot;${env.WORKSPACE}/code&quot;</span></span>
<span style="color: #009900;">            <span style="color: #000066;">excludes</span>=<span style="color: #ff0000;">&quot;.svn&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/target<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Переходим к следуюшему шагу build-a (и на сегодня последнему) &#8211; передаче приготовленных файлов и окончание deploymenta-а</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/build_ssh.png" alt="New Jenkins job - Send files or execute commands over SSH" title="New Jenkins job - Send files or execute commands over SSH" /></p>
<p>Вы видите, что мы просим передать на deployment хост (определяется первым параметром &#8211; &#8220;SSH Server&#8221; и мы создали его, когда конфигурировали Jenkins) два файла prj.zip и publish.sh, а также выполнить после передачи:</p>
<p><code>chmod +x publish.sh<br />
./publish.sh</code></p>
<p>Теперь самое время посмотреть, что же делает publish.sh скрипт.</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code161'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343161"><td class="code" id="p2343code161"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
&nbsp;
<span style="color: #007800;">WWW_MYSQL_DIR</span>=<span style="color: #ff0000;">'/var/www/answers/answers_mysql'</span>
<span style="color: #007800;">DB_NAME</span>=<span style="color: #ff0000;">'answers'</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-Rf</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/*</span>
<span style="color: #c20cb9; font-weight: bold;">unzip</span> <span style="color: #660033;">-o</span> prj.zip <span style="color: #660033;">-d</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span>
<span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>Settings.class.php.mysql <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>Settings.class.php
<span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #660033;">-R</span> <span style="color: #000000;">777</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span>
mysql <span style="color: #660033;">-v</span> <span style="color: #660033;">-u</span> root  <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">install</span><span style="color: #000000; font-weight: bold;">/</span>crt-mysql.sql
mysql <span style="color: #660033;">-v</span> <span style="color: #660033;">-u</span> root  <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">install</span><span style="color: #000000; font-weight: bold;">/</span>mysql.sql <span style="color: #007800;">$DB_NAME</span></pre></td></tr></table></div>

<p>Чистит папку веб сервера:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code162'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343162"><td class="code" id="p2343code162"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-Rf</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/*</span></pre></td></tr></table></div>

<p>Распаковывает туда Answers:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code163'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343163"><td class="code" id="p2343code163"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">unzip</span> <span style="color: #660033;">-o</span> prj.zip <span style="color: #660033;">-d</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span></pre></td></tr></table></div>

<p>Переименовывает подготовленный конфигурационный файл для MySQL:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code164'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343164"><td class="code" id="p2343code164"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>Settings.class.php.mysql <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>Settings.class.php</pre></td></tr></table></div>

<p>Устанавливает права на файлы нашего приложения (мы могли бы быть здесь немножечко консервативнее):</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code165'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343165"><td class="code" id="p2343code165"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #660033;">-R</span> <span style="color: #000000;">777</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span></pre></td></tr></table></div>

<p>Создаёт &#8216;основное&#8217; приложение (-v добавлено для verbose вывода работы SQL скрипта в консольный лог Jenkins):</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code166'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343166"><td class="code" id="p2343code166"><pre class="bash" style="font-family:monospace;">mysql <span style="color: #660033;">-v</span> <span style="color: #660033;">-u</span> root <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">install</span><span style="color: #000000; font-weight: bold;">/</span>crt-mysql.sql</pre></td></tr></table></div>

<p>Интегрирует в него Answers:</p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code167'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343167"><td class="code" id="p2343code167"><pre class="bash" style="font-family:monospace;">mysql <span style="color: #660033;">-v</span> <span style="color: #660033;">-u</span> root <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #007800;">$WWW_MYSQL_DIR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">install</span><span style="color: #000000; font-weight: bold;">/</span>mysql.sql <span style="color: #007800;">$DB_NAME</span></pre></td></tr></table></div>

<p>Всё готово! Делаем пробный коммит и смотрим консольные логи Jenkins пока не добьёмся работающего приложения на http://deployment_host/answers_mysql.</p>
<p>Как вы видите все файлы, используемые Jenkins-ом находятся в системе контроля версий. Это позволяет не использовать custom workspaces в Jenkins, которые потребовали бы (вначале у нас было именно так и это было неудобно) предварительной конфигурации и поддержки в актуальном состоянии. Все файлы попадают на свои места после извлечения кода Jenkins-ом. Также, при таком подходе, мы можем использовать переменные окружения Jenkins в файлах.</p>
<p>Под спойлером пример консольного лога выполненного build-а, с моими комментариями. Вырезаны и помечены, как вырезанные, логи соответствующие одному шагу (например ‘svn checkout’).</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2343code168'); return false;">View Code</a> TXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p2343168"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
</pre></td><td class="code" id="p2343code168"><pre class="txt" style="font-family:monospace;">Started by an SCM change
Building in workspace /var/lib/jenkins/jobs/Answers_deployment_only/workspace
Cleaning local Directory .
Checking out http://192.168.3.97/repos/answers/trunk at revision 140
A         tests
------ Output removed - comment by Igor --------------------------------- 
AU        ci/deployment/scm-decorator.jar
A         ci/deployment/build.xml
A         ci/toolchain
A         ci/toolchain/build-toolchain.xml
At revision 140
[deployment] $ ant -file build.xml build
Buildfile: build.xml
&nbsp;
make_settings:
&nbsp;
make_sql:
&nbsp;
move_files:
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers_deployment_only/workspace/code
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers_deployment_only/workspace/code/install
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers_deployment_only/workspace
&nbsp;
save_commit_info:
     [exec] Upgraded '.'
------ Output removed - comment by Igor --------------------------------- 
     [exec] Upgraded 'ci/deployment/misc'
     [exec] Upgraded 'ci/toolchain'
     [exec] ------------------------------------------------------------------------
     [exec] r140 | igork | 2012-10-08 11:46:01 +0000 (Mon, 08 Oct 2012) | 1 line
     [exec] 
     [exec] Test 2345
     [exec] ------------------------------------------------------------------------
&nbsp;
svn:
&nbsp;
zip:
      [jar] Building jar: /var/lib/jenkins/jobs/Answers_deployment_only/workspace/prj.zip
&nbsp;
build:
&nbsp;
BUILD SUCCESSFUL
Total time: 0 seconds
SSH: Connecting from host [mantis.deepshiftlabs.com]
SSH: Connecting with configuration [Answers test server] ...
SSH: EXEC: STDOUT/STDERR from command [chmod +x publish.sh
./publish.sh] ...
Archive:  prj.zip
   creating: /var/www/answers/answers_mysql/META-INF/
------ Output removed - comment by Igor ---------------------------------   
  inflating: /var/www/answers/answers_mysql/utils/Utils.class.php  
  inflating: /var/www/answers/answers_mysql/utils/init.php  
--------------
drop database answers
--------------
&nbsp;
--------------
create database answers
--------------
------ Output removed - comment by Igor --------------------------------- 
--------------
GRANT SELECT ON USERS_VIEW_NAME TO 'ANSWERS_DB_USER'@localhost
--------------
&nbsp;
SSH: EXEC: completed after 1,003 ms
SSH: Disconnecting configuration [Answers test server] ...
SSH: Transferred 2 file(s)
Build step 'Send files or execute commands over SSH' changed build result to SUCCESS
Finished: SUCCESS
&nbsp;
1-11 - Jenkins среагировал на коммит и делает check out a fresh copy
12-40  - выполняется build.xml с target build
24-28 - происходит ‘svn upgrade’ рабочей копии
29-33 - файл который декоратор преобразует в простой формат
44-46 - результаты были отправлены на deployment хост и запустился скрипт publish.sh
49-52 - распаковался prj.zip в корень виртуального хоста Apache
53-63 - выполнились SQL скрипты, которые запускает publish.sh</pre></td></tr></table></div>

<p>В следующем посте мы расширим созданную нами Jenkins job и запустим Selenium тесты в <a href="http://www.nerrvana.com" target="_blank">Nerrvana</a>.<br />
</p>
<img src="http://feeds.feedburner.com/~r/deepshiftlabs/PrCF/~4/8PwB3R2kSsc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.deepshiftlabs.com/sel_blog/?feed=rss2&amp;p=2343&amp;lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.deepshiftlabs.com/sel_blog/?p=2343&amp;lang=ru</feedburner:origLink></item>
		<item>
		<title>В копилку виртуализатору – установка Win 7 под Xen</title>
		<link>http://feedproxy.google.com/~r/deepshiftlabs/PrCF/~3/-K_kOrsLZzY/</link>
		<comments>http://www.deepshiftlabs.com/sel_blog/?p=2340&amp;lang=ru#comments</comments>
		<pubDate>Fri, 12 Oct 2012 04:13:00 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.deepshiftlabs.com/sel_blog/?p=2340</guid>
		<description><![CDATA[Этот пост является продолжением двух предыдущих постов. Первый рассказывает об установке Xen и второй &#8211; о минимизации Windows 7 для работы с Selenium. По сути нами вырезано максимум компонентов, так как нам нужны только браузеры. Сейчас мы покажем, как установить созданный нами мини-Windows 7, как виртуальную машину Xen (процесс установки со стандартного образа Windows 7 [...]]]></description>
			<content:encoded><![CDATA[<div style="float: left;"><img style="padding: 5px 20px 10px 0;" title="Virtualizer toolbox - install Win 7 on Xen" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/08/win_7_xen_300.gif" alt="Virtualizer toolbox - install Win 7 on Xen" /></div>
<p>Этот пост является продолжением двух предыдущих постов. <a href="http://www.deepshiftlabs.com/sel_blog/?p=2338&#038;lang=ru" target="_blank">Первый</a> рассказывает об установке Xen и <a href="http://www.deepshiftlabs.com/sel_blog/?p=2499&#038;lang=ru" target="_blank">второй</a> &#8211; о минимизации Windows 7 для работы с Selenium. По сути нами вырезано максимум компонентов, так как нам нужны только браузеры.</p>
<p>Сейчас мы покажем, как установить созданный нами мини-Windows 7, как виртуальную машину Xen (процесс установки со стандартного образа Windows 7 будет таким же, за исключением того, что вам, возможно, понадобится создать logical volume чуть большего размера). </p>
<p>В посте об <a href="http://www.deepshiftlabs.com/sel_blog/?p=2338&#038;lang=ru" target="_blank">установке Xen</a> мы за уже создали логический том командой &#8230;</p>
<p><strong>#lvcreate &#8211;size 7G &#8211;name win7 vg0</strong></p>
<p>&#8230; запустили VNC сервер, подсоединились к хосту с помощью VNC Viewer, запустили Virtual Machine Manager и, наконец, нажали кнопочку &#8216;New&#8217;.</p>
<p>Далее всё очень просто.<br />
<span id="more-2340"></span><br />
<img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/11.png" title="Step 1 - Virtual Machine Creation" alt="Step 1 - Virtual Machine Creation" /></p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/22.png" title="Step 2 - Virtual Machine Name" alt="Step 2 - Virtual Machine Name" /></p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/33.png" title="Step 3 - Virtualization Method" alt="Step 3 - Virtualization Method" /></p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/44.png" title="Step 4 - Installation Method" alt="Step 4 - Installation Method" /></p>
<p>Это установочный образ минимизированного нами Windows 7.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/55.png" title="Step 5 - Installation Media" alt="Step 5 - Installation Media" /></p>
<p>Созданный нами logical volume.</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/66.png" title="Step 6 - Storage" alt="Step 6 - Storage" /></p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/77.png" title="Step 7 - Network" alt="Step 7 - Network" /></p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/88.png" title="Step 8 - Memory and CPU allocation" alt="Step 8 - Memory and CPU allocation" /></p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/99.png" title="Step 9 - Finish Virtual Machine Creation" alt="Step 9 - Finish Virtual Machine Creation" /></p>
<p>Установка началась &#8230;</p>
<p><img class="aligncenter" style="-ms-interpolation-mode: bicubic;" src="http://www.deepshiftlabs.com/sel_blog/wp-content/uploads/2012/10/99a.png" title="Win 7 install is running now" alt="Win 7 install is running now" /><br />
</p>
<img src="http://feeds.feedburner.com/~r/deepshiftlabs/PrCF/~4/-K_kOrsLZzY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.deepshiftlabs.com/sel_blog/?feed=rss2&amp;p=2340&amp;lang=ru</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.deepshiftlabs.com/sel_blog/?p=2340&amp;lang=ru</feedburner:origLink></item>
	</channel>
</rss>
