Gitlab CI/CD:入门指南

article/2025/9/30 10:35:07

功能概览

CI/CD工作流

上图是基本的CI/CD工作流,与之对应的,gitlab几乎提供了上述流程节点所需的所有相关功能:

阶段功能
1. Verify
  • 通过持续集成自动构建和测试你的应用程序
  • 使用GitLab代码质量(GitLab Code Quality)分析你的源代码质量
  • 通过浏览器性能测试(Browser Performance Testing)确定代码更改对性能的影响
  • 执行一系列测试,比如Container Scanning , Dependency Scanning , JUnit tests
  • 用Review Apps部署更改,以预览每个分支上的应用程序更改
2. Package
  • 用Container Registry存储Docker镜像
  • 用NPM Registry存储NPM包
  • 用Maven Repository存储Maven artifacts
  • 用Conan Repository存储Conan包
3. Release
  • 持续部署,自动将你的应用程序部署到生产环境
  • 持续交付,手动点击以将你的应用程序部署到生产环境
  • 用GitLab Pages部署静态网站
  • 仅将功能部署到一个Pod上,并让一定比例的用户群通过Canary Deployments访问临时部署的功能(PS:即灰度发布)
  • 在Feature Flags之后部署功能
  • 用GitLab Releases将发布说明添加到任意Git tag
  • 使用Deploy Boards查看在Kubernetes上运行的每个CI环境的当前运行状况和状态
  • 使用Auto Deploy将应用程序部署到Kubernetes集群中的生产环境
4. 其它
  • 通过Auto DevOps轻松设置应用的整个生命周期
  • 将应用程序部署到不同的环境
  • 安装你自己的GitLab Runner
  • Schedule pipelines
  • 使用安全测试报告(Security Test reports)检查应用程序漏洞

Web端登录Gitlab仓库后,如果有用户有相应权限,可以在左侧边栏看到CI/CD菜单,包含:Pipelines, Jobs, Schedules三个选项。下面对这些菜单的功能和使用方法进行介绍。

  • 本文基于GitLab Community Edition 13.4.1进行介绍,在提到相关内容时会提供官网介绍链接方便读者获取一手资料
  • GitLab CI/CD官方文档
  • 从CircleCI迁移至Gitlab
  • 从Jenkins迁移至Gitlab

Pipelines

管线(Pipelines)可以认为是一个集成工作流,可以在仓库代码发生变更时触发一系列操作(脚本或者Jobs)。想要创建管线并执行,需要做两个配置工作:

  • 创建.gitlab-ci.yml管线配置文件
  • 配置GitLab-Runner

配置好之后,可以在Pipelines菜单中看到已有的管线列表。下面开始具体介绍。

创建第一个管线

想要创建一个管线,只需要在gitlab仓库根目录下创建一个.gitlab-ci.yml文件,一个简单的示例如下:

default:image: ruby:2.5before_script:- apt-get update- apt-get install -y sqlite3 libsqlite3-dev nodejs- ruby -v- which ruby- gem install bundler --no-document- bundle install --jobs $(nproc) "${FLAGS[@]}"rspec:script:- bundle exec rspecrubocop:script:- bundle exec rubocop

可以手动创建.gitlab-ci.yml文件,然后编辑内容,也可以借助gitlab提供的模版文件,使用方式是:New File -> Select a template type选择.gitlab-ci.yml即可。

先不管这里面做了什么,当我们配置了上述脚本后,GitLab-CI就自动为我们创建好了管线,但此时管线还是处理pending状态,想要GitLab-CI可以工作起来,我们还需要配置GitLab-Runner。

  1. YAML文件有两种后缀.yml.yaml,都可以被解析。虽然.gitlab-ci.yml使用的是.yml,但是YAML官方还是推荐使用.yaml作为YAML配置文件;
  2. 关于.gitlab-ci.yml文件的配置项及其作用,可以参考这两篇:.gitlab-ci.yml快速上手,.gitlab-ci.yml完整手册;
  3. 脚本中以返回0表示步骤执行失败,其他非0整数表示步骤执行成功;
  4. 配置默认需要放在仓库根目录,也支持自定义存放位置;

配置GitLab-Runner

GitLab-Runner是执行管线操作的服务器,可以是物理机、虚拟机、容器(集群)、VPS等任何可以访问该gitlab仓库的服务器,支持配置多个。

管线架构及其配置方法

