在本教程中,您将了解使用IBM App Connect Management API,SoapUI客户端和Jenkins在IBM App Connect(以前称为WebSphere®CastIron®)上的部署自动化。
好处
部署自动化:
- 完全自动化IBM App Connect业务流程的部署。
- 通过Cast Iron管理控制台节省了部署工作的时间和精力。
- 自动化部署可导致端到端的可处理性。
- 完成部署活动的易处理性,提高部署质量,减少应用程序和环境的停机时间。
先决条件
要继续进行,您需要:
- IBM App Connect 7.5.0或更高版本
- GitLab或GitHub ,因此您可以检入PAR和部署属性文件(此处使用了GitLab帐户)
- SoapUI 5.2.1或更高版本
- 最新版本的詹金斯
- DevOps的基础知识
IBM App Connect Professional(以前称为Cast Iron)是一个将基于云的SaaS应用程序与本地应用程序集成的平台。 它是用于构建复杂集成流程的拖放式开发工具。
IBM App Connect具有两个实现模型:
- 设备模型 -设备可以是物理硬件或虚拟机。
- SaaS模型(IBM App Connect Professional SaaS) —三种形式(物理,虚拟,SaaS)中的每一种都允许云到云,云到本地以及本地到本地集成。 每个尺寸都允许实时,近实时和批处理集成。
要访问IBM App Connect运行时,请使用以下任何接口:
- 管理API(网络服务)
- 命令行界面(CLI)
- WMC
设备API
设备管理API是一个Web服务层,它允许使用SOAP请求形式的Web服务调用来执行任务,从而管理IBM App Connect运行时,包括:
- 发布
- 开始
- 停止
- 取消部署,删除
- 导出配置
- 项目
该响应采用SOAP响应的形式。
IBM App Connect集成设备提供了不同的API,以执行与IBM App Connect管理相关的各种功能。 可通过以下方式访问这些API:
- Security.wsdl
- Staging.wsdl
- Deployment.wsdl
- System.wsdl
- Orcmon.wsdl
- Lognotif.wsdl
部署WSDL包含有关发布PAR文件,启动PAR文件,停止业务流程,取消部署业务流程,删除业务流程,导出项目,导出配置等信息。 在SoapUI中下载https:// <appliance-management-port> / ws / deployment?wsdl部署WSDL。
安全性WSDL包含用于建立管理API会话的登录和注销操作。 在SoapUI中下载https:// <appliance-management-port> / ws / security?wsdl安全WSDL。 下一节将详细介绍。
IBM App Connect部署自动化的配置
IBM App Connect部署的自动化配置包含两个主要过程:
- 使用SOAPUI配置测试套件,以依次调用设备API(登录,发布,注销等)。
- 自动化上述对Jenkins创建的测试套件的调用。
配置测试套件以调用设备API
图1显示了发布PAR文件和启动业务流程的基本步骤。您将登录到IBM App Connect,上传并部署PAR文件,启动该PAR文件的业务流程,然后注销IBM App Connect。 。 运行它的详细步骤如下所述。
注意 :无论是通过IBM App Connect WMC还是通过App Connect Management API进行部署,此流程图均相同。
图1.部署步骤流程图
步骤1.在SoapUI上创建一个SOAP项目
打开SoapUI并通过单击文件>创建空项目来创建一个空项目。 默认情况下,该项目名为Project1。 您可以使用自己喜欢的名称重命名项目。 在本教程中,该项目被重命名为CastIron_Deployment。
创建新SOAP项目的另一种方法是单击文件>新建SOAP项目 。 在打开的对话框中键入名称CastIron_Deployment
。
步骤2.添加WSDL以进行安全性和部署
右键单击项目CastIron_Deployment并添加安全性和部署WSDL(如图2a,2b和2c所示)。 图2a显示了第一步,该步骤将WSDL添加到项目中。 右键单击CastIron_Deployment项目,然后单击添加WSDL 。
图2a。 将WSDL添加到项目
将打开“添加WSDL”对话框。 要添加安全性,请在WSDL位置文本框中输入(或浏览到) https://appliance-management-port/ws/security?wsdl
,如图2b所示。
图2b。 添加安全性WSDL
您还需要添加部署WSDL。 右键单击CastIron_Deployment项目,然后单击添加WSDL 。 将打开“添加WSDL”对话框。 要添加部署,请在WSDL Location文本框中键入(或浏览到) https://appliance-management-port/ws/deployment?wsdl
,如图2c所示。
图2c。 添加部署WSDL
步骤3.创建一个测试案例
右键单击项目CastIron_Deployment,然后选择New TestSuite ,如图3a所示。
图3a。 添加一个新的TestSuite
与之前一样,右键单击TestSuite1并选择New TestCase ,如图3b所示。
图3b。 添加一个测试用例
默认情况下,新的测试用例名为TestCase1 。 右键单击TestCase1并选择Rename ,将其重命名为PublishandStart
,如图3c所示。
图3c。 重命名测试用例
步骤4.将PAR和属性文件上传到GitLab
接下来,您需要将PAR文件和部署属性文件上载到GitLab帐户。 属性文件的扩展名为.properties
。 属性文件主要用于Java™技术中,以存储应用程序的可配置参数。 .properties
文件中的每一行通常以键值对格式存储单个属性。 图4显示了名为publishPar.properties
的部署属性文件, publishPar.properties
包含以下属性:
- 项目名称
- 版
- 配置
- 文档名称
这个文件应该被创建并上传到GitLab。
图4.部署属性文件(publishPar.properties)
步骤5.定义测试步骤
测试步骤细分为:
- 步骤5a:登录。 此步骤将用户登录到IBM App Connect设备。
- 步骤5b:在SoapUI上附加可部署的PAR文件。 在此步骤中,使可部署的PAR文件可供测试用例访问。
- 步骤5c:传输生成的SessionId。 在IBM App Connect中,在执行任何管理活动之前,先对用户进行认证。 如果要执行任何其他活动(例如发布或注销),则登录后必须授权用户。 因此,必须传递SessionId才能调用特定用户会话的任何操作(或测试用例)。
- 步骤5d:发布PAR文件。 此步骤将PAR文件部署在IBM App Connect中。
- 步骤5e:开始编排。 在步骤5d中部署PAR文件之后,根据需要,IBM App Connect中的业务流程可能会开始(也可能不会)。 如果需要,此步骤将启动IBM App Connect中的编排。
- 步骤5f:注销当前会话。 此步骤注销用户。
步骤5a。 登录
在SoapUI导航器中,右键单击“ 测试步骤” 。 在弹出菜单中,单击Add Step然后单击SOAP Request ,如图5所示。
图5.在SoapUI中添加一个SOAP请求
将打开“新建TestRequest”窗口。 从列表中选择SecurityManagerPortBinding>登录选项,然后单击OK ,如图6所示。
图6.从SecurityManagerPortBinding选择Login Appliance API Request-> login
在<sec:username> </sec:username>
标记之间添加用户<sec:username> </sec:username>
。 在<sec:password> </sec:password>
标记之间添加密码,如图7所示。单击Save保存项目。
图7.登录SOAPRequest
如果成功,此登录请求将生成一个SessionId用于用户验证。 此SessionId传递到其余步骤。
步骤5b。 在SOAPUI上附加可部署的PAR文件
右键单击“ 测试步骤” ,然后单击“ 添加步骤” 。 选择Groovy Script ,如图8所示。此脚本从指定位置上载SoapUI中的PAR文件。 该脚本使用您上载到GitLab的部署属性文件,如图4所示。
图8.添加Groovy脚本
将以下脚本复制并粘贴到Groovy脚本窗口中,以便SoapUI可以访问和上传PAR文件以发布到IBM App Connect:
import org.custommonkey.xmlunit.*
import java.util.Random
import java.security.MessageDigest
import java.nio.file.*
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def projectPath = groovyUtils.projectPath
log.info projectPath
Properties properties = new Properties()
File propertiesFile = new File('C:\\Jenkins\\workspace\\CastIronDeployment\\publishPar.properties')
propertiesFile.withInputStream {properties.load(it)}
def project = testRunner.testCase.testSuite.project
log.info "Project: " + project.name
def myTestSuite = testRunner.testCase.testSuite;
log.info "TestSuite: " + myTestSuite.name
def testCase = testRunner.testCase
log.info "TestCase: " + testCase.name
def testStepUploadDataAfterCheck = testCase.getTestStepByName("PublishSOAPRequest")
def request= testStepUploadDataAfterCheck.testRequest
log.info "TestStep: " + testStepUploadDataAfterCheck.name
// clear existing attachments
for( a in request.attachments ) {
request.removeAttachment( a )
}
def propFileNamePath='FileNamePath'
def propFileName='FileName'
//FileNamePath
//def fileNamePath = testCase.getTestStepAt(testRunner.testCase.getTestStepIndexByName("FileNameProperties")).getProperty("FileNamePath")
def fileNamePath = properties."$propFileNamePath"
//log.info fileNamePath
//log.info properties."$propFileNamePath"
//FileName
//def fileName = testCase.getTestStepAt(testRunner.testCase.getTestStepIndexByName("FileNameProperties")).getProperty("FileName")
def fileName = properties."$propFileName"
//log.info fileName
// get file to attach
// log.info "file to attach: " + fileNamePath.getValue()
log.info "file to attach: " + fileNamePath
//def file = new File(fileNamePath.getValue() )
def file = new File(fileNamePath)
if ( file == null) {
log.error "bad filename"
}
else
{
// attach and set properties
def attachment = request.attachFile( file, true )
attachment.contentType = "application/octet-stream"
//attachment.setPart(fileName.getValue())
attachment.setPart(fileName)
def holder2 = groovyUtils.getXmlHolder( "PublishSOAPRequest#Request" ) // Get Request body
//holder2.setNodeValue( "//dep:publishProject/content","cid:"+fileName.getValue()); //Set "link" to attachment in request body
holder2.setNodeValue( "//dep:publishProject/content","cid:"+fileName); //Set "link" to attachment in request body
holder2.updateProperty() //and update
//log.info fileName.getValue()
log.info fileName
log.info "file attached succesfully"
}
步骤5c。 转移生成的SessionId
现在,您需要传输在步骤5a中获得的SessionId,然后在步骤5d,5e和5f中传递。
右键单击Test Steps ,选择Add Step ,然后选择Property Transfer ,如图9所示。这会将登录响应的SessionId转移到所有其他测试步骤。
XPATH查询通过从登录响应到发布(步骤4d),开始(步骤4e)和注销(步骤4f)的请求来传递SessionId。
下图显示了如何将SessionId从登录步骤传递到注销步骤(如图11a所示)。 类似地,如何将SessionId转移到图11b所示的发布步骤并开始编排步骤,如图11c所示。
图9.添加步骤:属性转移
单击+图标(在图10中以红色突出显示)以添加属性传输。 这将打开一个对话框。 在“ 为值传输指定名称”文本框中键入名称transferSessionId
。 您将重复此步骤3次,如图11a,b和c所示。
图10.在属性转移步骤中添加转移
图11a。 从登录步骤到注销步骤的SessionID的属性传输XPATH查询
图11b。 从登录步骤到PublishSOAPRequest步骤的SessionID属性转移XPATH查询
图11c。 从登录步骤到StartRequest步骤的SessionID属性转移XPATH查询
步骤5d。 发布PAR文件
要发布PAR文件,首先需要添加一个测试步骤作为SOAP请求,如图5所示。在“ New TestRequest”窗口打开后,从列表中选择DeploymentManagerPortBinding> publishProject ,如图12所示。
图12.发布请求
PublishSOAPRequest如图13所示。
图13. PublishSOAPRequest
步骤5e。 部署完成后开始编排(可选)
根据要求,在发布步骤之后,可能需要启动业务流程。 如果编排未开始,则IBM App Connect WMC将显示该项目状态为未部署。 如果业务流程成功启动,那么业务流程将显示运行状态。
如果需要开始业务流程,则需要启用启动设备调用。 否则,您必须禁用启动API调用。 为此,右键单击Test Steps ,单击Add Step ,选择Groovy Script ,如图8所示,然后在下面添加Groovy Script以启用或禁用开始调用:
Properties properties = new Properties()
File propertiesFile = new File('C:\\Jenkins\\workspace\\CastIronDeployment\\publishPar.properties')
propertiesFile.withInputStream {properties.load(it)}
def enableStart='enableStart'
if (properties."$enableStart"=="true"){
def testStep = testRunner.testCase.getTestStepByName( "StartRequest" )
log.info testStep.disabled
if(testStep.disabled){
testStep.disabled = false
}
log.info testRunner.testCase.getTestStepByName( "StartRequest" ).disabled
}
else if (properties."$enableStart"=="false") {
log.info "Orchestration will not be started"
def testStep = testRunner.testCase.getTestStepByName( "StartRequest" )
log.info testStep.disabled
if(!testStep.disabled){
testStep.disabled = true
}
log.info testRunner.testCase.getTestStepByName( "StartRequest" ).disabled
}
else
log.info "Incorrect value for enableStart in properties file."
右键单击“ 测试步骤”,然后将新的测试步骤添加为SOAP请求。 从列表中选择DeploymentManagerPortBinding>启动请求,如图14所示。
图14.启动请求
图15显示了对开始业务流程的管理API调用。
图15.开始编排的SOAP请求
步骤5f。 从当前会话注销
右键单击Test Steps,然后将新的测试步骤添加为SOAP请求,如图5所示。选择SecurityManagerPortBinding>注销请求,如图16所示。
图16.注销请求
图17显示了LogoutSOAPRequest对话框。
图17. SOAP注销请求
图18显示了最终的测试套件配置,其中包括七个测试步骤:
- LoginSOAPRequest
- UploadDataAfterCheck
- 财产转让
- 发布SOAP请求
- 选择测试步骤
- 开始请求
- 注销SoapRequest
图18. SoapUI项目导航器和测试步骤
步骤6.使用测试套件导出SoapUI项目
右键单击SoapUI项目,然后单击保存项目 。 当提示您输入文件名时,将测试套件命名为CastIron-Deployment-soapui-project.xml
,如图19a所示。
图19a。 保存一个SoapUI项目
图19b显示了上载到GitLab的CastIron-Deployment-soapui-project.xml文件。
图19b。 在GitLab上的CastIron-Deployment-soapui-project.xml
通过Jenkins CI自动化调用测试套件
现在是时候使用Jenkins作为持续集成(CI)引擎来协调部署自动化了。
步骤1.配置SOAP UI Shell脚本
第一步是更改SoapUI默认外壳脚本( {SOAPUI_HOME}/bin/ testrunner.sh
)以与属性文件一起运行。 在这种情况下,将其更改为运行Jenkins作业在后续步骤中创建的publishPar.properties
属性文件。
图20.更改testrunner.sh以包括一个属性文件
步骤2.配置Jenkins作业以运行SoapUI项目
创建了一个Jenkins作业来运行SoapUI项目。
步骤2a。 输入部署属性
将构建所需的参数设置为:
- targetenv:构建的目标环境。
- propertyFileName:在Git存储库中上载的属性文件名。
- 文件名:必须在IBM App Connect中发布的PAR文件名。
- enableStart:True =发布PAR文件后开始编排。 False =部署PAR文件后不要开始业务流程。
图21.必需的参数
步骤2b。 从GitLab下载PAR文件和属性文件
在Jenkins作业中,单击作业名称(对于本教程,该作业名称为CastIronDeployment_dev)。
图22a。 单击詹金斯的工作名称
点击配置 。
图22b。 Jenkins项目CastIronDeployment_dev工作
将打开“配置”窗口。 选择“ 源代码管理”选项卡,然后选择“ Git”单选按钮。 在“存储库URL”字段中,在Git中键入到存储库的链接。
图22c。 将SCM设置为GitLab
步骤2c。 创建一个在运行时将部署属性与基础属性文件结合在一起的属性文件
单击生成选项卡。 要创建新属性,请运行图23中的以下shell脚本(第1-10行)。该脚本(Jenkins Shell Script.txt)可在本教程的下载部分中找到。
图23.使用Jenkins脚本创建属性文件
图24显示了运行时的组合属性文件。 注意,列出了开发和部署团队的两个属性。
图24.组合属性文件
步骤2d。 使用Shell脚本运行SoapUI测试套件
图25显示了Jenkins Shell Script.txt Shell脚本(在下载部分中提供)。 您将在Build(第13-15行)下的部分中添加此脚本。
图25.运行shell脚本
步骤2e。 备份部署工件
在“构建后操作”选项卡上,您将看到一个工件部分的存档。 文件系统中的工件PAR文件,属性文件和日志文件将被归档。 您可以通过{JENKINS_HOME}/jobs/{JENKINS_JOB_NAME}/builds/{JENKINS_JOB_NO.}/archive
。
图26.存储构建后工件
结论
本教程展示了IBM App Connect管理API如何提供一种灵活的方式来管理设备和业务流程。 IBM App Connect易于与DevOps工具集成,以促进部署自动化和配置交付管道。
本教程中使用的文件
- Jenkins-Shell-Script.sh运行一个SoapUI项目。
- Groovy脚本 PAR文件已附加到SoapUI项目,因此可以发布。
- publishPar.properties是包含部署属性的属性文件。