文章
· 九月 27 阅读大约需 7 分钟

使用 GitLab 持续交付 InterSystems 解决方案 – 第 10 部分:代码之外

经过将近四年的停顿,我的 CI/CD 系列又回来了! 这些年来,我与多个 InterSystems 客户合作,为不同的用例开发 CI/CD 管道。 希望本文中提供的信息对您有所帮助。

系列文章探讨了使用 InterSystems 技术和 GitLab 进行软件开发可以采用的几种方式。

我们有一系列激动人心的话题要讨论:但今天,我们来谈谈代码之外的事情 – 配置和数据。

问题

之前我们探讨过代码提升,这在某种程度上是无状态的 – 我们总是从一个(大概)空实例到完整的代码库。 但有时,我们需要提供数据或状态。 不同的数据类型包括:

  • 配置:用户、Web 应用、LUT、自定义架构、任务、业务伙伴等
  • 设置:环境特定的键值对
  • 数据:为了让应用正常工作,通常必须提供引用表等

我们来探讨所有这些数据类型,以及如何先将它们提交到源代码控制工具中,然后进行部署。

配置

系统配置分布在许多不同的类中,但 InterSystems IRIS 可以将大多数类导出为 XML。 首先是一个安全软件包,其中包含以下信息:

  • Web 应用程序
  • DocDB
  • 审核事件
  • KMIP 服务器
  • LDAP 配置
  • 资源
  • 角色
  • SQL 特权
  • SSL 配置
  • 服务
  • 用户

所有这些类都提供 Exists、Export 和 Import 方法,允许您在不同的环境之间移动它们。

一些注意事项:

  • 用户和 SSL 配置可能包含敏感信息,例如密码。 出于安全原因,通常建议不要将它们存储在源代码控制工具中。 使用 Export/Import 方法来方便地进行一次性传输。
  • 默认情况下,Export/Import 方法会将所有内容输出到一个文件中,这可能不适合源代码控制。 这里提供了一个实用类,可用于导出和导入查找表、自定义架构、业务伙伴、任务、凭据和 SSL 配置。 它会每个文件导出一个条目,因此您会得到一个包含 LUT 的目录,另一个包含自定义架构的目录,等等。 对于 SSL 配置,它还会导出以下文件:证书和密钥。

另外值得注意的是,除了导出/导入,您还可以使用 %InstallerMerge CPF 来创建这些条目中的大多数。 这两个工具还支持创建命名空间和数据库。 Merge CPF 可以调整系统设置,例如全局缓冲区大小。

任务

%SYS.Task 类存储任务并提供 ExportTasksImportTasks 方法。 您还可以查看上面的实用类,以逐个导入和导出任务。 请注意,当您导入任务时,如果 StartDate 或其他与计划相关的属性在过去的时间里,则可能会遇到导入错误 (ERROR #7432: Start Date and Time must be after the current date and time)。 解决方案是将 LastSchedule 设置为 0,InterSystems IRIS 会将新导入的任务重新安排为在不久的将来运行。

互操作性

互操作性生产包含:

  • 业务伙伴
  • 系统默认设置
  • 凭据
  • 查找表

前两个可以在 Ens.Config 软件包中通过 %Export%Import 方法获取。 使用上面的实用类导出凭据和查找表。 在最近的版本中,查找表可以通过 $system.OBJ 类导出/导入。

设置

系统默认设置 – 是环境特定设置的默认互操作性机制:

系统默认设置的目的是简化将生产定义从一个环境复制到另一个环境的过程。 在任何生产中,一些设置的值作为生产设计的一部分确定;通常而言,这些设置在所有环境中都应相同。 不过,其他设置必须根据环境进行调整;这些设置包括文件路径、端口号等。

系统默认设置应仅指定特定于安装 InterSystems IRIS 的环境的值。 相比之下,生产定义应指定在所有环境中都应当相同的设置值。

我强烈建议在生产环境中使用它们。 使用 %Export%Import 传输系统默认设置。

应用程序设置

您的应用程序可能也使用设置。 在这种情况下,我建议使用系统默认设置。 虽然这是一种互操作性机制,但可以通过以下方式访问设置:%GetSetting(pProductionName, pItemName, pHostClassName, pTargetType, pSettingName, Output pValue)文档)。 您可以编写一个包装器来设置您不关心的默认值,例如:

ClassMethod GetSetting(name, Output value) As %Boolean [Codemode=expression]
{
##class(Ens.Config.DefaultSettings).%GetSetting("myAppName", "default", "default", , name, .value)
}

如果您想要更多类别,还可以公开 pItemName 和/或 pHostClassName 参数。 可以通过导入、使用系统管理门户、创建 Ens.Config.DefaultSettings 类的对象或设置 ^Ens.Config.DefaultSettingsD 全局进行初始设置。

我的主要建议是将设置放在一个地方(可以是系统默认设置或自定义解决方案),应用程序必须仅通过提供的 API 获取设置。 这样,应用程序本身不知道环境,剩下的工作是为集中式设置存储提供环境特定的值。 为此,在您的仓库中创建一个包含设置文件的设置文件夹,文件名称与环境分支名称相同。 随后在 CI/CD 阶段,使用 $CI_COMMIT_BRANCH 环境变量加载正确的文件。

DEV.xml
TEST.xml
PROD.xml

如果每个环境有多个设置文件,请使用以环境分支命名的文件夹。 要从 InterSystems IRIS 内获取环境变量值,请使用 $System.Util.GetEnviron("name")

数据

如果您想让一些数据(引用表、目录等)可用,可以通过几种方式实现此目标:

  • Global导出。 使用二进制 GOF 导出或新的 XML 导出。 使用 GOF 导出时,请记住源系统和目标系统上的区域设置必须匹配(或者至少目标系统上的全局排序规则必须可用)。 XML 导出会占用更多空间。 您可以通过将Global导出为 xml.gz 文件进行改进,$system.OBJ 方法会根据需要自动(取消)归档 xml.gz 文件。 这种方式的主要缺点是数据无法被人类阅读,即使是 XML 也是如此 – 大部分采用 base64 编码。
  • CSV。 导出 CSV 并通过 LOAD DATA 导入。 我更喜欢使用 CSV,因为它是最节省存储空间的人类可读格式,并且任何内容都可以导入。
  • JSON。 使类支持 JSON
  • XML。 使类支持 XML 以将对象投射到 XML 中。 如果您的数据具有复杂结构,请使用该方式。

选择哪种格式取决于您的用例。 这里我按存储效率顺序列出了各个格式,但如果您没有大量数据,那就不必担心。

结论

状态为您的 CI/CD 部署管道增加了额外的复杂性,但 InterSystems IRIS 为此提供了大量管理工具。

链接

讨论 (0)0
登录或注册以继续