正如前面提到,管线的目的是及时发现和报告开发集成过程中的问题,因此一个管线执行一般可以分为三个阶段:build -> test -> deploy

当然如果某个阶段中没有配置Job则会被跳过执行。如果你了解gradle,可以将Job类比gradle的Task,我们知道gradle在配置阶段结束后Task创建完毕并且Task之间建立起有向无环图结构的依赖关系,管线的Jobs也是如此,不过管线Jobs之间还有其他两种关系结构,下面分别了解下。

Basic

在这里插入图片描述
如上图,基础结构的特点是:

  • 从build到deploy只有一条线路;
  • 每个阶段内的Jobs之间并行执行,该阶段内所有Jobs执行完毕执行下个阶段Jobs;
  • 每个阶段之间串行执行;

虽然执行效率可能不是很高,但是这个逻辑结构是最简单和易于维护的,因此优先推荐使用这个管线架构。假如要实现上述的集成工作流,我们可以编写如下的配置文件:

stages:- build- test- deployimage: alpinebuild_a:stage: buildscript:- echo "This job builds something."build_b:stage: buildscript:- echo "This job builds something else."test_a:stage: testscript:- echo "This job tests something. It will only run when all jobs in the"- echo "build stage are complete."test_b:stage: testscript:- echo "This job tests something else. It will only run when all jobs in the"- echo "build stage are complete too. It will start at about the same time as test_a."deploy_a:stage: deployscript:- echo "This job deploys something. It will only run when all jobs in the"- echo "test stage complete."deploy_b:stage: deployscript:- echo "This job deploys something else. It will only run when all jobs in the"- echo "test stage complete. It will start at about the same time as deploy_a."

总结一下:

  • 每个Job使用stage指定执行阶段;
  • 使用script指定执行的脚本内容,脚本行与行之间用-区分;

Directed Acyclic Graph(DAG)

在这里插入图片描述
从上面可以看出,DAG允许从build到test可以有多条线路,可能每条线路的执行时长是不同的,这就很适合那种构建时间比较长,追求执行效率的项目。DAG的特点如下:

  • 允许存在多条线路,且线路之间逻辑独立,没有相关等待关系;
  • 由于存在多条线路因此会有多个deploy成果物;

想要实现上述结构的管线,配置文件如下:

stages:- build- test- deployimage: alpinebuild_a:stage: buildscript:- echo "This job builds something quickly."build_b:stage: buildscript:- echo "This job builds something else slowly."test_a:stage: testneeds: [build_a]script:- echo "This test job will start as soon as build_a finishes."- echo "It will not wait for build_b, or other jobs in the build stage, to finish."test_b:stage: testneeds: [build_b]script:- echo "This test job will start as soon as build_b finishes."- echo "It will not wait for other jobs in the build stage to finish."deploy_a:stage: deployneeds: [test_a]script:- echo "Since build_a and test_a run quickly, this deploy job can run much earlier."- echo "It does not need to wait for build_b or test_b."deploy_b:stage: deployneeds: [test_b]script:- echo "Since build_b and test_b run slowly, this deploy job will run much later."

总结一下:

  • 使用needs关键词为每个Job指定所依赖的前置Job;

Child / Parent

针对具有多个deploy成果物且生成过程完全独立的场景,出于配置复用的目的,可以将每中线路单独制作成.gitlab-ci.yml配置文件,然后用一个总的.gitlab-ci.yml去集成它们,这就是父子接口的核心思想,其逻辑结构图如下:

在这里插入图片描述

同样的,父配置文件如下:

