GitLab CI/CD脚本入门

news/2024/9/28 22:55:11 标签: gitlab, ci/cd

工作中第一次用到gitlab自带的cicd, 记录一下备忘

GitLab CI/CD 配置文件 (.gitlab-ci.yml) 中有许多关键字,用于定义不同的行为和阶段。以下是一些常见且重要的关键字:

全局和 job 特定关键字

  1. image
    指定运行 CI job 时的 Docker 镜像。

    image: node:16
    
  2. services
    为 job 提供的额外的服务容器,如数据库或缓存服务。

    services:
      - postgres:latest
    
  3. stages
    定义 job 的阶段,例如 buildtestdeploy 等。

    stages:
      - build
      - test
      - deploy
    
  4. script
    定义 job 中实际执行的命令。

    script:
      - npm install
      - npm run test
    
  5. after_script
    在 job 结束后执行的命令(无论成功与否)。

    after_script:
      - echo "This runs after the job finishes"
    
  6. only / except
    用于控制 job 在特定的分支或提交时执行。

    only:
      - master
      - tags
    except:
      - develop
    
  7. variables
    定义环境变量,支持全局和 job 级别。

    variables:
      NODE_ENV: "production"
    
  8. cache
    缓存依赖文件或其他生成的文件,以加速后续的 pipeline 执行。

    cache:
      paths:
        - node_modules/
    
  9. artifacts
    定义 job 生成的工件,能够在 pipeline 的后续 job 中使用。

    artifacts:
      paths:
        - build/
    
  10. dependencies
    明确指出某个 job 依赖于哪个前面的 job 的 artifacts

    dependencies:
      - build_job
    

其他常用关键字

  1. before_script
    script 执行之前运行的命令。

  2. stage
    定义 job 属于哪个阶段,必须与 stages 中的值对应。

    stage: build
    
  3. retry
    当 job 失败时自动重试的次数。

    retry: 2
    
  4. timeout
    指定 job 最大运行时间,超时后自动失败。

    timeout: 20m
    
  5. tags
    用于指定在哪些 GitLab Runner 上运行 job,通常用于选择特定的 runner。

    tags:
      - docker
    
  6. allow_failure
    允许某个 job 失败,不会导致整个 pipeline 失败。

    allow_failure: true
    
  7. when
    控制 job 在何时执行,默认是 on_success,可以设置为 manualalways 等。

    when: manual
    
  8. extends
    允许从预定义的 job 模板或设置中继承配置。

    .base_job:
      script:
        - echo "Base job"
    
    my_job:
      extends: .base_job
    

文件示例

下面是一个包含尽可能多关键字和功能的标准 GitLab CI/CD 配置文件示例,展示了如何使用多个关键字来管理和优化 CI/CD 流程。这个例子展示了从代码构建、测试、缓存、工件管理到自动部署等多方面的功能。

# 全局配置
stages:                      # 定义各个阶段
  - setup
  - build
  - test
  - deploy

variables:                   # 全局变量设置
  NODE_ENV: "development"
  PACKAGE_VERSION: "1.0.0"
  GIT_SUBMODULE_STRATEGY: "recursive"  # 设置git子模块策略

before_script:               # 全局的before_script,适用于所有job
  - echo "Setting up the environment"
  - apt-get update -y
  - apt-get install -y python3-pip

# Cache设置,适用于所有的job
cache:
  paths:
    - node_modules/
    - .cache/pip

setup_job:                   # setup 阶段的 job
  stage: setup
  image: node:16
  script:
    - npm install
  artifacts:
    paths:
      - node_modules/

build_job:                   # build 阶段的 job
  stage: build
  image: node:16
  script:
    - npm run build
  artifacts:
    paths:
      - dist/
    expire_in: 1 week         # 设置 artifacts 的过期时间

test_job:                    # test 阶段的 job
  stage: test
  image: node:16
  dependencies:               # 声明依赖于 build_job 的 artifacts
    - build_job
  script:
    - npm run test
  cache:                      # 局部 cache 配置,覆盖全局配置
    paths:
      - .cache/

test_python:                 # 另一个 test 阶段的 job,用 Python 执行测试
  stage: test
  image: python:3.9
  script:
    - pip install -r requirements.txt
    - pytest
  artifacts:
    paths:
      - test-reports/
    reports:
      junit: test-reports/report.xml  # 生成 JUnit 格式的测试报告

manual_deploy:               # deploy 阶段的 job,手动执行
  stage: deploy
  script:
    - echo "Deploying to production server..."
  when: manual                # 手动触发
  only:
    - master

auto_deploy:                 # 自动部署,允许失败
  stage: deploy
  script:
    - echo "Deploying to staging server..."
  environment:                # 设置环境变量
    name: staging
    url: https://staging.example.com
  allow_failure: true         # 部署失败不影响 pipeline 成功状态

pages:                       # 使用 GitLab Pages 部署静态站点
  stage: deploy
  script:
    - echo "Building static pages"
    - mkdir .public
    - echo "<html><body><h1>My Project</h1></body></html>" > .public/index.html
  artifacts:
    paths:
      - .public
  only:
    - master

retry_example:               # 设置失败后自动重试
  stage: test
  script:
    - echo "This will retry on failure"
    - exit 1
  retry: 2                   # 失败时重试2次

