编写流程定义 daocloud.yml 文件

我们推荐用户使用 DaoCloud Services 界面进行项目的流程定义,比较简单易用。

你也可以选择使用在代码中添加 daocloud.yml 文件来描述流程定义,以下为 daocloud.yml 文件的结构说明。

version: 3.0

image: golang:1.7.4
env:
  - LANGUAGE=go

stages:
  - test
  - build
  - deploy

test_api:
  stage: test
  image: ubuntu:16.04
  env:
    - password=admin
  services:
    - redis
    - mysql
  script:
    - echo hello
  pull_request: false
  only:
    branches:
      - master
    tags: 
      - v1*
  except:
    tags: 
      - v1.0

test_api2:
  stage: test
  env:
    - password=admin
  script:
    - env
  pull_request: false
  only:
    branches:
      - master
    tags: 
      - v1*
  except:
    tags: 
      - v1.0

docker_image:
  stage: build
  job_type: image_build
  dockerfile_path: /Dockerfile
  build_dir: /
  build_args:
    - http_proxy=http://10.0.0.1
  only:
    branches:
      - master
    tags:
      - v1

deploy_to_k8s:
  label: prod-env
  image: alpine
  stage: deploy
  script:
    - curl http://xxxxx.com:80/deploy

dev-deploy:
  label: dev-env
  job_type: DCS_deploy
  stage: deploy
  app_name: xxxxxxx
  cluster_id: tttttttttttt
  only:
    branches:
      - master
    tags:
      - v1
keywords
字段 必填 描述
version 版本号
image 全局镜像
env 全局环境变量
stages 定义任务的执行阶段

version

daocloud.yml 的版本号,最新为 3.0 。

image

自定义的 Docker 镜像,是默认的任务环境,任务域内的 Docker 镜像优先于默认任务环境。

env

全局环境变量,会注入到每个测试、默认任务中,任务域内的环境变量优先于全局环境变量。

stages

stages 用于定义任务的执行阶段。

  1. 同一个执行阶段下的任务会被并行执行,
  2. 不同阶段的任务需要上一个阶段的所有任务执行成功后执行。

例如:

stages:
  - test
  - build
  - deploy
 
  1. 首先会并行执行所有 test 阶段的任务。
  2. 如果所有 test 阶段的任务执行成功,则接着并行执行所有 build 阶段的任务。
  3. 如果所有 build 阶段的任务执行成功,则接着并行执行所有 deploy 阶段的任务。
  4. 如果某个阶段的任务执行失败,其后执行阶段的所有任务将会被略过。

此段不填,则默认按 testbuilddeploy 三执行阶段顺序执行。

任务

每个任务都是独立不重名的执行单元,拥有独立的执行环境,每个任务的行为都由一系列参数来指定。任务具有不同的 job_type 类型,目前我们提供 defaulttestimage_buildlite_image_buildDCS_deployDCE_deployDCS_test_deploy七种类型的任务。

1. 默认任务

job_type: default

默认任务只需指定基础镜像和几行 shell 命令即可执行。

未指定任务类型时,使用默认的任务类别。代码的根目录为当前任务的工作目录。

job_name:
  label: staging
  job_type: default
  stage: test
  image: go:1.8.0
  env:
    - password=admin
  script:
    - go get ./...
    - go test -v ./...
  pull_request: false
  only:
    branches:
      - master
    tags:
      - v1*
  except:
    tag:
      - v1.0
  allow_failure: true
 
字段 必填 描述
job_type 任务类型,默认为 default
stage 执行阶段名称
image 任务执行环境
env 任务的环境变量
script 任务执行脚本
pull_request 在代码源发起 pull request 时是否执行该任务
only 仅当某些分支或者代码标签下执行
except 不在某些分支或者代码标签下执行
allow_failure 是否允许失败
label 标识

stage

指定执行阶段名称。相同 stage 的任务为一组并行执行。如不填写,默认为 default

job image 和 job env

image 任务运行时的 docker 镜像,优先级高于全局镜像,不填时则使用全局镜像。 env 任务运行时的环境变量,优先级高于全局环境变量,执行任务时会自动注入全局环境变量。

script

script 指定任务执行的脚本,该脚本会被放在任务环境中的代码根目录下使用 bash 运行。

pull_request、only 和 except

  1. pull_request:在代码源发起 pull request 时是否执行该任务。默认不执行。
  2. only 和 except 都有参数 branchestagsonly 指定仅当某些分支或者代码标签下执行,except 指定不在某些分支或者代码标签下执行。值可以是一个正则表达式。
  3. except 的优先级高于 only
  4. 如果不填写 only 和 except 则在所有分支和代码标签下,都会执行该任务。

allow_failure

allow_failure 允许任务失败,这样当任务失败时,该任务的执行阶段会被标记为 Warning,并且不影响下个执行阶段的执行。默认不允许失败。

label

label 任务的标识,可以成组显示,一般用于表示特定的运行或者发布环境。

2. 测试任务

