转载

自动构建和部署 MobileFirst Platform 工件,以此作为持续交付过程的一部分

简介

IBM® MobileFirst Platform (MFP) 是一个平台,用于开发混合、本机和 Web 应用程序。它被划分为服务器端组件和客户端组件,借助开箱即用的安全性、应用程序管理功能以及它对多种应用程序架构的支持,MFP 可以缩短交付时间。服务器端组件包括适配器,用于提供移动设备可以使用的数据,比如 JSON。您可以将该适配器连接到各种后端系统,从基于 SOAP 的 Web 服务到更现代的 RESTful 接口。客户端库提供了一些功能,这些功能可以:用来处理安全性、离线存储和 iBeacons:用来在混合视图和本机视图之间传递数据;用于其他许多基于 Apache Cordova 技术的客户端技术。在构建客户端组件时:会创建一个 MFP 二进制文件 (.wlapp) 并将它部署到服务器,还会为目标平台创建二进制文件(.apk 适用于 Android,.ipa 适用于 iOS)。

要使用 MFP 框架来构建移动应用程序,可以使用 IBM MobileFirst Studio(一个基于 Eclipse 的 IDE),或者 IBM MobileFirst 命令行接口 (CLI)。当您使用这些工具时,它们会启动一个构建所有适配器、所有应用程序(如果项目有多个应用程序)和所有自定义项目运行时(服务器 WAR 文件)的过程。在将项目部署到自己的服务器时,项目运行时是在部署适配器和应用程序之后安装的。要将项目部署到测试环境中,必须专门为该环境构建一些组件。CLI 工具无法构建这些组件,但 Eclipse 可以做到。您可以使用服务器控制台来部署构建组件。使用 MFP 中提供的 Ant 任务,您可以创建一个持续集成 (CI) 管道,自动化构建过程、部署过程,以及服务器的创建和配置。

文章综述

本文将向您展示如何找到和驱动 MFP 中提供的 Ant 任务。本文提供了一个示例项目,向您展示如何配置该项目来生成一个工作 CI 管道。然后,本文描述了构建和部署 MFP 组件所涉及的每个组件。

先决条件

  • MFP Server --下载 MFP V6.3 Server
  • MFP CLI
  • MFP 提供了一些脚本来配置服务器,以便使用各种数据库。为了简便起见,本文使用了 Apache Derby 数据库 。如果您喜欢使用 IBM DB2,采用的流程应该是近似的,只需使用不同的参数来使用不同的 Ant 任务。
  • Apache Ant
  • 一个 Unix shell,比如 Bash 或 Zsh
  • WebSphere Application Server Liberty Profile -- 您可以 下载单独的 Liberty Profile Developer Edition ,或者使用已经与 MFP CLI 打包在一起的 Liberty Profile 版本。

所需的文件和示例项目

您可以 从 GitHub 下载一个示例项目 ,该项目包含本文中使用的代码。存储库包含一个 MFP 项目,该项目有一个简单的 Web 应用程序,此应用程序有一个用来调用适配器的按钮,适配器会将当前数据返回给用户。该项目的结构如下所示,包括添加了一个叫做 ciBuild 的新目录,它包含本文中描述的构建脚本。

ciBuild 目录应该包含与 MFP CLI 工具打包在一起的 build.xml Ant 任务。 configure-liberty-derby.xmlconfigure-liberty-db2.xml 文件与 MFP Server 打包在一起,包含 Ant 任务的定义,可用来创建完全由项目运行时使用的数据库,以及管理服务。它们还包含部署服务 WAR 文件( worklightconsole.warworklightadmin.war )的任务,以及项目运行时。

发现所需的 JAR 和 XML 文件

构建和部署 MFP 项目组件(比如适配器和 wlapp 文件)需要 build.xml Ant 文件。该文件位于 CLI installation 目录中,和工具所使用的 JAR 文件在一起。 /Applications/IBM/MobileFirst-CLI/mobilefirst-cli/node_modules/generator-worklight-server/lib directory 包含以下 JAR 文件:

  • worklight-ant-deployer.jar -- 在将通过构建生成的工件部署到 MFP 服务器时,需要使用此文件。
  • ant-contrib-1.0b3.jar -- 包含由 build.xml 文件使用的一些额外的 Ant 函数,比如 for 循环的定义,用于在适配器目录上进行迭代。
  • worklight-jee-library.jar -- 包含产品的核心部分。在因为没有进行完整 MFP 安装而需要配置服务器的时候, configure-liberty-derby.xml 脚本可以指向它。
  • worklightconsole.warworklightadmin.war -- 服务 WAR,服务器管理需要它们。

该目录中的 build.xml 文件也是运行 GitHub 项目所必需的。 build.xml 文件包含构建和部署 MFP 组件所需的所有任务的定义。将 build.xml 复制到位于项目根目录中的 ciBuild 目录中。还有一个叫做 configure-liberty-db2.xml 的额外的 XML 文件,该文件是为数据库配置服务器所需要的,位于 /Applications/IBM/MobileFirst_Platform_Server/WorklightServer/configuration-samples/ 中。如果您使用的是 DB2,而不是 Derby,请将 configure-liberty-db2.xml 添加到 ciBuild 目录。

