构建

Zadig 构建是基于容器运行时环境提供的高效云原生构建引擎,内置了常见的构建环境及软件包、缓存机制,支持多个服务共享构建脚本、共享全局构建模板及 Jenkins 构建的调用,还可以通过自定义构建镜像安装软件包 满足更为丰富的构建场景。

Zadig 构建过程包含通用配置、构建环境、代码信息、构建变量、通用构建脚本、高级配置以及自定义更多步骤配置等。

创建构建

Zadig 构建

  • 支持为一个服务配置多个构建,在工作流的构建部署配置中按需选择。
  • 支持多个服务使用一份构建配置,更多细节请阅读共享构建
  • 支持修改构建交付物的生成规则,更多细节请阅读构建交付物生成规则

准备工作

明确构建所需要的依赖,依赖项包括但不限于:

  • 服务编译的代码依赖(比如依赖 Base 库,开源库等)
  • 服务编译的环境依赖(比如 Go 版本、Node 版本、编译工具等)
  • 服务编译的系统依赖(比如操作系统等)

基本配置

构建通用配置

参数说明:

  • 构建名称:构建的名称,有意义便于理解即可。
  • 服务选择:选择使用该构建配置的服务。

构建环境

配置构建过程运行时的环境。

创建构建

参数说明:

  • 操作系统:平台默认提供 Ubuntu 16.04/Ubuntu 18.04/Ubuntu 20.04 作为基础构建系统。

扩展知识

  1. 支持自定义添加构建环境作为构建系统,详情请参阅构建镜像管理

  2. 默认提供的 Ubuntu 系列构建系统中已安装了以下工具/命令,可以在软件包管理和构建脚本中直接使用。

    • build-essential
    • cmake
    • curl
    • docker
    • git
    • libfontconfig
    • libfreetype6-dev
    • libpcre3-dev
    • librrd-dev
    • libsasl2-dev
    • netcat-openbsd
    • pkg-config
    • python
    • tar
    • wget
  • 依赖的软件包:构建过程中需要用到的各类软件包工具,比如不同版本的 Java、Go、Govendor、Node、Bower、Yarn、Phantomjs 等等。

扩展知识

  • 选择软件包的过程中需要注意多个软件包之间的依赖关系,按照顺序进行安装。例如:Govendor 依赖 Go,那么必须先选 Go,再选择 Govendor。

  • 平台已内置一些常见的软件包,如果有其他软件包或者版本需求,系统管理员可以在软件包管理中配置其安装脚本。

代码信息

创建构建

参数说明:

  • 代码源:代码库所在的平台,目前支持 GitHub、GitLab、Gerrit、Gitee
  • 代码库拥有者:支持开源库,以及所配置的代码源下的代码库拥有者
  • 代码库名称:代码库的名称。对于 Gerrit 代码源,支持模糊匹配,如上图例中所示
  • 默认分支:执行工作流对服务进行构建时,默认选取的分支
  • Remote name:指定远程代码仓库的名称,默认 origin
  • 克隆目录名:定义代码库被克隆后的目录名称,默认为代码库的名称
  • 子模块:同步 submodule 中配置的代码库

提示

  • 指定克隆目录名为 A,则代码库的内容将会被克隆到 $WORKSPACE/A
  • $WORKSPACE 是 Zadig 系统构建模块内置的变量,关于其更详细的描述可阅:系统内置环境变量

构建变量

包括系统内置构建变量和用户自定义构建变量,可在构建脚本中直接使用。

提示:在 通用构建脚本 中添加 env 命令可查看所有构建变量。

创建构建

内置构建变量

内置变量及其描述说明如下:

