【问题标题】:Deploy websphere portal Portlets as Web Modules using jenkins使用 jenkins 将 websphere 门户 Portlet 部署为 Web 模块
【发布时间】:2016-05-23 10:42:00
【问题描述】:

我有一个构建服务器 (win),将 Jenkins 2.0 作为构建和部署工具。以及 WebSphere Portal 8.5.5.2 的 2 个 WAS 服务器集群(获胜)

我使用 ANT 脚本成功构建了我的 EAR 和 WAR 文件。并使用 jenkins“websphere 部署”插件将 EAR 和 WAR 部署到我的 websphere 门户 8.5.5.2。

WAR 文件是 Web 模块 portlet。如果我选择手动部署 Web 模块,我可以使用 XMLACCESS 脚本或通过管理 -> Web 模块 GUI。

如果我使用 jenkins 部署 WAR,它会将它们转换为 EAR 文件并将它们部署到门户,并且它不会在管理控制台中显示为 Web 模块。

我注意到,当从管理 Web 模块 GUI 安装 WAR(例如“webapp.war”)时,它会将显示名称添加为 PA_webapp,并将上下文根添加为 /wps/webapp,但是当通过 /ibm/console 界面安装时或通过 jenkins 插件,显示名称将保留 webapp,上下文根也将保留 webapp(它不添加 PA_ 前缀或 /wps/ ...)

如何使用 XMLACCESS 和管理 GUI 以外的工具正确部署 portlet Web 模块?

【问题讨论】:

    标签: jenkins-plugins web-deployment portlet websphere-portal


    【解决方案1】:

    我或多或少有同样的问题,虽然我没有使用 Jenkins,但我确实使用了 XMLAccess 来解决它。

    portlet 应用程序的自动部署基本上有三种方法:

    1. 将您的portlet WAR 打包到EAR 文件中,并通过部署管理器/WAS 部署它们。这就是所谓的“预部署”,这就是 Jenkins 所做的。放入 EAR 后,您必须使用 XMLAccess 完成部署,以便门户知道 EAR 包含包含 portlet 的 Web 应用程序。如果您已经通过 XMLAccess 部署和注册过一次,您可以通过部署新的 EAR 文件来继续部署应用程序的更新。
    2. 使用 WAR 文件并通过门户部署它们,类似于通过 GUI 进行部署的方式;然后 Portal 将使用部署管理器/WAS 来部署它。然后它将在 WAS (PA_YourModule) 中生成应用程序名称。为此,您需要将 WAR 文件上传到服务器。
    3. 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 脚本,并在我们的开发服务器上进行快速更新。

    【讨论】:

    • 非常感谢 Rober 的广泛而详尽的专业回答。在复制了 xmlaccess.bat 文件中引用的所有 jar 之后,我还采用了在构建服务器上运行 xmlaccess 的第二种方法。我还采用了为每个 portlet 分离 xml 文件的方法,这样我每次更新 portlet 时都不必编辑 xml 文件,我只需调用我要更新的 portlet 的 xml 文件。我将使用 ant 脚本输入我要更新的 portlet 名称,它会调用这些 portlet 的相应 xml。
    【解决方案2】:

    您必须首先使用 WAS Portal 的管理 GUI 安装 portlet(因为这需要 XML Access 来注册 portlet)。在这个初始部署之后,您可以使用 WebSphere Deployment Plugin 自动生成 portlet 并将其部署到 WAS Portal。您必须确保匹配 WDP 配置中的路径(即 /wps/)和应用程序名称(即 PA_app_name)。您可以使用最新的 WDP 1.4.2 beta 插件发布更新(您必须让插件仅使用更新,而不是从头开始安装)。在您的 Portlet 自动更新后,您只需刷新网页即可查看更新更改。

    如果您指定 WAR 进行部署,WDP 应该自动为 portlet 生成和 EAR。

    -WDP 架构师/开发者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多