Gitlab CI/CD: rules和only

这篇具有很好参考价值的文章主要介绍了Gitlab CI/CD: rules和only。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对比rules和only

rulesonly 都是在 GitLab CI/CD 配置中用于控制作业(job)何时执行的关键字,但它们之间有一些不同之处:

  1. only 关键字

    only 关键字用于定义在特定情况下触发作业的条件。你可以指定一系列触发条件,只有当至少一个条件匹配时,作业才会被触发执行。only 通常用于根据分支、标签、变量等来设置作业的触发条件。例如:

    only:
      - branches  # 触发所有分支上的作业
      - tags      # 触发所有标签上的作业
      - schedules # 触发通过计划任务(Scheduled pipelines)触发的作业
    
  2. rules 关键字

    rules 关键字是在较新的GitLab 12.3 版本引入的功能,它提供了更灵活和复杂的条件设置。通过 rules,你可以设置一个或多个条件,以及根据条件来定义作业是否应该执行,何时执行,以及应该如何执行。rules 支持更多的条件判断和更复杂的逻辑。例如:

    rules:
      - if: '$CI_COMMIT_BRANCH == "main"'
        when: manual
      - exists:
          - file.txt
        when: on_success
    

    在这个例子中,第一个规则是:只有在 main 分支上时,作业将需要手动触发。第二个规则是:只有当指定的文件 file.txt 存在时,作业在成功状态下才会自动触发。

总的来说,only 更简单,适用于基本的分支、标签和计划任务触发条件。而 rules 则更灵活,可以进行更复杂的条件判断,并且能够更精细地控制作业的触发和执行。如果你的 GitLab 版本支持 rules,那么在编写配置时可以考虑使用 rules 来获得更多的控制权。
而gitlab官方似乎也更推荐于rules,当前版本是16.3了。
文档地址
gitlab-ci only,linux,gitlab,ci/cd,git

对比only和rules写法

分支-only:

  only:
    refs:
      - main

分支-rules:

  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
      when: on_success

标签-only:

  only:
    - /^dev-.*$/

标签-rules:

  rules:
    - if: '$CI_COMMIT_TAG =~ /^dev-/'
      when: on_success

workflow和rules的应用:

虽然这个示例有点复杂奇怪,但是主要是想用rules和workflow在多个不同环境下去deploy。
我先只定义一个job就叫test, 然后定义了一下变量COMMIT_REF,TEST_PATH和不同tag下面的ENV。然后下面有echo输出。意思是会根据打不同的tag标签就会执行相同的job,而path和port不一样。

variables:
  COMMIT_REF: "$CI_COMMIT_TAG"
  TEST_PATH: "test/ghkg/$ENV/$COMMIT_REF"
workflow:
  rules:
    - if: '$CI_COMMIT_TAG =~ /^dev-/'
      variables:
        ENV: "dev"
        TEST_PATH: "test01/$ENV/$COMMIT_REF"
        SERVER_PORT: "8081"
    - if: '$CI_COMMIT_TAG =~ /^prod-/'
      variables:
        ENV: "prod"
        TEST_PATH: "test02/$ENV/$COMMIT_REF"
        SERVER_PORT: "8082"
stages:
  - test