MFP JAR 文件 ( worklight-ant-builder.jar ) 用于构建组件,比如项目运行时,适配器位于 ant-tools 目录中,该目录位于 /Applications/IBM/MobileFirst-CLI/mobilefirst-cli/node_modules/generator-worklight-server/ant-tools

要启动 CI 构建,让示例项目运行,请将所有这些 JAR 文件复制到您项目中的某个目录中。执行此操作使您能够从不同的位置(比如没有安装 MFP 的服务器)运行一个构建。管理脚本是您的 SCM 的一部分,这意味着这些脚本都受版本控制。 ciBuild 目录中的示例项目包含一个名为 ant_jars 的文件夹,用来保存构建过程所需的 JAR 文件。在您的项目中创建一个 ciBuild 目录,用该目录来存储构建相关的组件,比如示例项目中的组件。示例项目中的 ant_jars 目录不包含任何 JAR 文件,因此您必须根据上面的指令复制它们。然后, ciBuild 目录将包含以下 JAR 文件(用于示例项目的运行):

  • ant-contrib-1.0b3.jar
  • hsqldb-2.2.5.jar
  • worklight-ant-builder.jar
  • worklight-ant-deployer.jar
  • worklight-jee-library.jar

驱动 build.xml

在示例项目中,有三个 Bash 脚本(shell 编程脚本),它们用相应的参数调用了 Ant 任务。 mfp-ci-derby-install.shmfp-ci-build.sh 文件导入 common-functions.sh 文件并执行单个函数。

common-functions.sh

common-functions.sh 脚本包含构建过程的单个组件,这些组件被拆分成可由其他 Bash 脚本调用的函数。此结构为开发 CI 管道过程中的组件重用提供了一个平台。在开始执行 common-functions.sh 的时候,需要执行许多各种导出来实现成功的执行。相对于这些操作设置了一些变量,这些变量必须成功配置。

export USER="/Users/devworks" export LIBERTY_TARGET="$USER/Documents/LibertyProfile" export WORKLIGHT_INSTALL_DIR="/Applications/IBM/MobileFirst_Platform_Server"

上面的 $USER 变量是必需的,因为需要一个绝对目录来配置 MFP 服务器组件所使用的 Derby 数据库。 $LIBERTY_TARGET 是解压的 WebSphere Application Server Liberty 服务器文件所在的位置,它应该包含一个 wlp 目录。 $WORKLIGHT_INSTALL_DIR 是安装 MobileFirst Server 的位置。在 Mac 机器上,默认位置是 /Applications/IBM/MobileFirst_Platform_Server

common-functions.sh 中的第一个函数是 setEnvironment() ,它包含特定于 CI 构建的目标环境的另一系列导出。默认值是本地创建和构建一个服务器,但您可以将它们更改为一个远程服务器。该函数允许您为每个构建环境提供不同的值,这些环境包括开发、测试和生产环境。

mfp-ci-derby-install.sh

