内容


多租户环境中的一种持续交付流程

如何使用 UrbanCode Deploy

Comments

简介

本教程将介绍如何使用 IBM® UrbanCode Deploy 在多租户环境中配置持续交付流程。该解决方案基于一个软件即服务应用程序的真实案例分析。在本教程中,该应用程序被称为 DevOps for SaaS。

场景

不同的虚拟机承载着多个 DevOps for SaaS 环境。每个虚拟机 (VM) 是一个共享环境,其中提供了 DevOps for SaaS 服务的多个实例,而且这些实例与不同的客户有关联(参见图 1 中的 VMa、VMb 和 VMn)。在这种类型的配置中,通常会多次安装应用软件堆栈。

图 1. IBM UrbanCode Deploy 管理的 DevOps for SaaS 环境
DevOps for SaaS 中实现的基础架构
DevOps for SaaS 中实现的基础架构

在本教程中,您将学习如何利用 IBM UrbanCode Deploy 来创建一个灵活的交付流程,它:

  • 有能力基于客户需求,独立地更新环境的每个应用程序实例
  • 有能力同时更新所有应用程序实例或一个子集
  • 在该流程中自动包含新应用程序实例

使用 UrbanCode Deploy 实现

本教程将介绍实现一个 UrbanCode 应用程序流程的步骤,该流程使用包含在特定流程运行中的客户列表作为输入参数。这如图 2 所示。

图 2. Run Process on DevOps for SaaS environment 面板
Run Process 面板显示了许多客户 ID
Run Process 面板显示了许多客户 ID

创建解决方案

基于 IBM UrbanCode Deploy 的交付流程解决方案包含:

  • 一个包含所有客户环境的应用程序环境
  • 一个标记要在运行时更新的资源的一般流程
  • 一个需要您想要更新的客户环境名称的应用程序流程

创建这个交付流程的 5 个步骤包括:

  • 第 1 步. 安装 IBM UrbanCode Deploy 命令行工具
  • 第 2 步. 定义在运行时标记资源的一般流程
  • 第 3 步. 定义组件
  • 第 4 步. 定义应用程序环境
  • 第 5 步. 使用一个输入值来定义应用程序流程

为了构建可管理 DevOps for SaaS 多租户环境的应用程序流程,UrbanCode 资源将在运行时基于 UrbanCode 应用程序流程输入数据来进行标记。要自动从一个 UrbanCode 流程标记资源,需要使用 IBM UrbanCode 命令行工具。IBM UrbanCode 命令行工具是一个可选的产品组件,可将它安装在 IBM UrbanCode 代理上。

第 1 步. 安装 IBM UrbanCode Deploy 命令行

在安装了 IBM UrbanCode Deploy 代理的机器上安装 IBM UrbanCode 命令行工具接口 (CLI)。此代理运行所有包含 CLI 命令的流程。

第 2 步. 定义在运行时标记资源的一般流程

要定义一个一般流程来在运行时标记资源,可以创建 3 个一般流程:

  • 流程 AddTagToResource 向一个资源添加一个标记。
  • 流程 RemoveTagFromTheResource 从一个资源中删除一个标记。
  • 流程 Find and tag resource to update 识别并标记要更新的资源。

备注:
标记和资源是该流程的输入

一般流程 “AddTagToResource”

AddTagToResource 流程向运行一个命令行命令的一个特定资源添加一个特定标记。此流程使用两个强制参数和两个可选参数(默认设置为当前值)。

