利用 Rational Team Concert 和 UrbanCode Deploy 实现持续交付

第 3 部分. 如何利用 Ant build.xml 文件的扩展

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 利用 Rational Team Concert 和 UrbanCode Deploy 实现持续交付

敬请期待该系列的后续内容。

此内容是该系列的一部分:利用 Rational Team Concert 和 UrbanCode Deploy 实现持续交付

敬请期待该系列的后续内容。

本系列文章介绍了两种机制,以便集成 IBM(R) Rational Team Concert(TM) 和 IBM(R) UrbanCode Deploy 来创建一个持续交付流程。第 1 部分 中介绍了一个打包的开箱即用实现,该实现很容易建立。第二种方法在 第 2 部分 和第 3 部分中进行了介绍,该方法会使用对 Ant build.xml 文件的扩展。

从构建流程启动一个部署

第 5 阶段. 启动一个部署

启动一个 UrbanCode 部署可能需要使用大量与部署流程有关的数据、执行部署的环境和将要部署的组件的版本。因为 udclient 命令行函数的结果接收了一个包含信息的 JSON 格式文件,所以需要执行部署。

要查看 JSON 数据的格式,需要使用 –t 选项运行部署请求命令行,如清单 1 所示。

清单 1. 部署请求命令 -t
udclient -weburl https://rational-srv-02:8443 -authtoken <my-auth-token> requestApplicationProcess –t

运行该命令后获得的结果是要提供的 JSON 数据的格式。

属性

清单 2 显示了其他必要属性。这些属性被添加到 build.xml 文件的顶部。为应用程序、环境和环境的流程设置特定的值。

清单 2. 支持部署操作的新属性
<property name="Deploy_DeploymentJSONFile" value="Deploy_application_deploy.JSON" /> 
<property name="Deploy_ApplicationName" value="Deploy Sample Application" />
<property name="Deploy_ApplicationProcess" value="Deploy to Tomcat" />
<property name="Deploy_Environment" value="Development" />
<property name="DeployDeploymentLog" value="${workingDir}/DeployDeploymentLog.log" /> 
<property name="DeployRequestIDFile" value="${workingDir}/DeployRequestIDFile.txt"/>
<property name="DeploymentRequestJSONTitle" value="requestId"/>

部署请求:步骤 1

使用 StartBuildActivity 构建命令(如清单 3 所示)作为创建部署请求的第一步。

清单 3. StartBuildActivity 构建命令
<startBuildActivity activityIdProperty="Deploy" label="Deploy objects with Deploy"
    autoComplete="true" buildResultUUID="${buildResultUUID}"
repositoryAddress="${repositoryAddress}"
userId="${userId}" passwordFile="${passwordFile}" />

部署请求:步骤 2

使用 echo 命令将所需内容写入 JSON 文件。

备注:
如果使用多个组件,那么它们的名称和版本标示符也应该添加到此处,可以使用 JSON 内容中的 versions 元素的重复数据块实现此操作,如清单 4 所示。

清单 4. JSON 文件创建过程
<echo file="${workingDir}/${Deploy_DeploymentJSONFile}" append="false">{
    "application": ${Deploy_ApplicationName},
    "applicationProcess": ${Deploy_ApplicationProcess},
    "environment": ${Deploy_Environment},
"versions": [
{
"version": ${buildLabel},
"component": &quot;${Deploy_Component}&quot;,
}
],
}
</echo>

部署请求:步骤 3

在第 3 步中,udclient 命令运行了部署。该命令的第一个参数与 login 命令的相同。清单 5 中显示了其他参数,其中包括 requestApplicationProcess 命令和 JSON 文件的标示符。

清单 5. 部署请求构建命令
<exec executable="cmd" dir="${workingDir}" output="${DeployDeploymentLog}">
    <arg value="/c"/>
    <arg value="udclient"/>
<arg value="-authtoken"/>
    <arg value="${Deploy_AuthToken}"/>
    <arg value="-weburl"/>
    <arg value="${Deploy_WebURL}"/>
    <arg value="requestApplicationProcess"/>
 <arg value="${Deploy_DeploymentJSONFile}"/> 
</exec> 

部署请求的 ID(如清单 6 所示)位于执行部署而生成的输出文件中。

清单 6. 来自 UrbanCode 的部署请求响应
{
    "requestId": "6e0d5a7d-d371-4665-8cc5-f99cb4b11856"
}

获得部署请求 ID

您可以从 requestApplicationProcess 命令的 JSON 格式输出结果中提取部署请求 ID(如清单 6 所示),所采用的方法与您之前提取组件版本 ID 所用的方法相同。第 2 篇文章的第 3 阶段中使用的 Java 应用程序是从构建脚本中调用的,该脚本将会处理 requestApplicationProcess 命令的输出并提取 ID。

清单 7 显示了运行 java 应用程序所需的 xml 部分,以及所需的属性。

