gitlab ci/cd从零单排(下)

213 阅读4分钟

接上篇的gitlab ci/cd从零单排,上篇我们介绍了安装和gitlab ci/cd相关的概念

Jobs

.gitlab-ci.yml允许指定无限量jobs。每个jobs必须有一个唯一的名字,而且不能是上面提到的关键字。job由一列参数来定义jobs的行为。

job_name: 
    script: 
        - ls 
        - cd 
    stage: test
KeywordRequiredDescription
scriptyesRunner执行的命令或脚本
imageno所使用的docker镜像,查阅使用docker镜像
servicesno所使用的docker服务,查阅使用docker镜像
stageno定义job stage(默认:test)
typenostage的别名(已弃用)
variablesno定义job级别的变量
onlyno定义一列git分支,并为其创建job
exceptno定义一列git分支,不创建job
tagsno定义一列tags,用来指定选择哪个Runner(同时Runner也要设置tags)
allow_failureno允许job失败。失败的job不影响commit状态
whenno定义何时开始job。可以是on_success,on_failure,always或者manual
dependenciesno定义job依赖关系,这样他们就可以互相传递artifacts
cacheno定义应在后续运行之间缓存的文件列表
before_scriptno重写一组在作业前执行的命令
after_scriptno重写一组在作业后执行的命令
environmentno定义此作业完成部署的环境名称
coverageno定义给定作业的代码覆盖率设置

script

script是Runner执行的yaml脚本。举个例子:

job:
  script: "ls"

该参数也可以用数组包含多个命令:

job:
  script:
    - uname -a
    - bundle exec rspec

有时候,script命令需要被单引号或者是双引号包裹起来。举个例子,当命令中包含冒号(:)时,script需要被包在双引号中,这样YAML解析器才可以正确解析为一个字符串而不是一个键值对(key:value)。使用这些特殊字符的时候一定要注意::,{,},[,],,,&,*,#,?,|,-,<,>,=,!

stage

stage允许一组jobs进入不同的stages。jobs在相同的stage时会parallel同时并发进行。

tags

tags可以从允许运行此项目的所有Runners中选择特定的Runners来执行jobs。

在注册Runner的过程中,我们可以设置Runner的标签,比如buildtest

tags可通过tags来指定Runner来运行jobs:

job:
  tags:
    - build
    - test

上面这个示例中,需要确保构建此job的Runner必须定义了buildtest这两个tags。

variables

GItLab CI 允许在.gitlab-ci.yml文件中添加变量,并在job环境中起作用。因为这些配置是存储在git仓库中,所以最好是存储项目的非敏感配置,例如:

variables:
  DATABASE:" "

这些变量可以被后续的命令和脚本使用。服务容器也可以使用YAML中定义的变量,因此我们可以很好的调控服务容器。变量也可以定义成任务级别。

Job variables

在job中是可以使用关键字variables来定义job变量。它的运行原理跟全局级别定义的变量是一样的,但是它允许设置特殊的job变量。

当设置了job级别的关键字variables,它会覆盖全局YAML和预定义中的job变量。想要关闭全局变量可以在job中设置一个空数组:

job_name:
  variables: []

retry

job:
  script: 
      - ech “hello world”
  retry:
      max: 1
      when: (具体的取值可以查文档)
          - script_failure

timeout

1、作业的超时可以大于项目的超时设置,但是不能大于runner的超时设置 2、runner的超时小于项目的超时设置时runner优先于项目 3、runner没设置时候以项目的超时为准 4、runner设置大于项目的超时设置时以项目为准

job:
  script: 
      - echo “hello world”
  timeout:
      3 hours 10 minutes
---
job:
  script: 
      - echo “hello world”
  timeout:
      3 h 10 m

parallel

parallel的取值大于2小于50

job:
  script: 
      - echo “hello world”
  parallel: 5

only and except

only和except是两个参数用分支策略来限制jobs构建:

  1. only定义哪些分支和标签的git项目将会被job执行。
  2. except定义哪些分支和标签的git项目将不会被job执行。

下面是refs策略的使用规则:

  • onlyexcept可同时使用。如果onlyexcept在一个job配置中同时存在,则以only为准,跳过except(从下面示例中得出)。
  • onlyexcept可以使用正则表达式。
  • onlyexcept允许使用特殊的关键字:branchestagstriggers
  • onlyexcept允许使用指定仓库地址但不是forks的仓库(查看示例3)。

在下面这个例子中,job将只会运行以issue-开始的refs(分支),然而except中设置将被跳过。

job:
  # use regexp
  only:
    - /^issue-.*$/
  # use special keyword
  except:
    - branches

在下面这个例子中,job将只会执行有tags的refs,或者通过API触发器明确地请求构建。

job:
  # use special keywords
  only:
    - tags
    - triggers

仓库路径只能用于父级仓库执行jobs,而不是forks:

job:
  only:
    - branches@gitlab-org/gitlab-ce
  except:
    - master@gitlab-org/gitlab-ce

上面这个例子将会为所有的分支执行job,但master分支除外。

rules

rules允许按顺序评估单个规则,直到匹配并为作业动态提供属性 rules不能和only、except组合使用 可用的规则:

  • if(如果条件匹配)
  • changes(指定的文件发生变化)
  • exists(指定的文件存在)
variables:
    DOMAIN: test.com
job:
  script: 
      - echo “hello world”
  rules: 
      - if: '$DOMAIN=="test.com"'
        when: manual
      _ when: on_success

workflow

  • 全局的workflow关键字适用于整个管道,并确定是否创建管道
  • when可以设置为always或never,如果未提供则默认是always
variables:
    DOMAIN: test.com
workflow:
  rules: 
      - if: '$DOMAIN=="test.com"'
      _ when: always