GitLab CI/CD脚本入门

news2024/9/29 5:20:42

工作中第一次用到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.coloradmin.cn/o/2175907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二节—类与对象(上)

1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成 2.…

Java中的哈希函数

在Java的世界里&#xff0c;哈希函数是一个核心概念&#xff0c;它不仅在数据结构中扮演着重要角色&#xff0c;如哈希表&#xff08;HashMap、HashSet等&#xff09;&#xff0c;还在安全领域&#xff0c;如密码存储和消息摘要中发挥着至关重要的作用。本文将深入探讨Java中的…

千兆网络变压器HX84801SP POE应用主板

千兆网络变压器HX84801SP POE应用主板&#xff1a; 随着网络时代科技飞速发展&#xff0c;2G到5G时代短短10年实现了目标。 千兆POE交换机是一种高速网络设备&#xff0c;适用于各种网络环境&#xff0c;尤其是需要高带宽和快速数据传输的场合。 千兆网络变压器POE交换机通常采…

HTML基础用法介绍二

目录&#xff1a; 列表 无序列表有序列表定义列表 表格 表格单元格合并 input标签 属性值text和password的使用 输入框中占位文本的使用 属性值radio的使用属性值checkbox的使用属性值file的使用 下拉菜单 文本域 label标签 字符实体 &#x1f698;正片开始 无序列表 …

手机/平板端 Wallpaper 动态壁纸文件获取及白嫖使用指南

Wallpaper 动态壁纸文件获取及使用指南 目录 壁纸文件获取手机 / 平板使用手机 / 平板效果预览注意事项PC/Mac 使用 1. 壁纸文件获取链接 链接&#xff1a;夸克网盘分享 复制链接到浏览器打开并转存下载即可。 &#xff08;主页往期视频的 4K 原图和 mpkg 动态壁纸文件&#xf…

IO端口与IO接口

I/O端口和I/O接口是计算机系统中用于连接外部设备的关键组成部分&#xff0c;两者密切相关&#xff0c;但又有明显的区别&#xff1a; I/O端口 (I/O Port): 定义: I/O端口是内存地址空间中的一组特殊地址&#xff0c;用于与外部设备进行数据交换。CPU通过向这些特定的地址写入…

【C语言】单片机map表详细解析

1、RO Size、RW Size、ROM Size分别是什么 首先将map文件翻到最下面&#xff0c;可以看到 1.1 RO Size&#xff1a;只读段 Code&#xff1a;程序的代码部分&#xff08;也就是 .text 段&#xff09;&#xff0c;它存放了程序的指令和可执行代码。 RO Data&#xff1a;只读…

MQ基础:RabbitMQ真面目

同步调用方式&#xff0c;指的是发送方直接发送给接收方的形式。而这种方式在某些情况下可能出现问题&#xff0c;比如当业务逻辑变得复杂&#xff0c;同步的方式需要等待上一条指令被接收后才会继续&#xff0c;对性能的影响很大。 异步的方式&#xff0c;增加了一个消息代理…

网络编程(12)——完善粘包处理操作(id字段)

十二、day12 之前的粘包处理是基于消息头包含的消息体长度进行对应的切包操作&#xff0c;但并不完整。一般来说&#xff0c;消息头仅包含数据域的长度&#xff0c;但是如果要进行逻辑处理&#xff0c;就需要传递一个id字段表示要处理的消息id&#xff0c;当然可以不在包头传i…

【Godot4.3】简单物理模拟之圆粒子碰撞检测

概述 最近开始研究游戏物理的内容&#xff0c;研究运动、速度、加速度之类的内容。也开始模仿一些简单的粒子模拟。这些都是一些基础、简单且古老的算法&#xff0c;但是对于理解游戏内的物理模拟很有帮助。甚至你可以在js、Python或者其他程序语言中实现它们。 图形的碰撞检…

Linux操作系统中SpringGateway