两个强制参数是:

  • 资源名(图 3 中的 resourceProcess
  • 标记(图 3 中的 tagProcess

两个可选参数是:

  • IBM UrbanCode 命令行工具安装路径(图 3 中的 udcCLIPath
  • 管理员的密码(图 3 中的 adminCLIpwd

首先创建一个新的一般流程,并将它命名为 AddTagToResource。然后,在 Configuration 选项卡中,定义 4 个流程属性(输入参数),如图 3 所示。

4 个流程属性是:

  • resourceProcess:要标记的资源
  • tagProcess:要添加到资源的标记
  • udcCLIPath:运行此流程的命令行路径
  • adminCLIpwd:命令行管理员的密码

udcCLIPathadminCLIpwd 的默认值设置为您的 UrbanCode Deploy 环境的当前值。

图 3. 流程属性细节
流程的 4 个属性
流程的 4 个属性

定义一个流程很容易,只需一步即可完成。在 design 选项卡中,从 Step 面板中选择 shell 类型,并将这一步添加到您的流程中。结果如图 4 所示。

图 4. 向给定资源添加标记的流程
流程流

要使用 IBM UrbanCode Deploy 命令行将一个特定标记添加到资源中,可编辑 Shell script 步骤并将此命令插入到 Shell script 字段中:

${p:udcCLIPath} -weburl https://localhost:8443 -username admincli -password 
${p:adminCLIpwd} addTagToResource -resource "${p:resourceProcess}" -tag ${p:tagProcess}

一般流程 “RemoveTagFromTheResource”

创建一个新的一般流程并将它命名为 RemoveTagFromTheResource

在 Configuration 选项卡中,您将定义 4 个流程属性(输入参数),如图 5 所示。

  • resourceProcess:要标记的资源
  • tagProcess:要添加到资源的标记
  • udcCLIPath:运行此流程的命令行路径
  • adminCLIpwd:命令行管理员的密码

udcCLIPathadminCLIpwd 的默认值设置为您的 UrbanCode Deploy 环境的当前值。

图 5. 流程的输入参数
为 RemoveTagFromTheResource 定义的 4 个流程属性
为 RemoveTagFromTheResource 定义的 4 个流程属性

只用一步定义一般流程,如图 6 所示。为此,在 design 选项卡中,从 Step 面板中选择 shell 类型并将这一步添加到您的流程中。

图 6. 从给定资源中删除标记的流程
流程流

要使用 IBM UrbanCode Deploy 命令行从资源中删除一个特定标记,可编辑 Shell script 步骤并将此命令插入到 Shell script 字段中:

${p:udcCLIPath} -weburl https://localhost:8443 -username admincli -password
${p:adminCLIpwd} removeTagFromResource -resource "${p:resourceProcess}" -tag
${p:tagToRemoveProcess}

一般流程 “Find and tag resource to be updated”

流程 Find and tag resource to be updated 获取需要更新的客户环境的 ID 列表和一个资源作为参数。该流程检查指定的资源是否标记了一个输入客户的 ID(请注意,客户的 ID 也是标记)。如果资源使用输入字段中一个选定的 ID 进行了标记,该流程会将标记 toBeUpdated 添加到资源中。甚至在环境的所有资源上运行此流程时,也只能将使用作为输入传入的客户 ID 所标记的资源标记为 toBeUpdated

创建一个新的一般流程并将它命名为 Find and tag resource to be updated

在 Configuration 选项卡中,定义 4 个流程属性(输入参数),如图 7 所示。

  • resourceToVerify:您需要验证是否包含该标记的资源
  • tagToUpdate:要查找的用作资源的标记的标记列表
  • udcCLIPath:运行此流程的命令行路径
  • adminCLIpwd:命令行管理员的密码
图 7. “Find and tag resource to be updated” 流程的输入参数
一个流程的属性
一个流程的属性

图 7 显示了 design 选项卡。这是您定义一个流程的地方。定义的流程中的第一步找到资源路径的根目录(需要该目录,因为客户 ID 是在资源路径的根目录级别上定义的)。该流程将会接收资源路径,后者也包含组件。这一步中计算的资源路径可使用一个后期处理脚本来导出到 IBM UrbanCode Deploy 属性中。

GetTags 步骤是一个 shell,它运行 IBM UrbanCode Deploy 命令行来检索所有与作为输入传递的资源有关联的标记。要运行的 shell 命令是:

${p:udcCLIPath} -weburl https://localhost:8443 -username admincli -password
${p:adminCLIpwd} getTagsOnResource -resource "${p:FindRootResource/result}"

Check tags 步骤是一个 Shell 脚本,它验证与资源有关联的标记列表(在上一步中计算)是否包含一个作为输入传递的标记。清单 1 显示了要运行的命令的详细信息。

清单 1. Check tags Shell 脚本
#!/bin/bash
set -x
str2=${p:tagToUpdate}
str=${p:GetTags/result}
result=false
arr1=(`echo $str | cut -d "," --output-delimiter=" " -f 1-`)
arr2=(`echo $str2| cut -d "," --output-delimiter=" " -f 1-`)
for var in "${arr1[@]}"
do
s1=${var}
for var2 in "${arr2[@]}"
do
s2=${var2}
if [ "$s2" = "all" ]
then
    result=true
else
if [ "$s1" = "$s2" ]
    then
        result=true
fi
fi
done
done
echo $result

此检查的结果(true 或 false)可使用一个后期处理脚本设置到一个属性中。流程中后面的 switch 步骤将使用它。它验证资源是否需要标记。

步骤 Add tag to be updated 运行流程 Add tag to resource,如图 8 所示。

图 8. 查找和标记要更新的资源的流程
该图显示了一个流程的步骤
该图显示了一个流程的步骤

Add tag to the resource 流程的所有输入参数都在步骤属性面板中定义。自定义如图 9 所示的以下属性:

  • Resource Path 设置为 ${p:resource.path}
  • resourceProcess 设置为 ${p:resourceToVerify}
  • udcCLIPath 设置为 ${p:udcCLIPath}
图 9. “Add tag to be updated” 属性
Add tag to be updated 流程的 Edit properties 窗口
Add tag to be updated 流程的 Edit properties 窗口

第 3 步:定义组件

现在有必要定义 IBM UrbanCode Deploy 组件来管理您的应用程序实例(要更新的软件应用程序)。

定义一个新的 IBM UrbanCode Deploy 组件并将它命名为 Application instance,如图 10 所示。

图 10. 创建 “Application instance” 组件
Create new component 面板
Create new component 面板

要实现 Application instance 的交付流程,您需要创建至少 3 个新组件流程:

  • Update Component
  • Tag resource to be updated
  • Remove Tag resources to be updated

Update Component:更新应用程序实例。此流程取决于您管理的应用程序。

Tag resource to be updated:运行第 2 步中构建的一般流程 Find and tag resource to be updated。它获取需要更新的客户环境的 ID 列表作为输入。图 11 显示了 Tag resource to be updated 流程的组件属性。

图 11. “Tag resource to be updated” 流程的输入属性
用于添加流程的 Component process properties 窗口
用于添加流程的 Component process properties 窗口

Tag resource to be updated 流程包含一个运行该一般流程的步骤。

如图 12 所示,一般流程的输入参数是:

  • Resource Path:运行一般流程的资源。这应该是安装了 UrbanCode Deploy 命令行的代理的资源 id
  • Resource to verify:运行此组件流程的当前资源
  • TagToUpdate:此组件流程的作为这一步的输入传入的输入参数
  • UdcCLIPath:安装 UrbanCode Deploy 命令行的路径
图 12. “List tagged resource” 步骤的详细信息
该图显示了该流程的属性
该图显示了该流程的属性

Remove Tag resources to be updated 是用于从资源中删除 toBeUpdated 标记的流程。它使用第 2 步中定义的一般流程 RemoveTagFromTheResource。此流程有一个运行一般流程的单一步骤组成。

图 13. 该图显示了 “Remove tag” 步骤的详细信息
该图显示了该流程的属性
该图显示了该流程的属性

第 4 步:定义应用程序环境

要关联租户、组件和虚拟机,有必要定义一个应用程序环境。一个应用程序环境是用户定义的一个承载应用程序的资源集合。它通过部署组件的代理将它们集中在一起。一个资源表示与管理它们的代理位于同一个主机上的部署目标。

创建一个 IBM UrbanCode 应用程序并将它命名为 DevOps for SaaS。打开该应用程序,单击 Create new Environment 创建一个新应用程序环境。

图 14. 该图显示了创建新环境的面板
Create New Environment 面板
Create New Environment 面板

创建新环境后,您需要为它配置资源。图 15 显示了包含您刚创建的新环境的 Application 面板。您可以单击环境的名称来配置它。

图 15. environments 窗口选项卡
为我们的应用程序创建的新环境。
为我们的应用程序创建的新环境。

图 16 显示了 Create New Resource 窗口。首先,您需要为每个客户向环境中添加一个组:

  • 单击 Actions > Add group
  • 在 name 字段中键入客户的名称
图 16. 创建一个新资源的窗口
新资源的属性
新资源的属性

将一个包含 Customer ID 的标记添加到每个组。例如,如果 cus1Customer1Customer ID,可将标记 cus1 添加到组 Customer 1 中。

对于每个组,可添加包含客户的特定应用程序实例的代理。

您将在图 17 中看到,ucdsrv1 包含所有客户的应用程序实例。

图 17. DevOps4SaaS 环境中定义的标记
与环境关联的标记
与环境关联的标记

接下来,应该将为应用程序实例创建的组件与每个资源相关联。

图 18. 代理与环境之间的关联
代理关联到每个环境
代理关联到每个环境

在此配置的最后,您应该在 Environment 中看到每个客户有一个资源(表示为文件夹图标)。在客户资源中,拥有包含一个应用程序实例的代理资源。图 19 显示了这种环境结构。

图 19. 环境概述
代理关联到每个环境
代理关联到每个环境

第 5 步:使用一个输入值来定义应用程序流程

最后一步是创建一个应用程序流程,它获取需要更新的客户 ID 列表作为输入。该流程仅更新与这些客户有关联的资源。

首先,定义一个新应用程序流程并将它命名为 Update customer environment

在 configuration 选项卡中,如图 20 所示,添加应用程序属性 Customer ID to update

图 20. 为应用程序流程定义的输入参数
输入参数
输入参数

要定义 Customer ID to update 属性,可在 Edit Property 窗口中从 Type 下拉菜单选择 Multi Select,如图 21 所示。

图 21. 该图显示了与输入参数相关的细节
输入参数
输入参数

任何时候将一个新客户添加到环境时,您可手动或自动更新允许的值。要自动更新应用程序流程属性,可使用 REST API。因为此方法会覆盖应用程序流程属性,所以在任何时候更新流程时,您需要定义所有允许的值。允许的值的定义是:

  • All the IDs of the customers:这些是在运行期间被选择时将更新的环境实例的 ID
  • The fixed string all:这是如果在运行期间被选中,将用于更新所有环境实例的 ID
  • The fixed string none:这是如果在运行期间被选中,将用于避免更新在所有环境实例上更新的 ID。
代码清单 2. 修改应用程序流程属性的允许值的 post 方法
method type:  PUT
 url:  http://<udeploy_server>:<port>/rest/deploy/applicationProcess/
{applicationProcessId}/savePropDef  

body: 
{
allowedValues: [ {label: "allowedLabel1", value: "allowedValue1"} , { label: 
"allowedLabel2", value: "allowedValue2"} ],
applicationProcessVersion: "current version",
description: "description",
existingId: "existing property id",
label: "property label",
name: "property name",
pattern: "",
required: "false",
type: "MULTI_SELECT",
value: ""
}

定义流程属性后,您需要设计流程。在 design 选项卡中,配置流程步骤。图 22 显示了应用程序流程。

图 22. 应用程序流程设计
应用程序流程的设计
应用程序流程的设计

第一步 Tag resources to be updated 运行 Application instance 组件流程。Tag resource to be updated 传递 Customer ID 标记列表作为输入(此应用程序流程的输入)。此步骤标记所有使用了 Customer ID 标记列表中包含的一个标记来标记的资源。它们使用 toBeUpdated 标记来标记。图 23 显示了这一步的属性。

图 23. “Tag resources to be updated” 步骤
一个流程步骤的属性
一个流程步骤的属性

步骤 Update Application instance 向标记了 toBeUpdated 的资源运行 Application instance 组件流程 Update Application instance。更新仅在与指定为应用程序流程输入的客户环境有关联的资源上启动。

图 24. “Update application instance” 步骤细节
流程步骤属性
流程步骤属性

在流程快要结束时,从资源中删除标记 toBeUpdated。步骤 Remove TAGRecovery action:Remove tag toBeUpdated 运行组件流程 Remove Tag resources to be updated。这在所有标记了 toBeUpdated 标记的资源上运行。

结束语

在本教程中,您学习了如何在一个多租户环境中使用 IBM UrbanCode Deploy 管理持续交付流程,在该环境中,应用程序的多个实例被安装在一个共享操作系统上。

解决方案使操作团队能够基于客户 ID 来灵活地决定要更新哪个应用程序实例。这在一个特定客户(而不是所有客户)需要代码驱动程序的所有情形中很有用。


相关主题


评论

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=DevOps, Rational
ArticleID=1012646
ArticleTitle=多租户环境中的一种持续交付流程
publish-date=08052015