stages:- triggerstrigger_a:stage: triggerstrigger:include: a/.gitlab-ci.ymlrules:- changes:- a/*trigger_b:stage: triggerstrigger:include: b/.gitlab-ci.ymlrules:- changes:- b/*

子配置文件/a/.gitlab-ci.yml如下:

stages:- build- test- deployimage: alpinebuild_a:stage: buildscript:- echo "This job builds something."test_a:stage: testneeds: [build_a]script:- echo "This job tests something."deploy_a:stage: deployneeds: [test_a]script:- echo "This job deploys something."

子配置文件/b/.gitlab-ci.yml如下:

stages:- build- test- deployimage: alpinebuild_b:stage: buildscript:- echo "This job builds something else."test_b:stage: testneeds: [build_b]script:- echo "This job tests something else."deploy_b:stage: deployneeds: [test_b]script:- echo "This job deploys something else."

总结如下:

  • 使用stages申明自定义的阶段;
  • 使用trigger+include关键词引用子脚本;
  • 使用rules+changes关键词指定子脚本的影响范围;
  • 子配置内容自由,不受父配置限制;
  • 父配置除了定义引入子配置外,还可以做正常配置文件可以做的事情;

相信看上了面的介绍,你已经基本了解了gitlab管线的流程和配置方法,也能掌握PipelinesJobsSchedules这几个菜单的功能使用了。可以真要上手可能还是一脸懵逼,无从下手,幸好官方已经为我们提供了各种类型项目的.gitlab-ci.yml模版,我们可以在理解这些模版基础上实现自己的配置文件。

Auto DevOps

官网链接,需要用到的时候参考。

Android工程配置模版

对于安卓项目,gitlab也提供了配置模版[Setting up GitLab CI for Android projects],拷贝如下:

image: openjdk:8-jdkvariables:ANDROID_COMPILE_SDK: "28"ANDROID_BUILD_TOOLS: "28.0.2"ANDROID_SDK_TOOLS:   "4333796"before_script:- apt-get --quiet update --yes- apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1- wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip- unzip -d android-sdk-linux android-sdk.zip- echo y | android-sdk-linux/tools/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null- echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null- echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null- export ANDROID_HOME=$PWD/android-sdk-linux- export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/- chmod +x ./gradlew# temporarily disable checking for EPIPE error and use yes to accept all licenses- set +o pipefail- yes | android-sdk-linux/tools/bin/sdkmanager --licenses- set -o pipefailstages:- build- testlintDebug:stage: buildscript:- ./gradlew -Pci --console=plain :app:lintDebug -PbuildDir=lintassembleDebug:stage: buildscript:- ./gradlew assembleDebugartifacts:paths:- app/build/outputs/debugTests:stage: testscript:- ./gradlew -Pci --console=plain :app:testDebug

更多项目示例参考这里GitLab CI/CD Examples


http://chatgpt.dhexx.cn/article/dg2logBu.shtml

相关文章

GitLab-CI 基础介绍

转载自 kubeclub GitLab-CI 工作原理 将代码托管到 git 仓库在项目的根目录下创建 .gitlab-ci.yml 文件,在文件中包含了构建、测试以及部署等脚本,这些脚本被分组为 stage,共同组成了 pipelineGitLab 检测到 ci.yml 文件,使用 G…

GitLab CI Pipeline

GitLab 不单单只是作为一个代码版本控制的仓库,很多场景下使用 GitLab 作为整合 CI 持续集成就 CD 持续发布的工作平台,那么就是 GitLab 的 CI Pipeline 功能了。 CI Pipeline 试想一下,如果开发人员只需要编写代码,而编译、打包…

CICD之 gitlab和gtilab runner

gitlab官网地址 官网文档地址 https://docs.gitlab.com/runner/install/docker.html 一。gitlab 1。gitlab安装 方式一:rpm包安装(centos)1,下载rpm包清华源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/linux命令wget https://mirror…

gitlab-CI入门

gitlab-CI 代码管理自动化部署及消息推送 (1) 通过在项目根目录下配置**.gitlab-ci.yml**文件,可以控制ci流程的不同阶段,gitlab平台会扫描.gitlab-ci.yml文件,并据此处理ci流程。 (2) ci流程在每次团队成员push/merge后之后触发。每当你pu…

Gerrit介绍

谷歌 Android 开源项目在 Git 的使用上有两个重要的创新,一个是为多版本库协同而引入的 repo,这在之前我们已经详细讨论过。另外一个重要的创新就是 Gerrit —— 代码审核服务器。Gerrit 为 Git 引入的代码审核是强制性的,就是说除非特别的授…

Git--GUI

前言 上一篇文章简单的分享了Git 的 Bash Here的使用,以及一些Git常用的命令等。本篇文章要分享的内容为Git GUI Here 的使用。 一、GUI GIT官方网站为了解决部分用户通过命令行对git工具使用时的怨声载道的现象,因此推出了一个GIT的可视化工具Git Gui …

GitLab CI介绍——入门篇

本文将会对Gitlab CI进行简要介绍,包括Gitlab Runner,Gitlab CI中的相关概念以及.gitlab-ci.yml的常用配置。 那么,GitLab CI 是什么? GitLab CI 是GitLab内置的进行持续集成的工具,只需要在仓库根目录下创建.gitlab-ci.yml 文件,并配置GitLab Runner;每次提交的时候,…

Gerrit

开发、提交、push、入库流程: repo init -u ssh://gerrit帐号[ip:port/platform/manifest -b 分支名 repo sync -c -f --no-tags -j1 git commit git push origin HEAD:refs/for/分支名 有的可能是这样push的: git push ssh://usernameip:port/path…

CICD详解(八)——gitlab安装与配置

今天继续给大家介绍Linux运维相关知识,本文主要内容是gitlab的安装与配置。 一、安装环境准备 首先,我们先来安装一下Gitlab的依赖包,执行命令: yum install curl policycoreutils openssh-server openssh-clients postfix -y然…

CICD详解(九)——gitlab简单使用

今天继续给大家介绍Linux运维相关知识,本文主要内容是Gitlab简单使用。 一、Gitlab关闭自动注册 在企业生产环境中,我们一般由项目负责人负责创建用户并分配权限,一般禁止员工私自注册用户,以防给项目开发工作带来安全性上的风险…

GitLab -- 简单使用CICD功能

前提: 新建GitLab 项目,可参考我另一篇博客 GitLab -- 创建项目_DGH2430284817的博客-CSDN博客 安装配置好Runner,可参考我另一篇博客: GitLab -- 安装和配置Runner_DGH2430284817的博客-CSDN博客 创建.gitlab-ci.yml 文件&…

Git Gui

目录 1.什么是Git Gui 2. 什么是ssh key 3. git/github生成密钥并通过 第一步:本地电脑配置 1.配置用户名和邮箱(如果已经配置,就跳过) 2.检查下自己之前有没有已经生成ssh 3.生成(或删除)秘钥 第二步:远程git…

GitLab CI/CD artifacts 属性的配置与使用

😀最新最全的 GitLab CI/CD 全部关键词解析 请查阅该专栏 GitLab CI/CD 关键词 artifacts用于指定在job 成功或失败 时应附加到作业的文件和目录的列表。 作业完成后,工件将被发送到GitLab,并可在GitLab UI中下载 如 artifacts:paths 路径是相对于项目目录($CI_PROJECT…

CI环境搭建-创建git

添加如下配置: 上图说的需每次启动的即下面这个文件: 默认用户名、密码是admin/admin 创建代码仓库: 选择版本库: 使用方法: 1,创建一个文件夹 选择版本库地址: 也可以通过cmd命令来拉取代码&am…

CI持续集成环境搭建(3)--git的安装与搭建

https://blog.51cto.com/superleedo/2057841 1. 安装git *Note:不要用yum安装git, yum源安装git最新版本是1.8.3,该版本太老,之后用git commit 有可能会报错:git: ‘interpret-trailers’ is not a git command. See ‘git --he…

JS 是怎样运行起来的

这里填写标题 1. Js 是怎样运行起来的?1.1. 前言1.2. V8 引擎1.3. CPU 是如何执行机器指令的?1.4. CPU 执行机器指令的流程1.5. V8 引擎的编译流水线1.6. 完整的分析一段 JavaScript 代码是怎样被执行的1.6.1. 初始化基础环境1.6.2. 解析源码生成 AST 和作用域1.6.3. 依据 AS…

bootstrap+javascript制作体重标准计算器

一、表单编辑 使用bootstrap可以快速创建表单样式。needs-validation 可以验证表单,如果验证不通过,表单不会提交; onSubmit"return false;"使得表单提交不会刷新页面; 下方js代码是用来控制表单验证; &l…

如何白嫖world.js、china.js以及各个省的js和json文件

全是干货,看仔细了。 作者在工作中遇到了绘制世界地图的场景,但是由于现在echarts的官网已经不提供地图文件下载了。 所以需要自己找资源,在csdn中用积分下载的资源还是挺多的。 但是碍于个别同学没有积分或者喜欢白嫖,所以这里…

js中?.、??的具体用法

1、?. (可选链运算符) 在javascript中如果一个值为null、undefined,直接访问下面的属性, 会报 Uncaught TypeError: Cannot read properties of undefined 异常错误。 而在真实的项目中是会出现这种情况,有这个值就…

JS之BigNumber.js 讲解

JavaScript因为存在计算的精度问题,所以直接计算就可能会导致各种各样的bug,为了解决这个问题,就要使用BigNumber.js这个库。 至于为什么JavaScript会有精度问题呢,可以看https://github.com/camsong/blog/issues/9。简单来说就是因为:JavaScript中所有的数字(包括整数和…