1、SpringGateway简介 核心功能有三个&#xff1a; 路由&#xff1a;用于设置转发地址的 断言&#xff1a;用来判断真实应该请求什么地址 过滤器&#xff1a;可以过滤地址和处理参数 1、什么是网关 网关是后台服务的统一入口&#xff0c;类似于平时网络里提到的网关。 2…

ppt压缩有什么简单方法?压缩PPT文件的几种方法

ppt压缩有什么简单方法&#xff1f;许多用户常常面临文件过大的问题&#xff0c;尤其在需要通过电子邮件发送或上传至网络平台时&#xff0c;大文件会带来诸多麻烦。此外&#xff0c;较大的文件可能导致软件响应缓慢&#xff0c;从而影响整体的演示体验。因此&#xff0c;寻找有…

ESP8266/01s模块烧录MQTT AT固件篇

&#xff08;代码完美实现&#xff09;stm32 新版 onenet mqtt物联网(保姆级教程) 地址&#xff1a; &#xff08;代码完美实现&#xff09;stm32 新版 onenet mqtt物联网(保姆级教程)https://blog.csdn.net/Wang2869902214/article/details/142501323 乐鑫ESP8266/安信可…

Python项目Flask框架整合Mysql

一、在配置类中编写Mysql配置信息 二、实现Mysql配置类 import pymysql from config.config import MYSQL_HOST, MYSQL_USER, MYSQL_PASSWD, MYSQL_PROT, MYSQL_DB, MYSQL_CHARSETclass MysqlDB():def __init__(self, MYSQL_HOST, MYSQL_USER, MYSQL_PASSWD, MYSQL_PROT, MYS…

time命令:轻松测量Linux命令执行时间!

一、命令简介 用途&#xff1a; 用于测量 Linux 命令执行的时间&#xff0c;包括实际时间、用户 CPU 时间和系统 CPU 时间。刚开始以为是用来“看现在几点钟”的 &#x1f972;。标签&#xff1a; 实用工具&#xff0c;性能分析。 ‍ 二、命令参数 2.1 命令格式 time [选项…

COSCon'24 第九届中国开源年会议题征集正式启动

一年一度的开源盛会&#xff0c;COSCon24 第九届中国开源年会暨开源社十周年嘉年华将于2024年11月2-3日在中关村国家自主创新示范区会议中心举办。在为期2天的大会中&#xff0c;我们将为大家带来精彩纷呈的 Keynote 主题演讲&#xff08;上午&#xff09;&#xff0c;和百花齐…

【初阶数据结构】排序——选择排序

目录 前言选择排序堆排序 前言 对于常见的排序算法有以下几种&#xff1a; 下面这节我们来看选择排序算法。 选择排序 基本思想&#xff1a;   每一次从待排序的数据元素中遍历选出最大&#xff08;或最小&#xff09;的元素放在序列的起始位置&#xff0c;直到全部待排序…

2024前端技术发展概况

当前前端技术呈现出多方面的发展态势&#xff0c;以下是详细介绍&#xff1a; 前端框架不断演进&#xff1a; React&#xff1a;作为流行的前端框架之一&#xff0c;React 依旧保持着强大的生命力。它具有高效的虚拟 DOM 机制&#xff0c;能够快速更新和渲染页面&#xff0c;极…

如何创建一个docker,给它命名,且下次重新打开它

1.创建一个新的docker并同时命名 docker run -it --name one ubuntu:18.04 /bin/bash 这时候我们已经创建了一个docker,并且命名为"one" 2.关闭当前docker exit 3.这时docker已经终止了&#xff0c;我们需要使用它要重新启动 docker start one 4.现在可以重新打…

多线程篇八

多线程篇八 如笔者理解有误欢迎指正交流&#x1f338;&#x1f338;&#x1f338; 线程池 什么是线程池&#xff1f; 顾名思义&#xff0c;线程池是一个存放了很多线程的池子.既然有很多线程&#xff0c;那一定很方便调用对吧&#xff0c;有很多线程那大家一定喜欢一起玩吧&…