Skip to content
On this page

了解.gitlab-ci.yml中常用关键字

在你的项目根目录创建一个.gitlab-ci.yml文件。它是一个YAML文件,您可以在其中指定GitLab CI/CD的指令。内容如下:

CI文件中,我们可以对一系列任务做定义,每个任务至少需要包含一条可执行的语句,在 script 定义 Runner 环境可执行的所有语句,每一个任务都会按照定义顺序执行。

yaml
# 定义 stages
stages:
  - build
  - test

# 定义build job
build-job:
  stage: build
  script:
    - echo "Hello, $GITLAB_USER_LOGIN!"

# 定义test job
test-job1:
  stage: test
  script:
    - echo "This job tests something"

stages 定义构建任务

stages关键字用于定义构建场景,可以被构建任务引用定义自己的构建场景,stages定义的顺序也决定了任务执行的顺序,下面给出一个基本的场景示例

yml
# 定义 stages
stages:
    - test
    - build
    - publish
  • 首先所有任务的构建场景为 test 的任务全部并行执行
  • 接着会执行构建场景为 build 的所有任务
  • 最后执行构建场景为 publish 的所有任务
  • 其中任何一个任务失败,整个流水线会失败,并且之后的任务不会执行

stages 可以不被定义,那么程序会默认为 test build deploy 三个场景,如果一个任务没有指定自己的 stage,那么它将默认使用 test

Jobs

Jobs 表示构建工作,表示某个 Stage 里面执行的工作。 我们可以在 Stages 里面定义多个 Jobs,这些 Jobs 会有以下特点:

  • 相同 Stage 中的 Jobs 会并行执行;
  • 相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功;
  • 如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败

所以,Jobs 和 Stage 的关系图就是:

bash
+------------------------------------------+
|                                          |
|  Stage 1                                 |
|                                          |
|  +---------+  +---------+  +---------+   |
|  |  Job 1  |  |  Job 2  |  |  Job 3  |   |
|  +---------+  +---------+  +---------+   |
|                                          |
+------------------------------------------+

script

用来定义一个任务中需要执行的shell脚本

yml
script:
	- npm install
    - npm run lint
    - npm run build

before_script

定义任何 Jobs 运行前都会执行的命令。

yml
before_script:
    - npm install
    - echo 'Install successful'

after_script

定义任何 Jobs 运行完后都会执行的命令。

yml
after_script:
    - xxxxxx # 通知所有用户完成构建

variables && Job.variables

定义环境变量。 如果定义了 Job 级别的环境变量的话,该 Job 会优先使用 Job 级别的环境变量。

yml
variables:
  BUILD_SUCCESS: '打包执行成功'
  SUCCESS: 'job执行完成'

# 定义build job
build-job:
  variables: 
    TEST: '测试'
  stage: build
  script:
    - echo "Hello, $GITLAB_USER_LOGIN!"
    - echo ${BUILD_SUCCESS}
    - echo ${SUCCESS}
    - echo ${TEST}

image

image 关键字允许当前CI程序基于某个Docker镜像中运行,当然前提是你的任务指定的tags必须是以Docker形式注册的Github RunnerCI程序会默认在你本地寻找镜像,如果不存在的话,则会从Docker Hub拉取。

yml
variables:
  BUILD_SUCCESS: '打包执行成功'
  SUCCESS: 'job执行完成'

# 定义build job
build-job:
  # 以下面这个镜像运行script
  image: node:2.8.1
  variables: 
    TEST: '测试'
  stage: build
  script:
    - echo "Hello, $GITLAB_USER_LOGIN!"
    - echo ${BUILD_SUCCESS}
    - echo ${SUCCESS}
    - echo ${TEST}

only && except

这两个关键字定义任务什么时候将会被创建

  1. only 定义了任务需要执行的所在分支或者标签;
  2. except 定义了任务不会执行的所在分支或者标签;
yml
variables:
  BUILD_SUCCESS: '打包执行成功'
  SUCCESS: 'job执行完成'

