GoCD包材料
介绍
从GoCD 13.3开始轮询来自GoCD包及更多内容。GoCD中的流水线可以像轮询版本控制系统那样轮询存储库中的软件包。典型的构建通常会使用版本控制系统(VCS/SCM)中维护的源代码。那么典型的部署呢?越来越多的情况下,部署的输入是打包为以下形式的构建结果:
- 在Java情况下为jar、war或ear文件
- nuget/ chocolatey在.NET情况下的包
- Linux系统包(例如rpm、deb)在任何应用平台的情况下
- 其他应用级别的包格式如gem、npm等,phar, wheel等等。
这些文件(包)通常保存在相应的包存储库中。这些包可以被指定为GoCD流水线的材料。
支持的包
由于有许多不同的包格式,每个都有自己的包管理器和存储库,因此对包作为材料的支持已经通过扩展点实现。通过使用yum-repo-poller插件,可以将dnf/yum存储库中的rpm包指定为GoCD流水线的材料。通过其他外部插件,也可以对其他类型的包进行相同的操作。
仓库、包和材料
一个存储库可能包含一个或多个包。流水线可以将包作为材料引用。当包在存储库中更新时,感兴趣的流水线将会被调度。
存储库定义
包材料插件允许流水线组管理员向GoCD提供对应存储库类型的详细信息。例如,这里是使用yum-repo-poller插件.
注意:
- 定义dnf/yum存储库的方式。存储库名称不被包材料插件使用——它被Go用来构造材料名称。
- 两个包存储库不能具有相同的名称。
- 使用检查连接按钮确保Go能够与该存储库正常工作。
包定义
包材料插件还允许你在流水线材料配置时定义包(Admin > Material > Add Material > Package)。这是使用Yum插件定义RPM包的示例。包名称不被包材料插件使用——它被Go用来构造材料名称。存储库中的两个包不能具有相同的名称。使用检查包按钮确保包定义确实解析为你所需的包。
与其他VCS/SCM材料不同,在包的情况下,材料定义并不包含在流水线定义中。许多流水线的材料定义可能引用同一个包。以下是我们将现有包作为流水线材料关联的方式。
注意:
每个包定义必须解析为存储库中的确切一个包,否则流水线将无法运行。为了设置一个轮询多个包的流水线,请将每个包配置为单独的材料。
每个包材料插件将其属性的一部分定义为包指纹。例如,在Yum插件的情况下,这个子集包括存储库URL和包规范(排除存储库用户名和密码)。存储库和包名称不是包指纹的一部分。禁止多个包具有相同的包指纹。尝试这样做将导致类似以下的错误消息:
为了执行此操作,需要解决以下错误:
无法保存包或存储库,发现重复的包。[存储库名称:‘orchard’,包名称:‘apple’],[存储库名称:‘orchard’,包名称:‘orange’]
示例XML配置
以下是RPM包定义的XML视图。注意存储库、包和流水线材料之间的关系。为了适应不同的插件,使用未严格类型化的属性、键和值标签来进行存储库和包配置。如果你选择通过直接编辑XML进行配置,请注意无需提供存储库和包ID,Go服务器将自动生成它们。然而,通过UI配置时进行的一些验证在通过XML编辑配置时不生效——失败的结果将在浏览器框架右下角的服务器健康消息面板中稍后显示。
<repository id="1ce5c205-977f-4c0e-ada4-882030580eed" name="ora">
<pluginConfiguration id="yum" version="1" />
<configuration>
<property>
<key>REPO_URL</key>
<value>http://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64</value>
</property>
</configuration>
<packages>
<package id="840b0b60-bd29-489d-b5ea-ccff5f6459a9" name="gcc" autoUpdate="false">
<configuration>
<property>
<key>PACKAGE_SPEC</key>
<value>gcc-4.*</value>
</property>
</configuration>
</package>
</packages>
</repository>
...
<pipelines group="showcase">
<pipeline name="dependsOnGcc">
<materials>
<package ref="840b0b60-bd29-489d-b5ea-ccff5f6459a9" />
</materials>
...
价值流建模技巧
根据GoCD是否也在发布包或者仅消费它,有两种方法来建模包含包的价值流。
-
第一种情况是包是从GoCD中的某个流水线发布的。假设流水线X发布包P到外部存储库,并且流水线Y消费P。为了在发布P之后触发Y,有以下两种选项:
- 流水线依赖:X成为Y的材料。Y解析P的确切版本并自行下载它(尽管这个提示可用于从X传递包版本信息给Y)。X将作为Y的上游组件出现在Go中。价值流图。
- 包材料:Y 将 P 添加为包材料。Y 不再需要解析 P。
同时执行两者是不可取的,因为 Y 将会调度两次。选择取决于管道 X 和 Y 中的活动之间的关联程度。如果在同一个价值流图中查看 X 和 Y 是重要的,那么选项 #1 是有意义的。
-
第二种场景是 GoCD 不知道包是如何/由谁发布的。也许它是由 Jenkins 中的一个任务发布的。或者这个包是一个互联网公共仓库上的开源包。在这种情况下,唯一的选择是使用包材料。如果包创建者将跟踪信息添加到包元数据中,GoCD 可以帮助您追溯到包的外部来源。此细节将因插件而异。在 Yum 插件的情况下,我们使用 rpm 元数据中的 URL 字段进行此操作。
权限
仓库及其包是全局实体,不与某个管道组或环境绑定。管道组管理员可以定义仓库和包以供其管道使用。一个管道组管理员也可以使用另一个管理员定义的包用于他们的管道。更改包定义将导致所有依赖该包的管道调度 - 即使这些管道不在编辑者的同一管道组中。由于这个原因,我们没有提供 UI 方式来更改包定义。只有 GoCD 管理员可以通过 Admin > Config XML 标签页进行更改。
轮询
即使没有管道使用某个包,GoCD 每分钟都会轮询更新包。这可以在包级别通过设置自动更新为 false 的方式在 config xml 中关闭(仅适用于 GoCD 管理员)。autoUpdate 默认是开启的。当找到新版本的包时,以该包作为材料的管道将被调度(假设自动调度管道是开启的)。另见API 调度.
包信息显示
预期从包材料插件获取以下信息(如果可用,插件将从包元数据中获取)
- 包版本(例如 gcc-4.4.7-3.el6.x86_64)
- 包构建时间
- 包创建者名称(如果可用)
- 包注释
- 回溯 URL - 通常是一个绝对 URL,指示哪个任务(在 GoCD 或其他系统中)创建了该包。
- 包 - 材料名称(即 repo-name:package-name)
在构建包时,建议尽可能包含上述信息,以便 Go 可以如下显示。
下载包
包不会自动下载到代理上并供任务使用。这与 VCS/SCM 材料不同,默认情况下会进行检出。对于包,GoCD 代理通常是部署的目标节点,它只是协调远程节点的部署。因此,而不是自动下载,提供以下环境变量:
- GO_PACKAGE_< REPO-NAME >_< PACKAGE-NAME >_LABEL
- GO_REPO_< REPO-NAME >_< PACKAGE-NAME >_REPO_URL
- GO_PACKAGE_< REPO-NAME >_< PACKAGE-NAME >_LOCATION
仓库和包名称转换为全大写,并且连字符转换为下划线,然后包含在环境变量名称中。例如,假设我们设置了一个名为 ORA 的仓库,指向https://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64并定义了一个gcc软件包,规格为gcc-4.*并将其设置为流水线的材料。要在代理上本地下载该软件包,我们可以编写如下任务:
[go] Start to execute task: <exec command="/bin/bash" >
<arg>-c</arg>
<arg>curl -o /tmp/gcc.rpm $GO_PACKAGE_ORA_GCC_LOCATION</arg>
</exec>
当任务在代理上执行时,环境变量如下替换:
[go] Start to execute task: <exec command="/bin/bash" >
<arg>-c</arg>
<arg>curl -o /tmp/gcc.rpm $GO_PACKAGE_ORA_GCC_LOCATION</arg>
</exec>.
...
[go] setting environment variable 'GO_PACKAGE_ORA_GCC_LABEL' to value 'gcc-4.4.7-3.el6.x86_64'
[go] setting environment variable 'GO_REPO_ORA_GCC_REPO_URL' to value 'https://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64'
[go] setting environment variable 'GO_PACKAGE_ORA_GCC_PACKAGE_SPEC' to value 'gcc-4.*'
[go] setting environment variable 'GO_PACKAGE_ORA_GCC_LOCATION' to value 'https://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64/getPackage/gcc-4.4.7-3.el6.x86_64.rpm'
...
或者,简单地将其作为参数传递给远程服务器上的部署脚本
<exec command="/bin/bash">
<arg>-c</arg>
<arg>ssh server "cd /to/dest/dir;deploy.sh $GO_PACKAGE_ORA_GCC_LOCATION"</arg>
</exec>
另见安装RPMs
重要提示:请注意,如果您更改了仓库凭据,然后尝试重新触发(重新部署)旧包,已发布的环境变量将不会反映新的凭据。
发布包
目前,GoCD 不为您创建或发布包。但对于每种类型的包来说都相对简单。例如:rpm
包依赖关系
请注意,GoCD 不支持任何自动轮询或其他形式的包依赖关系支持。每个包依赖关系都需要单独指定为独立材料(如果有需要)。或者,只需轮询依赖关系图根部的包,并让包管理器在安装时处理其余部分。例如,如果 componentA-1.2.0-b234-noarch.rpm 依赖于 componentB-2.3.0 或更高版本,只需轮询 componentA 并让
yum install componentA-1.2.0-b234-noarch
为你解决 componentB。