流水线文件

前提条件,注册一个 gitlab runner,并且该 runner 内部可以访问 giltab 服务进行下载代码。gitlab-runner 的 config.toml 参考如下:

concurrent = 1
check_interval = 0
shutdown_timeout = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "runner"
  url = "http://192.168.1.107:8000/"
  token = "glrt-6ByqoP5bmYyz4FyYwozc"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    MaxUploadedArchiveSize = 0
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "docker:stable"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/etc/docker/daemon.json://etc/docker/daemon.json:ro","/var/run/docker.sock://var/run/docker.sock","/.m2", "/cache"]
    shm_size = 0
    network_mtu = 0
    extra_hosts = ["gitlab.example.com:192.168.1.107"]
    network_mode = "host"

在gitlab仓库中项目根目录添加一个 .gitlab-ci.yml 文件,文件内容如下:

stages:
  - build
  - deploy

build:
  stage: build
  script:
    - echo "start build"

deploy:
  stage: deploy
  script:
    - echo "start deploy"

这个流水线共包含两个job,分别是build 和 deploy。

  • build 包含一个stage build,运行构建命令。
  • deploy 包含一个stage deploy,运行部署命令。

提交文件后,会自动触发cicd流程,查看流水线信息,已成功完成操作。

默认情况下使用项目根目录下的 .gitlab-ci.yml 文件,当然我们也可以本仓库其他路径下的文件或者远程仓库文件路径。

Pipeline 基础语法

default 全局配置

在GitLab CI/CD的流水线中存在几个全局关键词,设置后,这些配置对于整条流水线生效,如stages,include,workflow,default,variables。

在default中你可以将一些关键词配置成全局配置。配置后这些配置项将对每个作业生效,作为初始值,开发者也可以在作业中重新定义覆盖他们。

default:
  image: #定义所有 jobs 的默认 Docker 镜像。
  services: #定义所有 jobs 的默认服务。
  before_script: #定义在所有 jobs 之前运行的脚本。
  after_script: #定义在所有 jobs 之后运行的脚本。
  tags: #定义所有 jobs 的默认标签。
  cache: #定义所有 jobs 的默认缓存策略。
  artifacts: #定义所有 jobs 的默认构件策略。
  retry: #定义所有 jobs 的默认重试策略。
  timeout: #定义所有 jobs 的默认超时时间。
  interruptible: #定义所有 jobs 是否可以被中断。

job

在 .gitlab-ci.yml 的YAML文件中可以定义多个作业,每个作业运行不同的命令,命令可以是shell或脚本。

job1:
  script: "execute-script-for-job1"

job2:
  script: "execute-script-for-job2"

说明:

  • 可以定义一个或多个作业。
  • 每个作业必须具有唯一的名称,作业名称不能使用关键字。
  • 每个作业是独立执行的。
  • 每个作业至少要包含一个script。

script

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

注意:

  • 有时, script命令将需要用单引号或双引号引起来.。例如,包含冒号命令( : )需要加引号,以便被包裹的YAML解析器知道来解释整个事情作为一个字符串,而不是一个”键:值”对.。
  • 使用特殊字符时要小心: :{}[],&*#?|-<>= !%@

before_script

前置脚本,用于定义一个命令,该命令在每个作业之前运行。必须是一个数组。指定的script与主脚本中指定的任何脚本串联在一起,并在单个shell中一起执行。

after_script

后置脚本,用于定义将在每个作业(包括失败的作业)之后运行的命令。这必须是一个数组。指定的脚本在新的shell中执行,与任何before_script 或 script 脚本分开。 after_script 可以在全局定义,也可以在 job 中定义。在job中定义会覆盖全局。

default:
  before_script:
    - echo "before-script!!"
  after_script:
    - echo "after-script"

variables:
  DOMAIN: example.com

stages:
  - build
  - deploy

build:
  before_script:
    - echo "before-script in job"
  stage: build
  script:
    - echo "mvn clean "
    - echo "mvn install"
  after_script:
    - echo "after script in job"

deploy:
  stage: deploy
  script:
    - echo "hello deploy"

说明:

  • after_script 失败不会影响作业失败。
  • before_scrip t失败导致整个作业失败,其他作业将不再执行。
  • 作业失败不会影响 after_script 运行。

stages

用于定义作业可以使用的阶段,并且是全局定义的。同一阶段的作业并行运行,不同阶段按顺序执行。

stages:
  - build
  - test
  - deploy

这里定义了三个阶段,首先 build 阶段并行运行,然后 test 阶段并行运行,最后deploy阶段并行运行。deploy阶段运行成功后将提交状态标记为 passed 状态。如果任何一个阶段运行失败,最后提交状态为 failed。