我或多或少有同样的问题,虽然我没有使用 Jenkins,但我确实使用了 XMLAccess 来解决它。
portlet 应用程序的自动部署基本上有三种方法:
- 将您的portlet WAR 打包到EAR 文件中,并通过部署管理器/WAS 部署它们。这就是所谓的“预部署”,这就是 Jenkins 所做的。放入 EAR 后,您必须使用 XMLAccess 完成部署,以便门户知道 EAR 包含包含 portlet 的 Web 应用程序。如果您已经通过 XMLAccess 部署和注册过一次,您可以通过部署新的 EAR 文件来继续部署应用程序的更新。
- 使用 WAR 文件并通过门户部署它们,类似于通过 GUI 进行部署的方式;然后 Portal 将使用部署管理器/WAS 来部署它。然后它将在 WAS (PA_YourModule) 中生成应用程序名称。为此,您需要将 WAR 文件上传到服务器。
-
Generate a PAA file。这包含 WAR 文件和 XMLAccess 文件。您需要为此启动 ConfigEngine。
在所有情况下,您都需要一个 XMLAccess 脚本来在门户中注册应用程序,这些脚本在方法上会略有不同。在第一种方法中,您的 XMLAccess 脚本将引用 EAR 文件中的 WAR,并且 web-app 标记将具有属性 predeployed="true":
<?xml version="1.0" encoding="UTF-8"?>
<request type="update" version="8.0.0.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="PortalConfig_8.0.0.xsd">
<portal action="locate">
<web-app action="update" active="true" domain="rel" predeployed="true"
removable="true" uid="{id from portlet.xml}">
<url>file://localhost/$predeployed_root$/MyEARfile.ear/MyPortlets.war</url>
</portal>
</request>
在第二种方法中,您的 XMLAccess 脚本将如下所示,您必须自己将 war 文件放入目录中:
<?xml version="1.0" encoding="UTF-8"?>
<request type="update" version="8.0.0.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="PortalConfig_8.0.0.xsd">
<portal action="locate">
<web-app action="update" active="true" domain="rel" uid="{id from portlet.xml}">
<url>file:////opt/WebSphere85/PortalServer/installableApps/MyPortlets.war</url>
</web-app>
</portal>
</request>
您可以使用\PortalServer\doc\xml-samples 中的示例导出各种XMLAccess 脚本。
我选择了第二种方法,因为我仍然想通过门户 GUI 手动更新 portlet 应用程序,并且已经以这种方式部署了很多东西。所以我所做的是在构建服务器上设置 XMLAccess。我将here 描述的 JAR 复制到构建服务器,并创建了一个 XMLAccess Ant 宏(注意 IBM 文档显示不正确的 JAR)来运行 XMLAccess 脚本:
<path id="XMLAccess.libraryclasspath">
<pathelement location="${WPS_80_DIR}/base/wp.xml.client/bin/wp.xml.client.jar"/>
<pathelement location="${WPS_80_DIR}/base/wp.base/shared/app/wp.base.jar"/>
<pathelement location="${WPS_80_DIR}/base/wp.engine.impl/shared/app/wp.engine.impl.jar"/>
<pathelement location="${WPS_80_DIR}/base/wp.utilities.streams/shared/app/wp.utilities.streams.jar"/>
<pathelement location="${WAS_80_DIR}/lib/j2ee.jar"/>
<pathelement location="${WAS_80_DIR}/lib/bootstrap.jar"/>
<pathelement location="${WAS_80_DIR}/java/jre/lib/ext/ibmjceprovider.jar"/>
<pathelement location="${WAS_80_DIR}/plugins/com.ibm.ws.runtime.jar"/>
<pathelement location="${WAS_80_DIR}/plugins/com.ibm.ws.emf.jar"/>
<pathelement location="${WAS_80_DIR}/plugins/org.eclipse.emf.ecore.jar"/>
<pathelement location="${WAS_80_DIR}/plugins/org.eclipse.emf.common.jar"/>
</path>
<macrodef name="xmlaccess">
<attribute name="script"/>
<sequential>
<java dir="${module}" classname="com.ibm.wps.xmlaccess.XmlAccess" logError="true">
<classpath refid="XMLAccess.libraryclasspath" />
<arg value="-user"/>
<arg value="wpsadmin"/>
<arg value="-url"/>
<arg value="http://portalhost:10040/wps/config"/>
<arg value="-password"/>
<arg value="passw0rd"/>
<arg value="-in"/>
<arg value="@{script}"/>
</java>
</sequential>
</macrodef>
然后我使用 SCP 任务将生成的 WAR 文件复制到其中一个门户节点。哪个节点无关紧要,只要它正确地将其连接设置到部署管理器即可。我建议在这里使用 SSH 密钥文件,当然本地用户需要被授予对服务器上 installableApps 目录的写入权限。
<scp file="mywars/portlet.war"
todir="deploymentuser@portalhost:/opt/WebSphere85/PortalServer/installableApps"
keyfile="${deployment.scp.key}"
passphrase="${deployment.scp.passphrase}" trust="true" />
对于每个应用程序,我都有一个用于部署的 XMLAccess xml 文件(或者,如果缺少它,我有一个 Ant XSLT 任务来使用 portlet.xml portlet 描述符动态生成一个)。您可以在 XMLAccess 脚本中设置 portlet 的唯一名称,使它们更容易在您可能希望通过 XMLAccess 部署的页面中引用,并且您还可以设置首选项并部署同一 portlet 的多个实例(而不是必须在 portlet 描述符中这样做)。您还可以使用 xml 访问任务来发布页面和其他内容,例如将您的测试环境设置为运行自动化集成测试的状态。
xml任务就是这样的:
<xmlaccess script="deploy-portlets.xml" />
然后门户将通过将其放入部署管理器来完成其余的工作。我还从 RAD 运行这些 Ant 脚本,并在我们的开发服务器上进行快速更新。