timeout_example:             # 设置超时
  stage: test
  script:
    - echo "This job has a timeout"
    - sleep 120
  timeout: 1m                # 超时时间1分钟

# 使用extends继承配置
.base_job_template:          # 定义一个基础job模板
  image: alpine:latest
  before_script:
    - echo "This is before script from base template"
  script:
    - echo "Running from base template"

my_extended_job:
  extends: .base_job_template  # 继承模板
  script:
    - echo "This is an extended job"

# Docker in Docker 服务示例
docker_build:
  stage: build
  image: docker:latest
  services:
    - docker:dind               # 使用 Docker in Docker
  script:
    - docker build -t myapp .

only_master_branch:           # 只在 master 分支上运行的 job
  stage: test
  script:
    - echo "This runs only on the master branch"
  only:
    - master

except_develop_branch:        # 除了 develop 分支外,所有分支都运行的 job
  stage: test
  script:
    - echo "This runs on all branches except develop"
  except:
    - develop
文件说明:
  1. 全局设置:

    • stages:定义 CI/CD 流水线的不同阶段。
    • variables:定义全局变量。
    • before_script:全局的前置脚本,适用于所有 job。
    • cache:全局的缓存配置,指定缓存的目录。
  2. job 示例:

    • setup_job:安装依赖并缓存 node_modules/
    • build_job:构建项目,并将构建产物存储为 artifacts。
    • test_jobtest_python:分别测试 JavaScript 和 Python 项目,生成 JUnit 格式报告。
  3. 部署:

    • manual_deploy:手动触发部署,仅在 master 分支上执行。
    • auto_deploy:自动部署至 staging 环境,允许失败。
    • pages:通过 GitLab Pages 部署静态站点。
  4. 特殊功能:

    • retry_example:在 job 失败时自动重试两次。
    • timeout_example:设置了超时时间为1分钟的 job。
    • my_extended_job:演示了如何使用 extends 关键字继承另一个 job 模板。
    • docker_build:使用 docker:dind 服务运行 Docker in Docker。
  5. 条件执行:

    • only_master_branch:仅在 master 分支上运行。
    • except_develop_branch:除 develop 分支外在所有分支上运行。

这个 .gitlab-ci.yml 文件展示了 GitLab CI/CD 的广泛功能,几乎涵盖了实际使用中常见的场景。你可以根据项目需求定制每个 job 和关键字的使用。


http://www.niftyadmin.cn/n/5682004.html

相关文章

开源模型应用落地-qwen2.5-7b-instruct-LoRA微调-LLaMA-Factory-单机单卡-V100(十八)

一、前言 本篇文章将使用LLaMA-Factory去高效微调(命令和界面方式)QWen2.5系列模型,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 QWen2系列模型微调: 开源模型应用落地-qwen2-7b-instruct-LoRA微调-LLaMA-Factory-单机单…

C++ | Leetcode C++题解之第435题无重叠区间

题目&#xff1a; 题解&#xff1a; class Solution { public:int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.empty()) {return 0;}sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) {retur…

Redis篇(Java操作Redis)

目录 讲解一&#xff1a;简介 讲解二&#xff1a;Jedis Github 一、创建项目、 二、添加依赖 三、配置文件 四、Java连接Redis 五、通过Redis连接池获取连接对象并操作服务器 六、封装JedisUtil对外提供连接对象获取方法 七、Java操作Redis五种数据类型 1. 连接与释放…

【机器学习】——决策树以及随机森林

文章目录 1. 决策树的基本概念与结构1.1 决策树的构建过程 2. 决策树的划分标准2.1 信息增益&#xff08;Information Gain&#xff09;2.2 信息增益比&#xff08;Information Gain Ratio&#xff09;2.3 基尼指数&#xff08;Gini Index&#xff09;2.4 均方误差&#xff08;…

①大缓存ModbusRTU485数据集中采集器寄存器线圈重映射从站并发采集Modbus 串口RS485 转 RS485

大缓存ModbusRTU485数据集中采集器寄存器线圈重映射从站并发采集https://item.taobao.com/item.htm?ftt&id811821574300 产品型号&#xff1a; 一分一路 MS-A1-C011 一分2路 MS-A1-C021 一分4路 MS-A1-C041 一分7路 MS-A1-C071 一般技术规格 1.串口 MS-A1…

无需安装移动端的互传工具“快速分享”

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 前不久给大家介绍过 Windows 自带的 Nearby Sharing 附近分享&#xff0c;只需要在手机上安装个 App 就可以与 Windows 进行互传。而今天介绍的“快速分享”正好相反&#xff0c;是在 Windows 上安装 Goog…

Mysql主从不一致校验

方案 MySQL主从数据不一致的主动发现机制通常依赖于主从复制过程中提供的工具和方法&#xff0c;而非自动的主动检测机制。以下是常见的发现和监控方法&#xff1a; Replication监控工具&#xff1a;MySQL提供了多种监控复制状态的工具&#xff0c;如SHOW SLAVE STATUS命令。…

算法宝典——二分查找算法

1.认识二分查找 二分查找的时间复杂度:O(logN) 二分查找属于算法中耳熟能详的一类&#xff0c;通常的我们会说只有数组有序才可以使用二分查找&#xff0c;不过这种说法并不完全正确&#xff0c;只要数据具有"二段性"就可以使用二分查找&#xff0c;即我们可以找出一…