mfp-ci-derby-install.sh 脚本执行以下组件:

  • 停止现有的服务器(如果它正在运行)
  • 删除 Liberty 服务器和 Derby 数据库(如果它们存在)
  • 创建一个新的服务器
  • 为管理服务和项目运行时安装 Derby 数据库
  • 安装管理 WAR 文件( worklightconsole.warworklightadmin.war
  • 安装项目运行时
  • 启动新创建的服务器

mfp-ci-build.sh

mfp-ci-build.sh 脚本执行以下组件:

  • 构建项目运行时(项目 WAR 文件)
  • 构建应用程序和适配器( .wlapp.adapter 文件)
  • 执行与 mfp-ci-derby-install.sh 相同的步骤来部署项目运行时
  • 将已生成的构建工件部署到新创建的服务器

将环境构建和组件构建分离,这允许您选择提供给 CI 服务器的控制级别。丢弃所有现有服务器并为每个部署创建一个干净的服务器通常更可取一些。如果您不愿意每次都丢弃环境,那么您可以在 Liberty server apps 目录中的现有环境的基础上复制新创建的自由运行时。

运行示例项目

要运行示例应用程序,请将必要的 XML 和 JAR 文件复制到相应的地方,并在开始执行 common-functions.sh 时编辑导出,如上所述。其他所有变量都相对于执行此脚本的 MFP 项目进行了设置。在完成这些编辑之后,在终端上执行 mfp-ci-build.sh 脚本。最终部署的应用程序、适配器和运行时都将位于 http://localhost:9080/worklightconsole/index.html ,构建二进制文件位于项目 bin 目录中。

构建组件:运行时、适配器和应用程序

您可以使用 build.xml 中的 build-war 任务定义来构建项目运行时。该构建是由 common-functions.sh 中的 buildWar() 函数驱动的。项目的位置、项目名称和 Ant JAR 文件的位置都被传递到此函数,而且它是在设置环境变量之后由 mfp-ci-build.sh 调用的第一个组件。

类似的已定义函数构建了 .wlapp 和 .adapter 文件,而这些文件将会调用由 MFP 提供的 Ant 任务:build-Adapters 和 build-Apps。它们都在 common-functions.sh 中定义,通过 mfp-ci-build.sh 进行调用。它们采用了与 buildWar() 函数相同的方式来传递值。 buildApps() 函数传递外部服务器 URL,确保应用程序在部署到服务时拥有正确的已配置端点。来自所有这些函数的输出都位于项目根目录的 bin 文件夹中。

部署组件

有许多种方式可用来部署项目运行时(WAR 文件)。

如果之前已经部署了 MFP 运行时,那么您可以停止服务器,将新的 WAR 文件复制到旧文件上,并重新启动服务器。此外,在使用安装任务再次安装服务器之前,您可以从服务器使用卸载 Ant 的任务来删除配置。

另一种方法是从头重新安装服务器,这是首选,以为它会在每次构建时提供了一个干净的、没有使用过的环境。 mfp-ci-derby-install.sh 脚本会在创建一个新服务器并安装所有必要组件和服务器运行时之前清理环境和数据库。 common-functions.sh 包含一个 deployWar() 函数,该函数适用于此过程涉及的所有步骤。每个函数都是在 common-functions.sh 中单独定义的。在执行此步骤之后,您会有一个没有应用程序或已部署的适配器的服务器,如下所示。

install() 函数是通过传递 Ant 任务的一个参数 ($1) 来调用的 -- 例如,adminstall 参数告诉该函数安装管理和控制台 WAR 文件。该函数被调用了 4 次,每个必须执行的任务调用一次:admdatabases、databases、adminstall 和 install。它传递参数的方式与其他函数相同。在以这种方式将参数传递给 Ant 任务时,如果变量没有被正在调用的任务使用,那么该变量是无效的。该任务必须传递数据库的名称和 Liberty Profile 的位置,在该位置上配置服务器。

要部署应用程序和适配器文件,可以使用 deploy-Apps 和 deploy-Adapters Ant 任务。它们都是通过 deployApps()deployAdapters() 函数驱动的。和之前一样,它们传递变量,包括 MFP 控制台的用户名和密码,而且可以通过管理服务上传它们。在示例项目中,它位于上下文根目录 /worklightadmin 上,但它可以位于不同的目录,所以请检查现有 server.xml 文件来确定其上下文。

工具

Jenkins

Jenkins 一个开源持续集成和构建管理器。它会自动触发构建,以及其他与构建软件相关的任务,比如显示测试图形和其他构建数据。Jenkins 被用作构建管理器,拥有 1000 多个开源插件。还有其他一些构建管理器工具,比如 IBM Rational® Urban Code。

Git Webhooks

Webhooks 允许您在构建服务器与 Git 之间建立集成,订阅某些事件。当事件被触发时,您会收到一个 HTTP POST,指向指定的 URL。您可以使用 webhooks 来打开和关闭出问题的跟踪系统中的票据,然后开始构建,或通过电子邮件给您发送相关状态。

JNDI 覆盖

您可以设置 Liberty 配置 server.xml 中的 JNDI 条目,然后可以覆盖 MFP 服务器端组件中的相应变量。这种方法允许您构建自己的工件一次,并将它们部署到多个环境。例如,您可能拥有适配器文件,要求代理能够访问某个端点。当您将您的适配器从环境 A 移动到 环境 B 时,可以将该端点配置为环境 A 的 worklight.properties 中的一个变量,然后使用环境 B 的 server.xml 中的一个 JNDI 查找覆盖它。

使用 Bash 还是不使用 Bash?

本教程使用了 Bash 来控制 MFP 组件的构建和部署,但您也可以在管道中使用其他几个工具完成此工作。一种方法是直接调用 Ant build.xml 文件,对每个环境的硬编码配置进行适当的编辑。不要对产品的新版本采用这种方法,新版本中可能包括一个新的 build.xml 文件。在升级期间,不必编辑此文件,只需重新配置驱动它的方式,这样可以节省时间。

构建移动应用程序二进制文件并将它部署到 AppCenter

用于构建被部署到移动设备的二进制文件的指令不包括在本教程中。但您可以通过使用 Ant 来构建混合 Android 项目,并使用 Xctool 构建 iOS 应用程序来自动化这个步骤。然后,您可以以无头的方式,使用 MFP 中提供的工具将这些二进制文件部署到 MFP ApplicationCenter。关于这些指令,请参阅 MFP 知识中心内 用于上传或删除应用程序的命令行工具 。通过适当地使用这两个额外的元素,您课可以创建一个 CI 管道来构建环境、移动应用程序和适配器。然后,您可以将它们部署到 MFP 应用中心,测试团队可以从这里将它们下载到其设备。

结束语

本文向您展示了如何使用产品中提供的 Ant 任务来构建和部署 MFP 组件,比如适配器、wlapps 和 WAR 文件。本文展示了构建和部署这些组件所需的库,还提供了如何使用它们的示例,这些都是构建一个持续交付管道的核心要求。示例项目为那些想要自动化 MFP 项目和环境的构建和部署的人提供了一个起点。

正文到此结束
Loading...