清单 7. 调用 Java 应用程序从 JSON 文件中获取属性
<java jar="${getJSONPropertyValue}" output="${getJSONPropertyValue-Log}" fork="true">
<classpath refid="getJSONPropertyValuePaths" />
    <arg value="inputFile=${DeployDeploymentLog}" />
    <arg value="Title=${DeploymentRequestJSONTitle}" />
    <arg value="outputFile=${DeployRequestIDFile}" />
</java> 

输出文件包含部署请求标示符(如清单 8 中显示),该文件是执行清单 7 所示的命令后创建的。

清单 8. 部署请求标示符
6e0d5a7d-d371-4665-8cc5-f99cb4b11856

清单 9 包含:

  • 将文件加载到属性中的命令
  • 显示构建日志文件中的 ID 的 echo 命令
清单 9. 读取部署请求文件的内容的构建命令
<loadfile property="DeployRequestID"
srcFile="${DeployRequestIDFile}"/>  
<echo message="ID of Deployment request = ${DeployRequestID}" />  

在构建记录中公布部署请求的链接

您可以使用 Rational Team Concert 中的 link publisher 命令,在 build.xml 文件的顶部公布从定义为某个属性的标头 URL 构造的 URL,并通过清单 7 中的命令公布从文件中提取的 ID,清单 8 中显示了一个示例。使用清单 10 中的代码将标头 URL 属性添加到 build.xml 文件。

清单 10. 要添加到针对部署流程请求 ID 的 build.xml 的属性
<property name="DeployRequestDeploymentLinkHeader" 
value="${Deploy_WebURL}/#applicationProcessRequest/"/>

清单 11 是用于公布链接的命令。

清单 11. 用于将一个链接公布到部署记录的 build.xml 命令
<linkPublisher label="UrbanCode Deploy Application Deployment '${Deploy_ApplicationName}'"
url="${DeployRequestDeploymentLinkHeader}${DeployRequestID}"
componentName="Application Deployment" buildResultUUID="${buildResultUUID}"
repositoryAddress="${repositoryAddress}" userId="${userId}"
    passwordFile="${passwordFile}" failOnError="false" /> 

第 5 阶段. 小结

在第 5 阶段中,您完成了一些步骤,让持续交付流程启动了 UrbanCode Deploy 中定义的特定环境的新组件版本的部署。您还在构建记录上创建了一个链接,使之能够连接到 UrbanCode Deploy 中的部署记录。

第 6 阶段. 追踪部署的结束

在整个 Rational Team Concert 构建流程中追踪部署流程的时候,第 5 阶段中提供的解决方案有一个小问题。清单 12 显示了 Ant build.xml 格式的部署请求命令。

清单 12. 用于调用部署的 build.xml 命令
<exec executable="cmd" dir="${workingDir}" output="${DeployDeploymentLog}">
    <arg value="/c"/>
    <arg value="udclient"/>
<arg value="-authtoken"/>
    <arg value="${Deploy_AuthToken}"/>
    <arg value="-weburl"/>
    <arg value="${Deploy_WebURL}"/>
    <arg value="requestApplicationProcess"/>
 <arg value="${Deploy_DeploymentJSONFile}"/> 
</exec> 

清单 12 显示了该命令的命令行执行。

清单 13. 该命令行等同于清单 12 中的命令
udclient –weburl https://<web-server > -authtoken <my auth token> 
requestApplicationProcess <JSON file name>

UrbanCode 命令行客户端处理了一个针对部署启动的请求,并完成了清单 13 所示的命令,在 UrbanCode Deploy 接受请求后就立即向用户返回了命令提示。这并不意味着部署已经结束,此命令无法追踪部署进度。

结果是,部署流程(由 Rational Team Concert 构建调用)只运行了 3 秒。图 1 中的构建记录的活动追踪报告显示了这一点。

图 1. 构建活动记录
构建活动显示部署时间很短
构建活动显示部署时间很短

如图 2 所示,UrbanCode Deploy 执行的部署实际上用了 22 秒。

图 2. UrbanCode 的构建活动部署记录
部署记录显示,该部署用了 22 秒
部署记录显示,该部署用了 22 秒

图 3 中显示了构建和部署操作的未链接时间。

图 3. 构建和部署操作结束于不同的时间
构建流程结束于部署流程之前
构建流程结束于部署流程之前

理想情况下,Rational Team Concert 构建流程应该等待部署完成,然后才能继续下一个任务,或者继续完成构建。如果失败的部署流程取得了成功,也必须等待部署结束,而且这还将作为失败的构建流程取得成功的一个指示器。

