gitlab--workflow、rules

简介: gitlab--workflow、rules

workflow


workflow 关键字适用于整个管道,并将确定是否创建管道。when :可以设置为alwaysnever . 如果未提供,则默认值always

  • if:定义变量条件
  • when:只有两个值,always 和 nevel
if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
合并请求时运行流水线
if: '$CI_PIPELINE_SOURCE == "psuh"'
提交代码运行流水线
workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "push"' # 当为 push 的时候才会触发,其他情况下不会触发该流水线
      when: never # 上面的条件为 true 时,永远不执行
    - when: always # 上面的条件为 false 时,永远执行
stages: # 指定运行的步骤,没有指定就顺序执行
  - build
  - deploy
  - test
  - rebase
build1: # job 的名称
  tags: 
    - k8s # 指定运行的 runner 标签
  stage: build # stage 的名称
  script:
    - echo "Do your build here"
test1:  
  stage: test
  script:
    - echo "Do a test here"
    - echo "For example run a test suite" 
rebase:
  stage: rebase
  script:
    - echo "Do another parallel test here"
    - echo "For example run a lint test"
deploy1:
  tags: 
    - k8s
  stage: deploy
  script:
    - echo "Do your deploy here"

当上面执行 push 操作时,才会运行流水线,否则不会运行流水线


rules


rules 可以按照设置的规则来判断是否执行流水线,也可以设置以什么样的方式执行(when)

rules 有三个关键字

  • if:判断条件,如果条件满足时执行该 job,不满足时不执行 job
  • changes:某个或多个文件改变时执行该 job,没有改变时不执行 job
  • exists:文件存在时执行该 job,不存在时不执行 job
if

if 可以使用多条件,&& 所有条件满足时才会执行该 job,|| 某个条件满足时就会执行该 job

stages: # 指定运行的顺序
  - test
  - deploy
variables:
  name: zouzou
deploy:
  tags:
    - k8s
  stage: deploy
  retry:
  parallel: 3 # 要并行运行的作业实例数
  rules:
    - if: '$name == "zouzou"' # 如果变量名等于 zouzou,则运行流水线,将流水线设置为手动执行
      when: manual
    - if: '$name == "haha"' # 如果变量名等于 haha,则延迟 10 秒执行
      when: delayed 
      start_in: "10"
    - when: on_success # 上面两个条件都不满足的话,则上个流水线成功时该流水线触发
  script:
    - echo "我是部署阶段"
test:
  stage: test
  script:
    - echo "我是测试阶段"

现在 name 的值是等于 zouzou的,查看流水线

将 name 的值改为 haha,在来查看流水线

changes

接受文件路径数组。 如果提交中Dockerfile文件发生的变化则为 true。触发流水线

先在项目下创建一个 Dockerfile 的文件,随便写点内容

修改 .gitlab-ci.yml 文件内容,修改后的如下

stages: # 指定运行的顺序
  - test
  - deploy
variables:
  name: haha
deploy:
  tags:
    - k8s
  stage: deploy
  retry:
  parallel: 3 # 要并行运行的作业实例数
  rules:
    - changes: # 当 Dockerfile 或者 Jenkinsfile 里的文件内容改变时,才会执行 deploy 的 job
      - Dockerfile
      - Jenkinsfile
  script:
    - echo "我是部署阶段"
test:
  stage: test
  script:
    - echo "我是测试阶段"

触发流水线查看下,可以看到,只有 test 的 job 触发了

这时候只有 Dockerfile 或者 Jenkinsfile 里的文件没有发生改变,deploy 的 job 都不会触发

接下来我们修改一下 Dockerfile 的内容,然后提交

提交后查看流水线

exists

接受文件路径数组。当仓库中存在指定的文件时操作

stages: # 指定运行的顺序
  - test
  - deploy
variables:
  name: haha
deploy:
  tags:
    - k8s
  stage: deploy
  retry:
  parallel: 3 # 要并行运行的作业实例数
  rules:
    - exists: # 当项目中存在 Dockerfile 或者 Jenkinsfile 文件时,才会执行 deploy 的 job
      - Dockerfile
      - Jenkinsfile
  script:
    - echo "我是部署阶段"
test:
  stage: test
  script:
    - echo "我是测试阶段"


实际项目中使用 rules 的场景


下面几个例子是我们公司实际项目中 gitlab ci 的场景

例子一:在合 pr 的时候触发 job

static_check:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' # 是合 pr 的时候才执行该 job
  tags:
    - docker
  stage: verify
  script: # 执行的操作
    - make clean
    - make genproto
    - go mod vendor
    - make lint
  interruptible: true
verify_import_alias:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'  # 是合 pr 的时候才执行该 job
  stage: verify
  tags:
    - k8s
  script:
    - make verify-import-alias
  interruptible: true

演示

在我们的 main 分支下的 .gitlab-ci.yml 里写入下面内容

stages: # 指定运行的顺序
  - test
  - deploy
variables:
  name: haha
deploy:
  tags:
    - k8s
  stage: deploy
  retry:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' # 合 pr 时触发
  script:
    - echo "我是部署阶段"