job_type: test

测试任务主要用于执行一些单元测试或者集成测试,可以配置数据库服务。

job_name:
  label: staging
  job_type: test
  stage: test
  image: go:1.8.0
  env:
    - password=admin
  services:
    - redis
    - mysql
  script:
    - go get ./...
    - go test -v ./...
  pull_request: false
  only:
    branches:
      - master
    tags:
      - v1*
  except:
    tag:
      - v1.0
  allow_failure: true
字段 必填 描述
job_type 任务类型 test
stage 执行阶段名称
image 任务执行环境
env 任务的环境变量
services 任务使用的服务列表
install 安装脚本
before_script 测试之前的脚本
script 任务执行脚本
pull_request 在代码源发起 pull request 时是否执行该任务
only 仅当某些分支或者代码标签下执行
except 不在某些分支或者代码标签下执行
allow_failure 是否允许失败
label 标识

services

任务可以使用一系列由我们提供的服务,如 redis,mysql,postgre 等。

install

安装脚本,用于安装一些必要软件

before_script

测试之前的脚本,预备动作。

3. 标准构建

job_typeimage_build

标准构建流程,是 Docker 原生构建方式,包含一个操作:从 Dockerfile 构建镜像。

job_name:
  stage: build
  job_type: image_build
  dockerfile_path: /Dockerfile
  build_dir: app/
  build_args:
    - http_proxy=http://10.0.0.1
  only:
    branches:
      - master
    tags:
      - v1
  dependencies:
    - test_api
字段 必填 描述
stage 执行阶段名称
job_type image_build
args 任务的构建变量列表
dockerfile_path Dockerfile 路径
build_dir 构建路径
cache 是否启用镜像缓存
only 仅当某些分支或者代码标签下执行
except 不在某些分支或者代码标签下执行
allow_failure 是否允许失败
label 标签

build_args

任务的构建变量列表,该变量列表会被注入到镜像内,注意在此谨慎使用敏感信息

cache

开启缓存会把最近的一次构建过程缓存起来,从而获得更快的构建体验。如果需要使用一个干净的构建环境可以关闭缓存。

dockerfilepath 和 builddir

dockerfile_path 为 Dockerfile 路径, build_dir 为 构建路径。 注意:build_dir 必须为 dockerfile_path 的父目录。

4. 安全构建

job_type: lite_image_build

安全镜像构建流程包含三个步骤:代码编译、文件提取、打包镜像。通过分离编译和打包,产生一个安全、精巧、不含源代码的生产级别镜像。

docker_image:
  stage: build
  label: prod
  job_type: lite_image_build
  compile:
      dockerfile_path: Dockerfile.compile
      build_dir: /
      cache: true
      build_args:
           - https_proxy=http://10.0.0.1
  extract:
      - /usr/bin/application
  package:
      dockerfile_path: Dockerfile.package
      build_dir: /
      cache: true
      build_args:
           - http_proxy=http://10.0.0.1
  only:
    branches:  
      - master
    tags: 
      - v1
字段 必填 描述
stage 执行阶段名称
job_type lite_image_build
compile 任务编译环节
extract 任务提取环节
package 打包镜像环节
only 仅当某些分支或者代码标签下执行
except 不在某些分支或者代码标签下执行
allow_failure 是否允许失败
label 标识

compile

任务编译环节,通过指定镜像构建过程,从源代码构建出可执行文件。 包含以下字段:

字段 必填 描述
args 任务的构建变量列表
dockerfile_path Dockerfile 路径
build_dir 构建路径
cache 是否启用镜像缓存

extract

从“编译”步骤中生成的 Docker 镜像中,提取某些文件,一般是可执行文件。

package

将“文件提取”步骤中获得的文件打包至新的镜像,生成安全,精巧的生产级别镜像。 字段与 compile 相同。

5. 发布到自有主机、发布到 DCE、发布到测试环境

DCS_deploy:发布到自有主机,将上个任务构建出的镜像发布到您的自有主机上,自动升级您的应用。 

DCE_deploy:发布到 DCE,将上个任务构建出的镜像发布到您的 DCE 集群上,自动升级您的服务。

DCS_test_deploy:发布到测试环境,将上个任务构建出的镜像发布到云端测试环境,即刻开始您的应用测试。

dev-deploy:
  job_type: DCS_deploy  
  stage: deploy
  app_name: 2048
  cluster_id: tttttttttttt
  only:
    branches:  
      - master
    tags: 
      - v1
字段 必填 描述
job_type 必填,如 DCS_deployDCE_deployDCS_test_deploy
stage 执行阶段名称
app_name 部署任务的应用名称
cluster_id 应用的集群 ID
only 仅当某些分支或者代码标签下执行
except 不在某些分支或者代码标签下执行
allow_failure 是否允许失败
label 标识

app_name

app_name 部署任务的应用名称,在 DCE 环境中则为服务名。

cluster_id

cluster_id 为应用的集群 ID,当使用 DCE 环境时,此项为必填。