# 定义build job
build-job:
  # 以下面这个镜像运行script
  image: node:2.8.1
  variables: 
    TEST: '测试'
  stage: build
  script:
    - echo "Hello, $GITLAB_USER_LOGIN!"
    - echo ${BUILD_SUCCESS}
    - echo ${SUCCESS}
    - echo ${TEST}
   only:
   # 可以指定多个再mester、dev、或者打tag 都会运行该CI工作流    
    - master 
    - dev
    - tags

    # only: 或者可以这么写判断 校验尼的tag符合正则的才会触发
    # variables:
    #   - $CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+(-rc(\..+)?)?$/
   except:
    - feature/**

两者如果都存在在一个任务声明中,则所需引用将会使用两者交集过滤。 两者均允许使用正则。

tags

指定当前任务适用的 runners, 必须是已经注册过的runner才能指定

yml
variables:
  BUILD_SUCCESS: '打包执行成功'
  SUCCESS: 'job执行完成'

# 定义build job
build-job:
  # 以下面这个镜像运行script
  image: node:2.8.1
  variables: 
    TEST: '测试'
  stage: build
  script:
    - echo "Hello, $GITLAB_USER_LOGIN!"
    - echo ${BUILD_SUCCESS}
    - echo ${SUCCESS}
    - echo ${TEST}
   only:
   # 可以指定多个再mester、dev、或者打tag 都会运行该CI工作流    
    - master 
    - dev
    - tags

   except:
    - feature/**

   tags:
    - ci-runnner

artifacts

定义 Job 中生成的附件。 当该 Job 运行成功后,生成的文件可以作为附件 (如生成的二进制文件) 保留下来,打包发送到 GitLab,之后我们可以在 GitLab 的项目页面下下载该附件。

yml
variables:
  BUILD_SUCCESS: '打包执行成功'
  SUCCESS: 'job执行完成'
  FILE_NAME: 'dist.zip'

# 定义build job
build-job:
  # 以下面这个镜像运行script
  image: node:2.8.1
  variables: 
    TEST: '测试'
  stage: build
  script:
    - npm run build
    - cd dist/ && zip -r dist.zip ./* && mv dist.zip ../ && cd -
    - echo "Hello, $GITLAB_USER_LOGIN!"
    - echo ${BUILD_SUCCESS}
    - echo ${SUCCESS}
    - echo ${TEST}
   only:
   # 可以指定多个再mester、dev、或者打tag 都会运行该CI工作流    
    - master 
    - dev
    - tags
   except:
    - feature/**

   artifacts:
    paths:
      - ${FILE_NAME}
   tags:
    - ci-runnner

cache && Job.cache

定义需要缓存的文件。 每个 Job 开始的时候,Runner 都会删掉 .gitignore 里面的文件。 如果有些文件 (如 node_modules/) 需要多个 Jobs 共用的话,我们只能让每个 Job 都先执行一遍 npm install。 这样很不方便,因此我们需要对这些文件进行缓存。缓存了的文件除了可以跨 Jobs 使用外,还可以跨 Pipeline 使用。

yml
stages:
  - build

cache:
  paths:
    - node_modules/

job1:
  stage: build
  script:
    - npm install
    - npm run build

job2:
  stage: build
  script:
    - npm install
    - npm run test

allow_failure

allow_failure 关键字用于标记一个Job(作业)是否允许失败。当设置为true时,如果该Job失败了,整个流水线(pipeline)的状态仍将被标记为成功(success),而不会影响后续的Jobs

yml
stages:
  - test

job1:
  stage: test
  script:
    - run_tests.sh

job2:
  stage: test
  script:
    - run_integration_tests.sh
  allow_failure: true

dependencies

dependencies 关键字用于定义作业(Job)之间的依赖关系。它指定了某个作业必须在哪些其他作业完成后才能执行。

yml
variables:
  FILE_NAME: dist.zip

stages:
  - build
  - deploy

build:
  stage: build
  only:
    - tags
  script:
    - yarn && yarn build
    - cd dist/ && zip -r dist.zip ./* && mv dist.zip ../ && cd -
    - ls
  artifacts:
     # expire_in 产物保留多少天
    expire_in: 30 days
    paths:
      - ${FILE_NAME}
  tags:
    - runner

deploy:
  stage: deploy
  script: 
    # - 部署相关命令
    - echo "project done"
  only:
    - tags

  # dependencies build 留下来的dist产物
  dependencies:
    - build
  tags:
    - runner

以上就是经常使用的一些关键字了,如果不能满足使用可以去官网去查看: 地址

Released under the MIT License.