GoCD包材料

介绍

从GoCD包和GoCD 13.3开始,GoCD中的管道可以在存储库库中进行轮询,类似于他们轮询版本控制系统。构建通常使用版本控制系统(VCS/SCM)中维护的源代码。那么典型的部署呢?越来越多地,部署的输入是构建结果打包为以下种类的包:

  1. 在Java中打包为jar, war或ear文件。
  2. 在.NET中打包为nuget/ chocolatey
  3. Linux系统包 (例如 rpm, deb) 在相应的应用平台
  4. 其他 应用级别的包 例如 gem, npm, phar, wheel 等等.

这些文件(包)通常在相应的包存储库中维护。此类包裹可指定为GoCD管道材料。

支持的软件包

由于每种软件包格式都有自己的软件包管理器和存储库,所以对软件包的支持已作为扩展点实现。使用捆绑的yum-repo-poller插件,可以指定保存在yum存储库中的rpm包作为GoCD管道的材料。使用其他外部插件,可以对其他类型的包执行相同的操作。

知识库,包和材料

存储库可能包含一个或多个软件包。流水线可以将包裹称为材料。当在存储库中更新包时,感兴趣的管道将被安排。

储存库定义

包材料插件允许管道组管理员向GoCD提供相应存储库类型的详细信息。例如这里是我们如何使用捆绑的yum-repo-poller插件定义yum存储库。

注意:

1.存储库名称未被包装材料插件使用 - Go使用它来构造材料名称。 2.两个软件包存储库不能具有相同的名称。 3.使用检查连接按钮确保Go可以使用此存储库。

包定义

包材料插件还允许您在管道材质配置时(管理>材料>添加材料>包)(Admin > Material >Add Material > Package)定义包。 以下是使用捆绑的yum插件定义RPM软件包的样子。 封装材料插件不使用封装名称 - Go使用它来构建材料名称。 存储库中的两个软件包不能具有相同的名称。 使用检查包按钮确保包定义确实解析到您正在查找的包

与其他VCS/SCM材料不同,包装中的材料定义不包含在管道定义中。许多管道可能具有涉及相同包的材料定义。 以下是我们如何将现有软件包与管道材料相关联。

注意:

每个包定义必须解析到存储库上的一个包,否则管道将不会运行。 为了设置轮询多个包的管道,将每个包配置为单独的材料。

每个包装材料插件将其属性的子集定义为包指纹(package fingerprint)。 例如 在捆绑的yum插件的情况下,这个子集包含Repository URL和Package Spec(它不包括存储库用户名和密码)。存储库和软件包名称不是软件包指纹的一部分。 不允许多个具有相同包装指纹的包装。 试图这样做会导致这样的错误消息:

需要解决以下错误才能执行此操作:
无法保存包或存储库,当发现重复的包。 [存储库名称:'orchard',包名称:'apple'],[存储库名称:'orchard',包名称:'orange']

示例XML配置

以下是RPM软件包定义的XML视图。请注意库,包和管道材料之间的关系。松散类型的属性,键和值标记用于存储库和程序包配置,以适应不同的插件。 如果您选择通过直接XML编辑进行配置,请注意,不需要提供存储库和软件包ID,Go服务器将自动生成它们。但是,在通过XML配置进行配置时,并非通过UI进行配置时执行的所有验证都会在浏览器框架右下角的服务器运行状况消息面板中显示。

<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是否发布软件包或者仅仅使用软件包,有两种选择来建模包含软件包的值流。

  1. 第一种情况是从GoCD的某个管道发布软件包的位置。假设管道X将包P发布到外部回购站,并且管道Y消耗P.为了在公布P后触发Y,有两种选择:

    1. 管道依赖关系:X成为Y的材料.Y解析P的确切版本并自行下载它(尽管此提示可用于将包版本信息从X传递到Y)。 X将在价值流图中中作为Y的上游组件出现。
    2. 包材料:Y将P添加为包装材料。 Y不再需要解析P.

    因为Y会安排两次,所以不建议这样做。选择取决于管道X和Y的活动有多密切相关。如果在同一个值流映射中看到X和Y很重要,那么选项#1是有意义的。

  2. 第二种情况是GoCD不知道如何/谁发(how/who)布了包。也许它是Jenkins中的某个作业发布的。或者,这个软件包可能是互联网公共资料库上的开源包。在这种情况下,唯一的选择是使用包装材料。如果软件包创建者向软件包元数据添加引用信息,GoCD可以帮助您追溯到软件包的外部来源。 这些细节会因插件而异。 在捆绑的yum插件的情况下,我们使用rpm元数据中的URL字段来实现此目的。

权限

存储库及其软件包是不绑定到管道组或环境的全局实体。 管道组管理员可以定义存储库和程序包以在其管道中使用。 一个管道组管理员也可以使用另一个管道为他们的管道定义的软件包。 更改程序包定义将导致所有相关管道排定 - 即使那些与人员编辑不在同一管道组中的管道也是如此。 正因为如此,我们没有改变软件包定义的UI方式。 只有GoCD管理员可以通过Admin>Config XML选项卡进行更改。

轮询

即使没有管道使用包,GoCD每分钟都会轮询更新的包。 可以通过config xml(仅限GoCD管理员)将autoUpdate设置为false来在包级别关闭此功能。autoUpdate默认打开。当找到一个较新的包时,它所属的管道将被调度(假设管道自动调度处于打开状态)。 另请参阅API调度

包信息显示

以下信息预计来自包材料插件(如果可用,则从包元数据中获取)

1.软件包修订版(例如gcc-4.4.7-3.el6.x86_64) 2.打包时间 3.包创建者的名称(如果可用) 4.包装评论 5.引导URL - 通常是一个绝对URL,指明用GoCD或其他方式创建了哪个工作包。 6.包裹 - 材料名称(即存储库名称:包名称)

在构建软件包时,建议尽可能多地包含以上信息,以便它可用于显示如下。

下载包装

该软件包不会自动下载到代理上并提供给作业。 这与默认情况下进行检出的VCS/SCM材料不同。在软件包的情况下,GoCD代理通常不是用于部署的目标节点,它只是协调部署到远程节点,而不是自动下载。下列环境变量可用:

  1. GO_PACKAGE_< REPO-NAME >_< PACKAGE-NAME >_LABEL
  2. GO_REPO_< REPO-NAME >_< PACKAGE-NAME >_REPO_URL
  3. GO_PACKAGE_< REPO-NAME >_< PACKAGE-NAME >_LOCATION

在包含在环境变量名称中之前,系统信息库和软件包名称会转换为全部大写字母并将连字符转换为下划线。 例如,假设我们设置了一个名为ORA的存储库,它指向http://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64 并定义了一个包含gcc-4*规范的gcc包。并将其设置为管道材料。 要在代理上本地下载软件包,我们可以编写如下所示的任务:

[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 'http://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 'http://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不会为您创建或发布软件包。 但对于每种类型的包都足够简单。 e.g. rpm

您还可以在GitHub上浏览命令存储库以获取有用的命令。 什么是命令库? 请看this

程序包相关性

请注意,GoCD不支持任何类型的自动轮询或对程序包依赖关系的其他支持。 如果需要,每个软件包依赖项必须指定为单独的材料。 或者,只需在依赖关系图的根目录下轮询包,然后让包管理器在安装时找出其余部分。例如:如果componentA-1.2.0-b234-noarch.rpm依赖于componentB-2.3.0或更高版本,只需轮询componentA并让

yum install componentA-1.2.0-b234-noarch

为您解决componentB的问题。

results matching ""

    No results matching ""