|
From: <lac...@us...> - 2007-10-04 09:47:40
|
Revision: 36
http://td2jira.svn.sourceforge.net/td2jira/?rev=36&view=rev
Author: lacostej
Date: 2007-10-04 02:47:42 -0700 (Thu, 04 Oct 2007)
Log Message:
-----------
reformat site front page
Modified Paths:
--------------
trunk/td2jira/docs/index.html
Modified: trunk/td2jira/docs/index.html
===================================================================
--- trunk/td2jira/docs/index.html 2007-10-04 09:47:14 UTC (rev 35)
+++ trunk/td2jira/docs/index.html 2007-10-04 09:47:42 UTC (rev 36)
@@ -2,39 +2,40 @@
<html>
<head>
- <title>Vladimir.Dyuzhev - Test Director To JIRA Sync </title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <style type="text/css">
- #g_title p, #g_footer p, #g_description p {
- margin: 0;
- }
+<title>Vladimir.Dyuzhev - Test Director To JIRA Sync </title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+<style type="text/css">
+#g_title p, #g_footer p, #g_description p {
+ margin: 0;
+}
+
/*
- -- -- -- -- -- -- --
- Browser Fixes
- -- -- -- -- -- -- --
-
- This file uses CSS filtering methods to fix various
- layout bugs.
+ -- -- -- -- -- -- --
+ Browser Fixes
+ -- -- -- -- -- -- --
- Each of the following three imported files is a
- separate, browser-specific CSS file that keeps all
- hacks out of the main style sheet.
-
- Over time, as supporting these browsers no longer
- remains a priority, cleaning up the hacks is as
- easy as deleting the @import statement below, or
- simply no longer linking this file from the HTML.
-
+ This file uses CSS filtering methods to fix various
+ layout bugs.
+
+ Each of the following three imported files is a
+ separate, browser-specific CSS file that keeps all
+ hacks out of the main style sheet.
+
+ Over time, as supporting these browsers no longer
+ remains a priority, cleaning up the hacks is as
+ easy as deleting the @import statement below, or
+ simply no longer linking this file from the HTML.
+
*/
/*
fix ie6 "peekaboo bug" using the "holly hack".
Note, this style only gets applied to ie6
*/
- * html .wrapper {
- height: 0.1%;
- }
+* html .wrapper {
+ height: 0.1%;
+}
/*
* IE5 mac - overrides the IE/Win hack
@@ -48,40 +49,48 @@
/**/
+ /*
+ * IE5/Win-specific CSS -ensures #container wraps all content on window resize
+ */
- /*
- * IE5/Win-specific CSS -ensures #container wraps all content on window resize
- */
+@media
+tty
+{
+i {
+ content: "\";/*" "*/}} * html #container { height: 1%; } /*";
+}
- @media tty {
- i{content:"\";/*" "*/}} * html #container { height: 1%; } /*";}
- }/* */
- /* Styling for editable elements. Eventually, this will be part of the style. */
- .editable {
- border: 1px dashed blue;
- }
-
- #footer {
- clear: both;
- }
-
- /* Extra divs hidden by default. The custom CSS can override this though */
- #extraDiv1, #extraDiv2, #extraDiv3, #extraDiv4, #extraDiv5, #extraDiv6 {
- display: none;
- }
-
- a img,:link img,:visited img {border: none;}
+}
+/* */
+/* Styling for editable elements. Eventually, this will be part of the style. */
+.editable {
+ border: 1px dashed blue;
+}
+#footer {
+ clear: both;
+}
- body {
- text-align: center;
- }
- #container {
- width: 718px;
- text-align: left;
- margin: 0 auto;
- }
- /** BEGIN CUSTOM SKIN **/
+/* Extra divs hidden by default. The custom CSS can override this though */
+#extraDiv1, #extraDiv2, #extraDiv3, #extraDiv4, #extraDiv5, #extraDiv6 {
+ display: none;
+}
+
+a img, :link img, :visited img {
+ border: none;
+}
+
+body {
+ text-align: center;
+}
+
+#container {
+ width: 718px;
+ text-align: left;
+ margin: 0 auto;
+}
+
+/** BEGIN CUSTOM SKIN **/
/*
-- -- -- -- -- -- --
@@ -93,158 +102,528 @@
*/
- h1,h2,h3,h4,h5,h6,pre,code,p {font-size: 1em;}
- dl,li,dt,dd,h1,h2,h3,h4,h5,h6,pre,form,body,html,p,blockquote,fieldset,input {margin: 0; padding: 0;}
- a img,:link img,:visited img {border: none;}
- address {font-style: normal;}html {background:#eee;}
- body {background:#eee;font-family:'Verdana','Helvetica', 'Arial', sans-serif;font-size:0.85em;}
- a {color:#00c;text-decoration:underline !important;}
- a:visited {color:#551a8b;}
- b, strong {font-weight:bold;}
- blockquote {border-left:1px solid #ccc;margin:1em 3em;padding-left:1em;font-size:0.9em;}
- blockquote p {line-height:1.45em;}
- em {font-style:italic;}
- h1, h2, h3, h4, h5, h6 {font-weight:normal;margin:1.5em 0 0.5em 0;}
- h1 {font-size:2.25em;color:#666;margin:0;}
- h2 {font-size:1.5em;color:#333;}
- h3 {font-size:1.3em;}
- h4 {font-size:1.15em;}
- h5 {font-size:1em;}
- h6 {font-size:0.8em;}
- p, li {color:#000;line-height:1.75em;margin:0 0 1.5em 0;}
- blockquote p, table p, dd p, li p, #header p {margin-bottom:0.5em;}
- ul, ol {margin:1em 0; padding-left: 1.6em;}
- li {margin:0.25em 0;}
- ul li {list-style-type:disc;}
- ol li {list-style-type:decimal;}
- table {border:1px solid #ccc;border-width:1px 1px 0 1px;}
- table caption {display:block;font-style:italic;white-space:nowrap;margin:0.5em 1em;}
- table td, table th {padding:0.5em 1em;text-align:left;vertical-align:top;}
- table th {font-weight:bold;border-bottom:1px solid #999;}
- table td {border-bottom:1px solid #ddd;}
+h1, h2, h3, h4, h5, h6, pre, code, p {
+ font-size: 1em;
+}
- dl {margin:1em;line-height:1.5em;list-style-type:disc;}
- dt {font-weight:bold;margin-top:0.5em;}
- dd {margin-left:2em;}
+dl, li, dt, dd, h1, h2, h3, h4, h5, h6, pre, form, body, html, p, blockquote, fieldset, input {
+ margin: 0;
+ padding: 0;
+}
- #adsense {text-align:center;}
- #container {
- padding: 25px 40px 10px 40px;
- border: 1px solid #ccc;
- background:#fff;
- margin:1em auto;
- }
- #footer {border-top:1px solid #ccc;margin-top:2em;}
- #header {border-bottom:1px solid #ccc;margin-bottom:2em;}
- #sidebar {font-size:1.0em;}
- #sidebar :first-child {margin-top:0;}
- #sidebar-alternate {font-size:1.0em;}
- #sidebar-alternate :first-child {margin-top:0;}
- #main-content {background:#fff;}
- #main-content h2:first-child {margin-top:0;}
+a img, :link img, :visited img {
+ border: none;
+}
- @media print {
- html {background:#fff !important;}
- #container {border-width:0px !important;padding:0 !important;}
- }
+address {
+ font-style: normal;
+}
+html {
+ background: #eee;
+}
+
+body {
+ background: #eee;
+ font-family: 'Verdana', 'Helvetica', 'Arial', sans-serif;
+ font-size: 0.85em;
+}
+
+a {
+ color: #00c;
+ text-decoration: underline !important;
+}
+
+a:visited {
+ color: #551a8b;
+}
+
+b, strong {
+ font-weight: bold;
+}
+
+blockquote {
+ border-left: 1px solid #ccc;
+ margin: 1em 3em;
+ padding-left: 1em;
+ font-size: 0.9em;
+}
+
+blockquote p {
+ line-height: 1.45em;
+}
+
+em {
+ font-style: italic;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-weight: normal;
+ margin: 1.5em 0 0.5em 0;
+}
+
+h1 {
+ font-size: 2.25em;
+ color: #666;
+ margin: 0;
+}
+
+h2 {
+ font-size: 1.5em;
+ color: #333;
+}
+
+h3 {
+ font-size: 1.3em;
+}
+
+h4 {
+ font-size: 1.15em;
+}
+
+h5 {
+ font-size: 1em;
+}
+
+h6 {
+ font-size: 0.8em;
+}
+
+p, li {
+ color: #000;
+ line-height: 1.75em;
+ margin: 0 0 1.5em 0;
+}
+
+blockquote p, table p, dd p, li p, #header p {
+ margin-bottom: 0.5em;
+}
+
+ul, ol {
+ margin: 1em 0;
+ padding-left: 1.6em;
+}
+
+li {
+ margin: 0.25em 0;
+}
+
+ul li {
+ list-style-type: disc;
+}
+
+ol li {
+ list-style-type: decimal;
+}
+
+table {
+ border: 1px solid #ccc;
+ border-width: 1px 1px 0 1px;
+}
+
+table caption {
+ display: block;
+ font-style: italic;
+ white-space: nowrap;
+ margin: 0.5em 1em;
+}
+
+table td, table th {
+ padding: 0.5em 1em;
+ text-align: left;
+ vertical-align: top;
+}
+
+table th {
+ font-weight: bold;
+ border-bottom: 1px solid #999;
+}
+
+table td {
+ border-bottom: 1px solid #ddd;
+}
+
+dl {
+ margin: 1em;
+ line-height: 1.5em;
+ list-style-type: disc;
+}
+
+dt {
+ font-weight: bold;
+ margin-top: 0.5em;
+}
+
+dd {
+ margin-left: 2em;
+}
+
+#adsense {
+ text-align: center;
+}
+
+#container {
+ padding: 25px 40px 10px 40px;
+ border: 1px solid #ccc;
+ background: #fff;
+ margin: 1em auto;
+}
+
+#footer {
+ border-top: 1px solid #ccc;
+ margin-top: 2em;
+}
+
+#header {
+ border-bottom: 1px solid #ccc;
+ margin-bottom: 2em;
+}
+
+#sidebar {
+ font-size: 1.0em;
+}
+
+#sidebar :first-child {
+ margin-top: 0;
+}
+
+#sidebar-alternate {
+ font-size: 1.0em;
+}
+
+#sidebar-alternate :first-child {
+ margin-top: 0;
+}
+
+#main-content {
+ background: #fff;
+}
+
+#main-content h2:first-child {
+ margin-top: 0;
+}
+
+@media
+print
+{
+html {
+ background: #fff !important;
+}
+
+#container {
+ border-width: 0px !important;
+ padding: 0 !important;
+}
+
+}
+
/* Tweaks for Three-column layout
----------------------------------------------- */
- #threecolumn #main-content .wrapper {padding:0 25px;}
+#threecolumn #main-content .wrapper {
+ padding: 0 25px;
+}
/* Tweaks for Two-column Left layout
----------------------------------------------- */
- #twocolumn-left #main-content .wrapper {padding-left:25px;}
+#twocolumn-left #main-content .wrapper {
+ padding-left: 25px;
+}
/* Tweaks for Two-column Right layout
----------------------------------------------- */
- #twocolumn-right #main-content .wrapper {padding-right:25px;}
+#twocolumn-right #main-content .wrapper {
+ padding-right: 25px;
+}
/* Tweaks for Two-column Liquid layout
----------------------------------------------- */
- #twocolumn-liquid-right #container {margin:1em 1em;}
- #twocolumn-liquid-right #main-content .wrapper {padding-right:25px;}
- #twocolumn-liquid-left #container {margin:1em 1em;}
- #twocolumn-liquid-left #main-content .wrapper {padding-left:25px;}
+#twocolumn-liquid-right #container {
+ margin: 1em 1em;
+}
+#twocolumn-liquid-right #main-content .wrapper {
+ padding-right: 25px;
+}
+
+#twocolumn-liquid-left #container {
+ margin: 1em 1em;
+}
+
+#twocolumn-liquid-left #main-content .wrapper {
+ padding-left: 25px;
+}
+
/* Tweaks for One-column Liquid layout
----------------------------------------------- */
/* Tweaks for One-column layout
----------------------------------------------- */
- #onecolumn #main-content .wrapper {padding-left:0;}
+#onecolumn #main-content .wrapper {
+ padding-left: 0;
+}
- /* ie5win */
- @media tty { i{content:"\";/*" "*/}} * html #container { padding: 25px 0px 10px 10px; } /*";}
- }/* */
+/* ie5win */
+@media
+tty
+{
+i {
+ content: "\";/*" "*/}} * html #container { padding: 25px 0px 10px 10px; } /*";
+}
- /** END CUSTOM SKIN **/
- </style>
+}
+/* */
- <!-- Hack to avoid flash of unstyled content in IE -->
- <script> </script>
+/** END CUSTOM SKIN **/
+</style>
+
+<!-- Hack to avoid flash of unstyled content in IE -->
+<script></script>
</head>
<body id="onecolumn">
- <div id="container">
- <div class="wrapper">
- <div id="header">
- <div class="wrapper">
- <h1 id="page-title"><div id='g_title'><p style="text-align: left;">Test Director To JIRA Sync </p></div></h1>
- <div style="clear: both;"></div>
- <p class="description"><div id='g_description'><p style="text-align: left;">Quick'n'Dirty Way to Share The Issues With Your QA Team<br> </p></div></p>
- <div style="clear: both"></div>
- </div>
+<div id="container">
+ <div class="wrapper">
+ <div id="header">
+ <div class="wrapper">
+ <h1 id="page-title">
+
+ <div id='g_title'><p style="text-align: left;">Test Director To JIRA Sync </p></div>
+ </h1>
+ <div style="clear: both;"></div>
+ <p class="description">
+
+ <div id='g_description'><p style="text-align: left;">Quick'n'Dirty Way to Share The Issues With Your QA
+ Team<br></p></div>
+ </p>
+ <div style="clear: both"></div>
</div>
- <!-- /editable --><!-- /wrapper --><!-- /header -->
- <div id="main-content">
-
- <div class="wrapper">
- <div class="content-item "><div id='g_body'><h2>What it is and How it works<br></h2><p>This is a small application that allows developers (who use JIRA issue tracker) and QA Team (who uses Test Director/Quality Center 9) to synchronize issues and comments. Typically during SIT or UAT cycle QA record found issues in TestDirector, and developers should take care of them. But developers prefer to use JIRA (which is superior as a <b>developer's </b>tool). Developers have workflows defined in JIRA. Developers also don't want to share all the internal communication happening during issues resolution (in fact, TD has a limit for dev comments field, so extensive conversations could not be stored in TD). TD2JIRA allows QA work with TD, and developers work with JIRA, while having the same issues information.<br></p><p>When TD2JIRA<b> </b>runs, it loads all the issues from specified TD project, and finds (or creates) a corresponding issue in JIRA project. New TD comments get copied into JIRA issue. New TD file attachments get copied into JIRA too. Specially marked JIRA comments (those that <b>should be</b> read by QA) are copied back into TD. TD2JIRA also updates AssignedTo field in TD to bring it in sync with JIRA, so management can see who's working on a particular task.<br></p><p>Only the issues created in TD get pushed into JIRA, not the other way around. It's TD2JIRA, not JIRA2TD.</p><p>TD2JIRA has a (primitive) rule-engine built-in, so every team can adjust the logic according to their workflow and requirements.</p><p>N.B. To track TD-based JIRA issues, TD2JIRA uses Summary prefix. By default, it's "DEFECT", so if we have a TD issue 123 with summary "A Bug", then JIRA issue would have a summary "DEFECT 123: A Bug". Please choose your prefix (jira.summary.prefix property) to be unique enough for a full-text search.<br></p><h2>Download</h2><p>Latest packaged version can be downloaded here: <a href="http://td2jira.sourceforge.net/td2jira.zip">td2jira.zip</a> </p><h2>Installation</h2><p>TD2JIRA runs <b>only</b> on Windows. Not my fault: TD remote interface is DCOM, and the only (free) way to talk DCOM from Java is to use native calls on Windows platform. Sorry.<br></p><p>TD2JIRA is distributed as an ant-based Java project. Default target is to start synchronization (a.k.a. <i>ant sync</i>). Once started, it will perform it's duty forever, with 5 min sync interval (by default).<br></p><p>There is a file called td2jira.properties, which can be modified to adjust to your environment. By default the file defines a fake TD project (a mock) connected to jira.atlassian.com TST project:</p><p><font size="2"><span style="font-family: courier new,monospace;"># JIRA connection data</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">jira.url=http://jira.atlassian.com</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">jira.user=myid</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">jira.password=mypassword</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">jira.project=TST</span></font><br style="font-family: courier new,monospace;"></p><p>but the jira.user and jira.password are not valid -- you'll have to register on http://jira.atlassian.com to make it work. TD settings, although specified in the property file, are not in effect because of another property:</p><p><font size="2"><span style="font-family: courier new,monospace;"># TD connection Implementation</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">td.implementation=td2jira.td.api.mock.Connection</span></font><br></p><p>This means that instead of connecting to "real" TD installation, TD2JIRA will generate TD issues internally, add comments and attachments to them, and walk them through workflow. This mode helps to play with TD2JIRA and your environment before bothering QA team. I recommend you to setup an empty test project in JIRA, and point TD2JIRA with mock connection there. When you're sure all information is propagated correctly (no duplicate issues or comments, files are not corrupted, ...) you may try connect TD2JIRA to real TD, still pointing to the test JIRA project (better create another, clean, one). And only when it's still OK, move into real-TD-to-real-JIRA mode.</p><p>There are a plenty of other configuration properties in td2jira.properties, but they are either self-describing, or have comments, so I'll skip them altogether.<br></p><h2>Default Rules<br></h2><p>There is a set of rules that comes with the distribution. These rules are not the best by any means, these are just the rules used in the company I'm currently working for. Nevertheless, I'll describe those rules here to give you an example:</p><p><font size="2">1. class=td2jira.sync.impl.SyncIssues;<br>2. class=td2jira.sync.impl.SyncAttachments;<br>3. td.status=Closed|Rejected,jira.status=Open|Assigned To Fix|Assigned To Merge|Assigned To Review|Resolved,class=td2jira.sync.impl.CloseJiraIssue;<br>4. td.status=Reopen|Assigned,jira=null,class=td2jira.sync.impl.CreateJiraIssue;<br>5. td.status=New|Open|Reopen|Assigned,jira.status=Resolved,class=td2jira.sync.impl.MarkTdIssueAsFixed; 6. td.status=Reopen|Assigned,jira.status=Closed,class=td2jira.sync.impl.RecreateJiraIssue;<br>7. td.status=Fixed,jira.status=Closed,class=td2jira.sync.impl.AskToRetest;</font><br></p><p>which means:</p><ul><li>sync issues comments first (regardless ofl statuses)</li><li>sync attachments (from TD issue to JIRA issue)</li><li>if TD issue is Closed or Rejected, and JIRA issue is Open or Assigned or ... then close JIRA issue</li><li>if TD issue is Reopened or Assigned, and no JIRA issue found, create JIRA issue</li><li>... and so on</li></ul><p>Basically, it's a simple rule engine. You may create your own handlers (implementing td2jira.sync.impl.IProcessIssuePair). See existing implementations for details.</p><h2>Two ways to access JIRA</h2><p>JIRA has SOAP and XML-RPC interfaces. Despite SOAP API is much more powerful, the default for TD2JIRA is XML-RPC. The reason is that SOAP API is not compatible among even minor versions of JIRA (new methods, new fields in types), while XML-RPC works almost always. In light of mentioned above bug with addAttachmentsToIssue, there is no real reason to use SOAP out of the box until Atlassian stabilize their SOAP API for major operations. </p><p>The access mode is switched by the property:</p><p><font size="2"><span style="font-family: courier new,monospace;"># Connector Implementation</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">jira.connector.implementation=td2jira.jira.xmlrpc.JIRAXmlRpcConnector</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"># jira.connector.implementation=td2jira.jira.soap.JIRASoapConnector</span></font><br></p><h2>Limitations</h2><p>Current version (1.0) doesn't support copying attachments via SOAP. Instead, it does a HTTP POST to AttachFile JSP. The reason is twofold. First, the JIRA WSDL file seems to be incorrect, and uses byte[][] instead of base64-encoded files. In fact, modern WS tools (including JAXB and .NET 2.0) refuse to compile the WSDL. Axis 1.4 happily compiles it though, but (it's second) resulting message is enormous in size (700K for 3K file, grows proportionally). Hence, the WSDL's addAttachmentToIssue() method is unusable. <br></p><h2>F.A.Q.</h2><p>Q1. Does TD2JIRA support HTTP proxy? </p><p>A1: It does. In fact, it even supports proxy authorization. I failed to use NTLM authentication in attach file though. The request comes through, it looks like, but something is still wrong, and JIRA fails.</p><p>Q2: How to make TD2JIRA copy a comment from JIRA to TD?</p><p>A2: Provide a "2qa:" prefix to your comment. TD2JIRA will create a matching comment in TD. To assign the task to someone in TD use "2qa:tduserid", like here:</p><p><span style="font-family: courier new,monospace;">2qa: Please retest<br>2qa:johnmk This works as documented, please reject</span></p><p><span style="font-family: arial,sans-serif;"></span>In fact, it's a hackish way. The Right Way (tm) would be to check the JIRA comment group (visible to developers, ...) and copy it to TD if it's visible to everyone. It's not hard to do. Anyone?</p><p>Q3: Can TD2JIRA be used to sync TD and/or JIRA with <insert your legacy tool here>?</p><p>A3: Not out of the box. But the logic and design (well, it's too simple for calling it "architecture") of the application can be used as a template for creating similar tools (or even plugging in more target applications into TD2JIRA itself).<br></p><h2>Support</h2><p>No support whatsoever. I can answer some general questions, but don't expect me to modify TD2JIRA for your needs. You're developers, figure it out yourselves!<br></p><h2>License</h2><p>BSD-Style:</p><p>
- Redistribution and use in source and binary forms,
- with or without modification, are permitted provided
- that the following conditions are met:
- </p>
+ </div>
+ <!-- /editable --><!-- /wrapper --><!-- /header -->
+ <div id="main-content">
- <ul><li>
- Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- </li><li>
- Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- </li></ul>
+ <div class="wrapper">
+ <div class="content-item ">
+ <div id='g_body'><h2>What it is and How it works<br></h2>
- <p>
- <b>
- THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</b></p><h2><b>Author</b></h2><p>This software was designed and implemented by me, <a href="http://vladimir-dyuzhev.net">Vladimir Dyuzhev</a>. Feel free to <a href="mailto:Vla...@gm...">email</a> me.<br></p><p>
- </p><p></p></div></div>
- <div style="clear: both"></div>
+ <p>This is a small application that allows developers (who use JIRA issue tracker) and QA Team (who uses
+ Test Director/Quality Center 9) to synchronize issues and comments. Typically during SIT or UAT cycle QA
+ record found issues in TestDirector, and developers should take care of them. But developers prefer to use
+ JIRA (which is superior as a <b>developer's </b>tool). Developers have workflows defined in JIRA.
+ Developers also don't want to share all the internal communication happening during issues resolution
+ (in fact, TD has a limit for dev comments field, so extensive conversations could not be stored in TD).
+ TD2JIRA allows QA work with TD, and developers work with JIRA, while having the same issues
+ information.<br></p>
+
+ <p>When TD2JIRA<b> </b>runs, it loads all the issues from specified TD project, and finds (or creates) a
+ corresponding issue in JIRA project. New TD comments get copied into JIRA issue. New TD file attachments
+ get copied into JIRA too. Specially marked JIRA comments (those that <b>should be</b> read by QA) are
+ copied back into TD. TD2JIRA also updates AssignedTo field in TD to bring it in sync with JIRA, so
+ management can see who's working on a particular task.<br></p>
+
+ <p>Only the issues created in TD get pushed into JIRA, not the other way around. It's TD2JIRA, not
+ JIRA2TD.</p>
+
+ <p>TD2JIRA has a (primitive) rule-engine built-in, so every team can adjust the logic according to their
+ workflow and requirements.</p>
+
+ <p>N.B. To track TD-based JIRA issues, TD2JIRA uses Summary prefix. By default, it's "DEFECT",
+ so if we have a TD issue 123 with summary "A Bug", then JIRA issue would have a summary "DEFECT
+ 123: A Bug". Please choose your prefix (jira.summary.prefix property) to be unique enough for a
+ full-text search.<br></p>
+
+ <h2>Download</h2>
+
+ <p>Latest packaged version can be downloaded here: <a href="http://td2jira.sourceforge.net/td2jira.zip">td2jira.zip</a>
+ </p>
+
+ <h2>Installation</h2>
+
+ <p>TD2JIRA runs <b>only</b> on Windows. Not my fault: TD remote interface is DCOM, and the only (free) way
+ to talk DCOM from Java is to use native calls on Windows platform. Sorry.<br></p>
+
+ <p>TD2JIRA is distributed as an ant-based Java project. Default target is to start synchronization (a.k.a.
+ <i>ant sync</i>). Once started, it will perform it's duty forever, with 5 min sync interval (by
+ default).<br></p>
+
+ <p>There is a file called td2jira.properties, which can be modified to adjust to your environment. By
+ default the file defines a fake TD project (a mock) connected to jira.atlassian.com TST project:</p>
+
+ <p><font size="2"><span style="font-family: courier new,monospace;"># JIRA connection data</span><br
+ style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">jira.url=http://jira.atlassian.com</span><br
+ style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">jira.user=myid</span><br
+ style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">jira.password=mypassword</span><br
+ style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">jira.project=TST</span></font><br
+ style="font-family: courier new,monospace;"></p>
+
+ <p>but the jira.user and jira.password are not valid -- you'll have to register on
+ http://jira.atlassian.com to make it work. TD settings, although specified in the property file, are not
+ in effect because of another property:</p>
+
+ <p><font size="2"><span style="font-family: courier new,monospace;"># TD connection Implementation</span><br
+ style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">td.implementation=td2jira.td.api.mock.Connection</span></font><br>
+ </p>
+
+ <p>This means that instead of connecting to "real" TD installation, TD2JIRA will generate TD
+ issues internally, add comments and attachments to them, and walk them through workflow. This mode helps
+ to play with TD2JIRA and your environment before bothering QA team. I recommend you to setup an empty test
+ project in JIRA, and point TD2JIRA with mock connection there. When you're sure all information is
+ propagated correctly (no duplicate issues or comments, files are not corrupted, ...) you may try connect
+ TD2JIRA to real TD, still pointing to the test JIRA project (better create another, clean, one). And only
+ when it's still OK, move into real-TD-to-real-JIRA mode.</p>
+
+ <p>There are a plenty of other configuration properties in td2jira.properties, but they are either
+ self-describing, or have comments, so I'll skip them altogether.<br></p>
+
+ <h2>Default Rules<br></h2>
+
+ <p>There is a set of rules that comes with the distribution. These rules are not the best by any means,
+ these are just the rules used in the company I'm currently working for. Nevertheless, I'll
+ describe those rules here to give you an example:</p>
+
+ <p><font size="2">1. class=td2jira.sync.impl.SyncIssues;<br>2. class=td2jira.sync.impl.SyncAttachments;<br>3.
+ td.status=Closed|Rejected,jira.status=Open|Assigned To Fix|Assigned To Merge|Assigned To
+ Review|Resolved,class=td2jira.sync.impl.CloseJiraIssue;<br>4.
+ td.status=Reopen|Assigned,jira=null,class=td2jira.sync.impl.CreateJiraIssue;<br>5.
+ td.status=New|Open|Reopen|Assigned,jira.status=Resolved,class=td2jira.sync.impl.MarkTdIssueAsFixed; 6.
+ td.status=Reopen|Assigned,jira.status=Closed,class=td2jira.sync.impl.RecreateJiraIssue;<br>7.
+ td.status=Fixed,jira.status=Closed,class=td2jira.sync.impl.AskToRetest;</font><br></p>
+
+ <p>which means:</p>
+ <ul>
+ <li>sync issues comments first (regardless ofl statuses)</li>
+ <li>sync attachments (from TD issue to JIRA issue)</li>
+ <li>if TD issue is Closed or Rejected, and JIRA issue is Open or Assigned or ... then close JIRA issue
+ </li>
+ <li>if TD issue is Reopened or Assigned, and no JIRA issue found, create JIRA issue</li>
+ <li>... and so on</li>
+ </ul>
+ <p>Basically, it's a simple rule engine. You may create your own handlers (implementing
+ td2jira.sync.impl.IProcessIssuePair). See existing implementations for details.</p>
+
+ <h2>Two ways to access JIRA</h2>
+
+ <p>JIRA has SOAP and XML-RPC interfaces. Despite SOAP API is much more powerful, the default for TD2JIRA is
+ XML-RPC. The reason is that SOAP API is not compatible among even minor versions of JIRA (new methods, new
+ fields in types), while XML-RPC works almost always. In light of mentioned above bug with
+ addAttachmentsToIssue, there is no real reason to use SOAP out of the box until Atlassian stabilize their
+ SOAP API for major operations. </p>
+
+ <p>The access mode is switched by the property:</p>
+
+ <p><font size="2"><span style="font-family: courier new,monospace;"># Connector Implementation</span><br
+ style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">jira.connector.implementation=td2jira.jira.xmlrpc.JIRAXmlRpcConnector</span><br
+ style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"># jira.connector.implementation=td2jira.jira.soap.JIRASoapConnector</span></font><br>
+ </p>
+
+ <h2>Limitations</h2>
+
+ <p>Current version (1.0) doesn't support copying attachments via SOAP. Instead, it does a HTTP POST to
+ AttachFile JSP. The reason is twofold. First, the JIRA WSDL file seems to be incorrect, and uses byte[][]
+ instead of base64-encoded files. In fact, modern WS tools (including JAXB and .NET 2.0) refuse to compile
+ the WSDL. Axis 1.4 happily compiles it though, but (it's second) resulting message is enormous in size
+ (700K for 3K file, grows proportionally). Hence, the WSDL's addAttachmentToIssue() method is unusable.
+ <br></p>
+
+ <h2>F.A.Q.</h2>
+
+ <p>Q1. Does TD2JIRA support HTTP proxy? </p>
+
+ <p>A1: It does. In fact, it even supports proxy authorization. I failed to use NTLM authentication in attach
+ file though. The request comes through, it looks like, but something is still wrong, and JIRA fails.</p>
+
+ <p>Q2: How to make TD2JIRA copy a comment from JIRA to TD?</p>
+
+ <p>A2: Provide a "2qa:" prefix to your comment. TD2JIRA will create a matching comment in TD. To
+ assign the task to someone in TD use "2qa:tduserid", like here:</p>
+
+ <p><span style="font-family: courier new,monospace;">2qa: Please retest<br>2qa:johnmk This works as documented, please reject</span>
+ </p>
+
+ <p><span style="font-family: arial,sans-serif;"></span>In fact, it's a hackish way. The Right Way (tm)
+ would be to check the JIRA comment group (visible to developers, ...) and copy it to TD if it's
+ visible to everyone. It's not hard to do. Anyone?</p>
+
+ <p>Q3: Can TD2JIRA be used to sync TD and/or JIRA with <insert your legacy tool here>?</p>
+
+ <p>A3: Not out of the box. But the logic and design (well, it's too simple for calling it "architecture")
+ of the application can be used as a template for creating similar tools (or even plugging in more target
+ applications into TD2JIRA itself).<br></p>
+
+ <h2>Support</h2>
+
+ <p>No support whatsoever. I can answer some general questions, but don't expect me to modify TD2JIRA for
+ your needs. You're developers, figure it out yourselves!<br></p>
+
+ <h2>License</h2>
+
+ <p>BSD-Style:</p>
+
+ <p>
+ Redistribution and use in source and binary forms,
+ with or without modification, are permitted provided
+ that the following conditions are met:
+ </p>
+
+ <ul>
+ <li>
+ Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ </li>
+ <li>
+ Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ </li>
+ </ul>
+
+ <p>
+ <b>
+ THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</b></p>
+
+ <h2><b>Author</b></h2>
+
+ <p>This software was designed and implemented by me, <a href="http://vladimir-dyuzhev.net">Vladimir
+ Dyuzhev</a>. Feel free to <a href="mailto:Vla...@gm...">email</a> me.<br></p>
+
+ <p>
+ </p>
+
+ <p></p></div>
</div>
+ <div style="clear: both"></div>
</div>
- <!-- /wrapper --><!-- /main-content -->
- <div id="footer"><div class="wrapper">
- <hr />
- <p><div id='g_footer'><p style="text-align: center;">(C) Vladimir Dyuzhev 2007 </p></div></p>
+ </div>
+ <!-- /wrapper --><!-- /main-content -->
+ <div id="footer">
+ <div class="wrapper">
+ <hr/>
+ <p>
+
+ <div id='g_footer'><p style="text-align: center;">(C) Vladimir Dyuzhev 2007 </p></div>
+ </p>
<div style="clear: both"></div>
- </div></div>
- <!-- /wrapper --><!-- /footer -->
+ </div>
</div>
+ <!-- /wrapper --><!-- /footer -->
</div>
+</div>
<!-- /wrapper --><!-- /container -->
-<div id="extraDiv1"><span></span></div><div id="extraDiv2"><span></span></div>
-<div id="extraDiv3"><span></span></div><div id="extraDiv4"><span></span></div>
-<div id="extraDiv5"><span></span></div><div id="extraDiv6"><span></span></div>
+<div id="extraDiv1"><span></span></div>
+<div id="extraDiv2"><span></span></div>
+<div id="extraDiv3"><span></span></div>
+<div id="extraDiv4"><span></span></div>
+<div id="extraDiv5"><span></span></div>
+<div id="extraDiv6"><span></span></div>
</body>
</html>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|