有许多暂停检查行动(pause-check-act)机制都可以用于此流程。这里采取的方法是让 Ant 构建流程定期轮询,查看某个特定标记文件是否存在。UrbanCode Deploy 将该标记文件编写为部署流程的最后一步,如图 4 所示。图 4 中显示了部署流程结束(和创建标记文件)时间与 Rational Team Concert 中运行的 Ant 构建脚本的结束时间之间的一点小差异。这种差异也存在于 UrbanCode Deploy 中部署流程(和创建标记文件)的结束时间与运行在 Rational Team Concert 中的 Ant 构建脚本(轮询并找到已创建的标记文件)的结束时间之间。最长的时间段是 Ant 任务的轮询期间造成的,如下面部分所示,设置了 checkevery="5000"。这表明 Ant 流程每隔 5 秒就会寻找该文件。在本例中,最大差异可能是 5 秒,不过,checkevery 参数的值可以设置为任何适合您环境的值。

图 4. 构建操作和部署操作结束于不同的时间
构建流程结束于部署流程之前
构建流程结束于部署流程之前

构建流程步骤

要执行轮询获得部署的结束时间,需要向构建添加一些步骤。清单 14 是第一步。startBuildActivity 命令在部署部分非常重要。它允许您追踪 UrbanCode Deploy 中的部署。您还可以利用连接到正在运行的部署的链接,观察运行的步骤。有时一个部署可能要花费几分钟的时间,让用户了解这一点很重要。

清单 14. 追踪部署
<startBuildActivity activityIdProperty="Deploy" label="Polling for Depoy to end"
autoComplete="true" buildResultUUID="${buildResultUUID}"
repositoryAddress="${repositoryAddress}"
userId="${userId}" passwordFile="${passwordFile}" /> 

需要为标记文件提供新的部署定义,如清单 15 所示。该定义必须与文件名称和 UrbanCode Deploy 在部署结束时创建的位置相匹配。

清单 15. 用于表示标记文件的 build.xml 属性
<property name="DeploymentEndMarkerFile" value="c:\\WorkingDir\\${buildLabel}.txt" />

Ant 中的 waitfor 函数允许系统定期轮询,通过 ${DeploymentEndMarkerFile} 指示某个特殊文件是否出现。在清单 16 中,waitfor 命令被配置为最长等待 30 分钟。每 5 分钟就会检查标记文件是否出现。更频繁的检查可能会给系统性能带来负面影响。

清单 16. 导致 Ant 等待某个文件的出现的命令。
<waitfor maxwait="30" maxwaitunit="minute" checkevery="5000">
    <available file="${DeploymentEndMarkerFile}"/>
</waitfor>

使用 logPublisher(如清单 17 所示)公布部署日志文件。

清单 17. logPublisher
<logPublisher filePath="${DeployDeploymentLog}" label="Deploy Deployment Log"
    buildResultUUID="${buildResultUUID}" repositoryAddress="${repositoryAddress}" 
userId="${userId}" passwordFile="${passwordFile}" verbose="true"  />

标记部署流程的结束

部署流程结束时调用的 UrbanCode Deploy 流程指示了部署的完成,如图 5 所示。部署流程步骤如下:

  1. 检查保存标记文件的目录是否存在。
  2. 如果标记目录不存在(通过开关指示),则创建该标记目录。
  3. 使用创建文件的流程步骤来创建标记文件。
图 5. UrbanCode Deploy 的部署流程的结束
创建标记文件的流程步骤
创建标记文件的流程步骤

对于该流程,此函数是必需的,它告诉 Rational Team Concert 部署已经结束,对于部署而言,完成这个流程是必需的,因此,应该适当地创建申请流程。

收尾步骤

最后的步骤是注销 UrbanCode Deploy 会话,并删除 UrbanCode Deploy 创建的标记文件,如图 5 所示。清单 18 包含用来将内容添加到 build.xml 文件的指令。

清单 18. 注销 UrbanCode,删除临时标记文件
<exec executable="cmd" dir="${workingDir}">
    <arg value="/c"/>
    <arg value="udclient"/>
    <arg value="logout" />
    <arg value="-weburl"/>
    <arg value="${Deploy_WebURL}"/>
</exec>  
<exec executable="cmd" dir="${workingDir}">
    <arg value="/c"/>
    <arg value="del"/>
    <arg value="${DeploymentEndMarkerFile}" />
</exec> 

第 6 阶段. 小结

持续交付流程现已完成。部署流程通过构建流程被监视。构建结束于完成部署的时候。

结束语

此文章系列介绍了两种不同的机制,用于集成 Rational Team Concert 构建流程与 UrbanCode Deploy,以便实现自动化部署。所有 DevOps 解决方案的核心宗旨都是让开发团队和运营团队密切合作。密切的关系依赖于构建和部署解决方案之间的持续交付流程操作。第一个解决方案(第1部分)是一个开箱即用实现,该解决方案在许多场景中都表现良好。建议用户尽可能地使用这个解决方案。不过,当团队有复杂的构建流程,而且生成的内容将包含在多个 UrbanCode 组件中时,建议使用第 2 部分和第 3 部分中提供的解决方案。标题和链接。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=DevOps, Rational
ArticleID=1003637
ArticleTitle=利用 Rational Team Concert 和 UrbanCode Deploy 实现持续交付: 第 3 部分. 如何利用 Ant build.xml 文件的扩展
publish-date=04162015