test:
  stage: test
  script:
    - echo "我是测试阶段"

基于 main 分支创建一个 demo 分支,修改 demo 分支上的文件,然后提交到 demo 分支上,也可以使用 git 提交

提交后查看流水线,发现只有一个 test 的 job 触发了(要保证 demo 分支的和 main 分支的 .gitlab-ci.yml 里的文件内容一样,如果不一样会以 demo 分支的为准)

这时候我们在提交一个 pr 到 main 分支

可以看到,提交 pr 只会跑'$CI_PIPELINE_SOURCE == "merge_request_event"' 的 job ,我们的 test job 没有触发

例子二:满足某个条件时执行

unit_test:
  rules: # 合 pr 或者提交到的分支是 main 分支。或者是创建 tag,只要满足某一个,都会触发该 job
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_TAG' 
  stage: test
  tags:
    - docker
  script:
    - make genproto
    - go mod vendor
    - make test
  interruptible: true
  coverage: '/total:\s+\(statements\)\s+\d+.\d+%/'

例子三:当往 main 分支 push 时触发

build_to_release_ci:
  rules: # 提交的分支是 main 分支并且是 push 操作时才触发该流水线,&& 条件都要满足
    - if: '$CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == "push"' # trigger when a branch was merged into main
  retry:
    max: 2
  tags:
    - docker
  before_script:
    - docker -v #override the global before_script
    - make genall
    - go mod vendor
  stage: build
  script:
    - |
      # set envirment varible when new release publish by new tag created
      export REGISTRY_USER_NAME=$CI_REGISTRY_USER_NAME
      export REGISTRY_PASSWORD=$CI_REGISTRY_PASSWORD
      export REGISTRY_REPO="release-ci.daocloud.io/amamba"
      export REGISTRY_SERVER_ADDRESS="release-ci.daocloud.io"
      export HELM_REPO="https://release-ci.daocloud.io/chartrepo/amamba"
      make release -j2 #REGISTRY_USER_NAME and REGISTRY_PASSWORD config as Gitlab Variables
      export NPM_TOKEN=$NPM_TOKEN;make push-grpc-ts   #NPM_TOKEN has been configured as Gitlab Variable

例子四:创建 tag 或者往 main 分支上 merge 时触发

build_to_release_ci:
  rules: # 往 main 分支上 merge 或者创建 tag 的时候触发
    - if: '($CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == "merge_request_event") || $CI_COMMIT_TAG' 
  tags:
    - docker
  before_script:
    - docker -v
  stage: build
  script:
    - |
      # set envirment varible when new release publish by new tag created
      export REGISTRY_USER_NAME=$CI_REGISTRY_USER_NAME
      export REGISTRY_PASSWORD=$CI_REGISTRY_PASSWORD
      export REGISTRY_REPO="release-ci.daocloud.io/amamba"
      export REGISTRY_SERVER_ADDRESS="release-ci.daocloud.io"
      make release #REGISTRY_USER_NAME and REGISTRY_PASSWORD config as Gitlab Variables


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
开发工具 git
Gitlab----Pipline流水线语法only、except、rules、workflow
Gitlab----Pipline流水线语法only、except、rules、workflow
820 0
Gitlab----Pipline流水线语法only、except、rules、workflow
|
Linux 应用服务中间件 网络安全
linux安装Gitlab
linux安装Gitlab
314 0
|
4月前
|
存储 安全 Linux
Linux服务器上安装配置GitLab的步骤。
按照以上步骤,一个基础的GitLab服务应该运行并可以使用。记得定期检查GitLab官方文档,因为GitLab的安装和配置步骤可能随着新版本而变化。
385 0
|
Shell Docker 容器
GitlabCI学习笔记之一:安装Gitlab和GitLabRunner
GitlabCI学习笔记之一:安装Gitlab和GitLabRunner
|
Devops 持续交付 开发工具
入职必会-开发环境搭建54-GitLab下载和安装
GitLab 是一个基于 web 的 Git 仓库管理工具,提供了代码托管、版本控制、协作开发、持续集成等功能,是一个综合的 DevOps 平台。用户可以使用 GitLab 托管他们的代码仓库,并利用其丰富的功能来管理和协作开发项目。 以下是 GitLab 的一些主要特点和功能。
310 0
入职必会-开发环境搭建54-GitLab下载和安装
|
Docker 容器
Docker安装Gitlab和Gitlab-Runner并实现项目CICD
Docker安装Gitlab和Gitlab-Runner并实现项目CICD
|
持续交付 开发工具 git
阿里云云效产品使用问题之在云效代码域中gitlab使用docker安装的,迁移时遇到“获取企业信息失败”,是什么原因
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
Ubuntu 安全 网络安全
在Ubuntu 16.04上安装和配置GitLab的方法
在Ubuntu 16.04上安装和配置GitLab的方法
275 0
|
存储 Ubuntu 安全
在Ubuntu 18.04上安装和配置GitLab的方法
在Ubuntu 18.04上安装和配置GitLab的方法
357 0
|
缓存 Kubernetes Shell
CI/CD:安装配置Gitlab Runner
CI/CD:安装配置Gitlab Runner
1227 0