test:
  stage: test
  tags:
    - shell
  environment:
    name: $ENV
  script:
    - export
    - echo "$ENV"
    - echo "cd $TEST_PATH"
    - echo "java -jar demo.jar  --spring.profiles.active=$ENV  --server.port=$SERVER_PORT"
    - echo "test end" # 以上命令其实根据根据环境不同,变量不同来运行同一个job
  artifacts:
    paths:
      - /*
    expire_in: 1 hour

比如我打个prod-0.0.1标签:
gitlab-ci only,linux,gitlab,ci/cd,git
后面这里还有一种情况:
注意条件请不要改成branch和tag同时判断:

  rules:
    - if: '$CI_COMMIT_BRANCH == "main" && $CI_COMMIT_TAG =~ /^dev-/'

在 GitLab CI/CD 中,$CI_COMMIT_BRANCH 和 $CI_COMMIT_TAG 是两个不同的预定义环境变量,它们分别用于获取当前提交的分支名和标签信息。这两个变量在不同的情况下会有不同的取值:

  1. 当你在进行提交(push)操作时,CI_COMMIT_BRANCH 可能会有值,表示当前提交所在的分支。而此时,CI_COMMIT_TAG 通常为空,因为你没有创建标签。
  2. 当你在创建并推送一个标签时,CI_COMMIT_TAG 可能会有值,表示当前提交是一个标签。此时,CI_COMMIT_BRANCH 通常为空,因为标签是在分支上的特定提交上创建的,而不是在分支上。

通常情况下,$CI_COMMIT_BRANCH 和 $CI_COMMIT_TAG 是互斥的,不会同时都有值。这是因为分支和标签是不同的 Git 概念,一个提交要么在分支上,要么是一个标签,而不可能同时既是分支又是标签。

可以用这个例子打印一下看一下:
意思是提交到main会触发一次deploy又或者提交一个tag:dev-*也会触发deploy,COMMIT_REF变量我先改成了$CI_COMMIT_REF_NAME。

variables:
  COMMIT_REF: "$CI_COMMIT_REF_NAME"
  TEST_PATH: "test/ghkg/$ENV/$COMMIT_REF"
workflow:
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
      variables:
        ENV: "local"
        TEST_PATH: "test00/$ENV/$COMMIT_REF"
        SERVER_PORT: "8080"
    - if: '$CI_COMMIT_TAG =~ /^dev-/'
      variables:
        ENV: "dev"
        TEST_PATH: "test01/$ENV/$COMMIT_REF"
        SERVER_PORT: "8081"
stages:
  - test
test:
  stage: test
  tags:
    - shell
  environment:
    name: $ENV
  script:
    - export
    - echo "$CI_COMMIT_REF_NAME"
    - echo "$CI_COMMIT_TAG"
    - echo "$CI_COMMIT_BRANCH"
    - echo "$ENV"
    - echo "cd $TEST_PATH"
    - echo "java -jar demo.jar  --spring.profiles.active=$ENV  --server.port=$SERVER_PORT"
    - echo "test end" # 以上命令其实根据根据环境不同,变量不同来运行同一个job

gitlab-ci only,linux,gitlab,ci/cd,git
gitlab-ci only,linux,gitlab,ci/cd,git
如果同时满足两个条件,是在main分支上打dev-标签,就会触发两次deploy。文章来源地址https://www.toymoban.com/news/detail-770233.html

到了这里,关于Gitlab CI/CD: rules和only的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 纯手工搭建 GitaLab与Gitlab-CI/CD--附 gitlab-ci.yml示例

    作者:javastarboy 背景:前几年(2018 年前后)的 jenkins+docker+k8s 的CI/CD 在工作之中受益不少。提升了不少工作效率。而随着这几年的使用发现,目前 gitlab-CI/CD 在持续集成部署中更加方便、高效。 尤其是在测试环节中,研发无需编写复杂的 jenkins 脚本,只要提交代码,即可自动

    2023年04月08日
    浏览(53)
  • GitLab Runner 实现项目 CI/CD 发布

    Gitlab实现CICD的方式有很多,比如通过Jenkins,通过Gitlab Runner等,今天主要介绍后者。Gitlab在安装的时候,就默认包含了Gitlab CI的能力,但是该能力只是用于协调作业,并不能真的去执行作业,因此需要搭配Gitlab Runner来作为执行器实现具体的CICD工作。Gitlab Runner可以被安装在任

    2024年01月17日
    浏览(63)
  • DevOps系列文章之 GitLab CI/CD

    由于目前公司使用的gitlab,大部分项目使用的CICD是gitlab的CICD,少部分用的是jenkins,使用了gitlab-ci一段时间后感觉还不错,因此总结一下 介绍gitlab的CICD之前,可以先了解CICD是什么 我们的开发模式经历了如下的转变:瀑布模型-敏捷开发→DevOps(Development、Operations的组合词,是

    2024年01月22日
    浏览(56)
  • 使用gitlab 自带 CI/CD 构建部署项目

    这里我用的是桥接模式 桥接模式方便局域网内的小伙伴一起使用 如果没有这个打算可跳过这步 编辑网络 vi /etc/sysconfig/network-scripts/ifcfg-你的网络名称 修改如下内容 这里我有句话要讲, 这些信息配置完成后出现\\\"网络不可达\\\" 需要把 BOOTPROTO 改为 dhcp 详情可参考 处理网络不可达

    2024年02月12日
    浏览(63)
  • CI/CD:GitLab-CI 自动化集成/部署 JAVA微服务的应用合集

    日常开发中,每次代码编写完成后,都需要手动打包,并且上传服务器,无论本地打包的时间或者上传文件到服务器都需要花费大量的时间来完成,都是重复的并且毫无意义,应该将时间花费在更有价值的时间上;所以编写这篇文章,将自己收集、搭建、测试的步骤或经验汇

    2024年02月08日
    浏览(51)
  • 【基于 GitLab 的 CI/CD 实践】03、GitLab Pipeline 实践(上)

    目录 一、GitLab Pipeline 流水线语法有哪些?流水线参数列表 如何检查语法错误?流水线语法检测 二、Pipeline 基础语法 job script before_script after_script stages 未定义 stages ​定义 stages 控制 stage 运行顺序   .pre .post stage variables 综合实例(一) tags allow_failure when manual 手动 delayed 延迟

    2024年02月17日
    浏览(62)
  • gitlab+jenkins+harbor实现CI/CD(2)——初级

    git安装 jenkins主机上安装docker-ce 配置仓库证书 测试 创建项目 创建一个freestyle project 在jenkins主机获取密钥 在gitlab上传公钥 在jenkins上传私钥 输入测试命令后保存 点击立即构建 查看控制台输出 工作路径 构建触发器,定时触发 安装插件 gitlab和 Cloudbee docker 配置gitlab 在网络设

    2024年02月09日
    浏览(52)
  • 【基于 GitLab 的 CI/CD 实践】02、gitlab-runner 实践

    目录 一、gitlab-runner 简介 1.1 要求 1.2 特点 二、GitLab Runner 安装 2.1 使用 GItLab 官方仓库安装 2.2 使用 deb/rpm 软件包 2.3 在容器中运行 GitLab Runner 三、GitLab Runner 注册 3.1 GitLabRunner 类型 3.2 获取 runner token 获取 shared 类型 runner token   ​获取 group 类型的 runner token   ​获取 speci

    2024年02月16日
    浏览(53)
  • docker部署gitlab CI/CD (一)第一篇:部署gitlab及汉化

    网上很多类似教程,但多少有点夹带私货,有的竟然拉取的第三方镜像,而且很多都要修改配置文件,完全不知道是为什么,于是结合其他人的博客和官方文档, 知其然也要知其所以然,于2023年4月17日写下这篇。 官方文档: https://docs.gitlab.com/ee/install/docker.html 主要参考博客

    2023年04月17日
    浏览(48)
  • 实现基于 GitLab 的数据库 CI/CD 最佳实践

    数据库变更一直是整个应用发布过程中效率最低、流程最复杂、风险最高的环节,也是 DevOps 流程中最难以攻克的阵地。那我们是否能在具体的 CI/CD 流程中,像处理代码那样处理数据库变更呢? DORA(DevOps Research Assessment)是一家专注于 DevOps 的研究机构, 在该领域以专业与客

    2024年02月07日
    浏览(97)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包