当前位置: 首页 > news >正文

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- deployvariables:                   # 全局变量设置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/pipsetup_job:                   # setup 阶段的 jobstage: setupimage: node:16script:- npm installartifacts:paths:- node_modules/build_job:                   # build 阶段的 jobstage: buildimage: node:16script:- npm run buildartifacts:paths:- dist/expire_in: 1 week         # 设置 artifacts 的过期时间test_job:                    # test 阶段的 jobstage: testimage: node:16dependencies:               # 声明依赖于 build_job 的 artifacts- build_jobscript:- npm run testcache:                      # 局部 cache 配置,覆盖全局配置paths:- .cache/test_python:                 # 另一个 test 阶段的 job,用 Python 执行测试stage: testimage: python:3.9script:- pip install -r requirements.txt- pytestartifacts:paths:- test-reports/reports:junit: test-reports/report.xml  # 生成 JUnit 格式的测试报告manual_deploy:               # deploy 阶段的 job,手动执行stage: deployscript:- echo "Deploying to production server..."when: manual                # 手动触发only:- masterauto_deploy:                 # 自动部署,允许失败stage: deployscript:- echo "Deploying to staging server..."environment:                # 设置环境变量name: stagingurl: https://staging.example.comallow_failure: true         # 部署失败不影响 pipeline 成功状态pages:                       # 使用 GitLab Pages 部署静态站点stage: deployscript:- echo "Building static pages"- mkdir .public- echo "<html><body><h1>My Project</h1></body></html>" > .public/index.htmlartifacts:paths:- .publiconly:- masterretry_example:               # 设置失败后自动重试stage: testscript:- echo "This will retry on failure"- exit 1retry: 2                   # 失败时重试2次timeout_example:             # 设置超时stage: testscript:- echo "This job has a timeout"- sleep 120timeout: 1m                # 超时时间1分钟# 使用extends继承配置
.base_job_template:          # 定义一个基础job模板image: alpine:latestbefore_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: buildimage: docker:latestservices:- docker:dind               # 使用 Docker in Dockerscript:- docker build -t myapp .only_master_branch:           # 只在 master 分支上运行的 jobstage: testscript:- echo "This runs only on the master branch"only:- masterexcept_develop_branch:        # 除了 develop 分支外,所有分支都运行的 jobstage: testscript:- 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 和关键字的使用。

相关文章:

  • JAVA工具类——Collections
  • AI学习指南深度学习篇-丢弃法Python实践
  • FTP访问方式详解
  • 【JVM】JVM执行流程和内存区域划分
  • 04_OpenCV图片缩放
  • element-plus中el-table固定列fixed失效问题
  • 智慧环保大数据平台建设方案
  • ASP.NET Core8.0学习笔记(十九)——EF Core DbSet
  • 论文阅读 | HiDDeN网络架构
  • 一次 Spring 扫描 @Component 注解修饰的类坑
  • 什么是数据挖掘?初学者指南
  • 基于python+django+vue的电影数据分析及可视化系统
  • 瓶子类型检测系统源码分享
  • 第十四届蓝桥杯真题Java c组A.求和(持续更新)
  • unity CustomEditor的基本使用
  • 2019.2.20 c++ 知识梳理
  • Android交互
  • Codepen 每日精选(2018-3-25)
  • Effective Java 笔记(一)
  • ES6系统学习----从Apollo Client看解构赋值
  • IndexedDB
  • Javascript设计模式学习之Observer(观察者)模式
  • Map集合、散列表、红黑树介绍
  • vue 个人积累(使用工具,组件)
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 从tcpdump抓包看TCP/IP协议
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 前端工程化(Gulp、Webpack)-webpack
  • 区块链共识机制优缺点对比都是什么
  • 用jQuery怎么做到前后端分离
  • NLPIR智能语义技术让大数据挖掘更简单
  • 阿里云服务器购买完整流程
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • ​你们这样子,耽误我的工作进度怎么办?
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #QT(TCP网络编程-服务端)
  • #QT项目实战(天气预报)
  • #传输# #传输数据判断#
  • #微信小程序(布局、渲染层基础知识)
  • (2)STM32单片机上位机
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (十三)Flask之特殊装饰器详解
  • (十三)Maven插件解析运行机制
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)Linux整合apache和tomcat构建Web服务器
  • .ai域名是什么后缀?
  • .NET Framework 3.5安装教程
  • .net6+aspose.words导出word并转pdf
  • .net和php怎么连接,php和apache之间如何连接
  • .net中应用SQL缓存(实例使用)