变量名称描述
WORKSPACE当前工作流工作目录
TASKID当前工作流任务的 ID,即任务序号
IMAGE系统按照内置规则生成的镜像名称,用于容器服务的部署更新,可参考构建交付物生成规则修改其命名规则
PKG_FILE系统按照内置规则生成的交付物文件名称,可修改其命名规则,可参考构建交付物生成规则修改其命名规则
SERVICE编译的服务名称
DIST_DIR构建出的 Tar 包的目的目录
ENV_NAME环境名称
BUILD_URL构建任务的 URL
CI值恒等于 true,可视需要使用,比如用于判断是 CI 脚本,还是其他脚本
ZADIG值恒等于 true,可视需要使用,比如用于判断是否在 Zadig 系统中执行
REPONAME<index>获取指定 <index> 的代码库名称,其中 <index> 为构建配置中代码的位置,初始值为 0。即:下图例中,在构建脚本中使用 $REPO0 即可获得第一个代码库的名称 voting-app
REPO<index>获取指定 <index> 的代码库名称,并自动将名称中的中划线 - 替换为下划线 ,其中 <index> 为构建配置中代码的位置,初始值为 0。即:下图例中,在构建脚本中使用 $REPO_0 即可获得第一个代码库转化后的名称 voting_app
<REPO>_PR获取构建过程中指定代码仓库使用的 Pull Request 信息,当 <REPO> 信息中含有中划线 - 时,需要将 - 替换为下划线 ,下图例中希望获取 voting-app 库的 Pull Request 信息,使用 $votingapp_PR 或者 eval PR=\${${REPO_0}_PR} 即可
<REPO>_BRANCH获取构建过程中指定代码仓库使用的分支信息,当 <REPO> 信息中含有中划线 - 时,需要将 - 替换为下划线 ,下图例中希望获取 voting-app 库的分支信息,使用 $votingapp_BRANCH 或者 eval BRANCH=\${${REPO_0}_BRANCH}即可
<REPO>_TAG获取构建过程中指定代码仓库使用的 Tag 信息,当 <REPO> 信息中含有中划线 - 时,需要将 - 替换为下划线 ,下图例中希望获取 voting-app 库的 Tag 信息,使用 $votingapp_TAG 或者 eval TAG=\${${REPO_0}_TAG} 即可
<REPO>_COMMIT_ID获取构建过程中指定代码仓库使用的 Commit ID 信息,当 <REPO> 信息中含有中划线 - 时,需要将 - 替换为下划线 ,下图例中希望获取 voting-app 库的 Commit ID 信息,使用 $voting_app_COMMIT_ID 或者 eval COMMIT_ID=\${${REPO_0}_COMMIT_ID} 即可

创建构建

自定义构建变量

说明:

  • 支持使用字符串类型或者枚举类型的构建变量。
  • 可以设置字符串类型的变量为敏感信息。设置为敏感信息后,工作流任务的构建日志中将不会再输出其明文信息。
  • 执行工作流任务时,也可以对自定义构建变量的值进行修改,覆盖此处配置的默认值,如下图所示:

运行工作流时修改构建变量

通用构建脚本

在通用构建脚本中声明代码的构建过程和实现。

可在通用构建脚本中使用构建变量

创建构建

高级配置

高级配置

说明:

  • 策略配置:配置构建服务的超时时间,若超过设置的时间阈值后构建仍未成功,则视为超时失败。
  • 缓存配置:开启缓存后,在工作流执行时会使用此处配置的缓存目录,目录配置可使用构建变量
  • 资源配置:选择构建任务运行时所使用的集群资源,其中本地集群指 Zadig 系统所在的集群,关于集群的集成可参考集群管理
  • 操作系统规格:配置资源规格用于执行构建任务。平台提供 高/中/低/最低 四种配置供选择,可以根据实际需要自定义。

更多构建步骤

添加步骤中可按需添加更多的构建步骤。

高级配置

镜像构建

按照配置的参数构建镜像,使用内置变量 IMAGE 作为构建出的镜像产物名称,并自动将镜像推动到镜像仓库中。

参数说明:

  • 构建上下文目录: 执行 docker build 所在的目录。
  • Dockerfile 来源: 包括代码库模板库,模板库功能可参考 Dockerfile 模板管理
  • Dockerfile 文件的绝对路径: Dockerfile 来源于代码库时,指定执行 docker build 用到的 Dockerfile 路径。
  • 模板选择: Dockerfile 来源于模板库时,选择具体的 Dockerfile 模板。
  • 构建参数: 支持 docker build 的所有参数,比如:--build-arg key1=value1 --build-arg key2=value2

上述参数中,除了 Dockerfile 来源模板选择,其他的均可使用变量,但不支持两个变量套用的形式,比如 ${$REPO_0}_BRANCH

二进制包存储

配置构建出的二进制包产物的存储路径。

文件存储

上传指定文件到对象存储中。

  • 上传后,文件将存储于对象存储对应 Bucket 的指定目录中,此处的目录可使用变量,但不支持两个变量套用的形式,比如 ${$REPO_0}_BRANCH
  • 可指定文件的具体路径,如上图中的infra/result.xml,将会上传该指定文件。
  • 也可指定到目录级别,如上图中的infra/examples/,将会上传 infra/examples/ 目录下的所有文件(不包括子目录)到对象存储中。

Shell 脚本执行

新增 Shell 脚本执行步骤,按需自定义 Shell 脚本。

Zadig 共享构建

同一个项目下的多个服务共享使用一份构建配置。

如何配置共享构建

multi-service-demo构建 - 图11 (opens new window) 为例,该项目包括 3 个 Golang 服务 service1/service2/service3,和构建相关的目录结构说明如下:

  1. ├── Dockerfile # 定义 3 个服务的 Dockerfile
  2. ├── Makefile # 定义 3 个服务的编译
  3. ├── src # 3 个服务的源代码
  4. ├── service1
  5. ├── service2
  6. └── service3

创建 Zadig 构建,服务选择中选择多个服务,按需配置构建环境、代码信息、通用构建脚本等,利用系统提供变量实现构建的共享,本示例中的构建脚本如下:

  1. cd zadig/examples/multi-service-demo
  2. make build-$SERVICE
  3. docker build -t $IMAGE -f Dockerfile --build-arg service=$SERVICE .
  4. docker push $IMAGE

共享构建

如何使用共享构建

  • 创建构建配置时指定多个服务,或者创建构建完毕后修改构建,在服务选择中选择多个服务。

使用共享构建 使用共享构建

  • 也可以在为服务配置构建时,按需选择复用已有的构建配置实现构建共享。

创建服务时复用已有构建

Zadig 构建模板

当大量服务的构建配置同构时(比如相同技术栈的多个服务代码分别在单独的代码库中维护,构建所依赖的软件包相同、构建脚本同构,只有代码信息有区别),可使用 Zadig 构建模板来提升配置构建的效率。具体操作如下:

  1. 创建构建模板,在模板中完成代码库信息之外的所有配置,可参考新建构建模板
  2. 创建 Zadig 构建,选择使用模板 -> 填写构建名称并选择构建模板 -> 选择服务并按需配置代码信息后保存即可。

构建模板

Jenkins 构建

直接使用 Jenkins Job 执行后的镜像产物,用于部署更新 Zadig 中的服务。

关于Zadig 构建Jenkins 构建 二者的区别如下:

  • Zadig 构建:在 Zadig 平台中定义服务的完整构建过程。
  • Jenkins 构建:关于服务具体的构建过程在 Jenkins 中定义执行,Zadig 中提供入口触发具体的 Jenkins Job,并基于 Jenkins Job 的镜像产物对部署在 Zadig 中的服务进行更新。

前提

  1. 需要先在 Zadig 系统中集成 Jenkins 服务器,详见 Jenkins 集成
  2. 需要先在 Zadig 系统中集成镜像仓库,详见镜像仓库管理
  3. 要使用的 Jenkins Job 中需要配置 Build Parameters,包含 IMAGE 变量,作为构建出的镜像产物, 并将 IMAGE 推送至集成的镜像仓库中,示例如下:

jenkins build jenkins build

如何使用

jenkins build

新建构建,构建来源选择 Jenkins 构建,填写相关参数保存即可。参数说明如下:

  • 服务选择:要构建的服务。
  • jenkins job:从集成的 Jenkins Server 中按需选择 Jenkins Job。
  • 构建超时:超过设定的时间后,工作流执行构建仍未结束则视为构建超时。
  • 构建参数:会自动解析出对应 Jenkins Job 中的参数项,可在 Zadig 平台中做修改。说明如下:
    • IMAGE 参数:即为前提中的 IMAGE 变量,运行工作流时会传递给对应的 Jenkins Job 作为构建镜像产物名称。支持使用系统内置变量来为其赋值,参考策略配置
    • 枚举类型的参数:可修改枚举类型参数的可选值。注意:可选值需要在 Jenkins Job 中支持。以下图中的 Jenkins Job 参数配置为例,则此处可在 Zadig 中修改枚举参数 ParallelNum 的可选值为 1,2,3,4。

jenkins build