六大招式,修炼极狐GitLab CI/CD “快” 字诀

2023-11-11 19:10

本文主要是介绍六大招式,修炼极狐GitLab CI/CD “快” 字诀,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文来自:

李发富 极狐(GitLab) 高级技术支持工程师

众所周知,CI/CD 可以让我们更快、更高质量、更简单的交付软件。而现实中,你是否经常面临以下难点,导致 CI/CD 并没有真正发挥其优势:

从网络安装项目依赖耗时长?

前后端项目未分离,

导致编译、部署及测试效率低?

随着项目增多,多任务 Pipeline 运行慢?

不必要 Job 运行占用了资源和时间?

针对以上问题,我总结了六大招式,希望帮助大家在使用极狐GitLab 时候提升 CI/CD 效率,供参考。

使用 cache


在运行项目编译时,可能会安装项目依赖,如果每次都从网络安装,会浪费很多时间。这时候可以使用 cache 功能提供缓存,减少依赖安装时间。

【前提】runner 开启 cache 功能:Advanced configuration | GitLab

python cache

示例:

image: python:3.9.7stages:- testvariables:PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"cache:paths:- .cache/pip/# 已项目 id 区分 cache,如果不区分,就是全局 cachekey: $CI_PROJECT_IDjob1:stage: testscript:- pip install ansible==2.9.2

or

image: python:3.9.7stages:- testcache:paths:- pip-cache# 已项目 id 区分 cache,如果不区分,就是全局 cachekey: $CI_PROJECT_IDbefore_script:- export PIP_CACHE_DIR="pip-cache"- mkdir -p pip-cachejob1:stage: testscript:- pip install ansible==2.9.2

nodejs cache

示例:

variables:NPM_CONFIG_CACHE: npm_cacheNPM_CONFIG_REGISTRY: https://registry.npm.taobao.orgdefault:cache:paths:- ${NPM_CONFIG_CACHE}build:stage: buildimage: node:14-alpinescript:- node -v- npm -v- npm ci- npm run buildartifacts:name: "build-package"paths:- distexpire_in: 1 day

jave maven cache

build:image: maven:3.8.5-jdk-11stage: buildvariables:MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"cache:paths:- .m2/repository/- target/key: $CI_PROJECT_IDscript:- mvn package- ls -l target/*

使用 needs 改变多阶段执行顺序


默认情况下,同一阶段作业并行运行,不同阶段按顺序执行,存在排队等待时间,致使编译、测试时间被拉长。

我们可以使用 needs 参数改变多阶段执行顺序:Pipeline 定义阶段 Stages,如果全局未定 Stages,则按顺序运行 Build,Test,Deplo。Job 如果未设置 Stage,默认是 Test 阶段。

示例:

stages:- build- test- deploybuild fontend:stage: buildscript:- echo 'build fontend job'build backend:stage: buildscript:- echo 'build backend job'test fontend:stage: testscript:- echo 'test fontend job'needs: ["build fontend"]test backend:stage: testscript:- echo 'test backend job'needs: ["build backend"]deploy fontend:stage: deployscript:- echo 'deploy fontend job'needs: ["test fontend"]deploy backend:stage: deployscript:- echo 'deploy backend job'needs: ["test backend"]

使用 needs 参数后:对于前端任务,build fontend 完成后会立即执行下一个阶段的 test fontend,不管 build backend 是否完成。后端的 build backend 任务一样类似。

Web 界面中还可以查看 needs 依赖关系:

使用 rules 减少不必要 Job 运行


很多人会把前后端一起打包和部署,但其实只有前端代码有变化,针对后端的 Job 测试是多余的。因此,可以使用 rules 规则跳过某些不必要 Job。

示例:

stages:- build- testbuild job:stage: buildscript:- echo 'build job'test job:stage: testscript: - echo 'test job'rules:- changes:- backend/*

  • 当 backend 中有变化时运行 test job;

  • 也可以使用类似的 only: changes 实现。

安装依赖使用国内源


由于国内网络的原因,如果使用默认源的话,安装依赖可能会很慢甚至失败,这时候可以设置国内或者代理解决。

nodejs

npm install --registry=https://registry.npm.taobao.org

or

yarn config set registry 'https://registry.npm.taobao.org'

python

pip install --trusted-host mirrors.aliyun.com -i https://mirrors.aliyun.com/pypi/simple -r requirements.txt

ruby

gem sources --remove https://rubygems.org/
gem sources -a https://gems.ruby-china.com
gem sources –l

golang

go env -w GOPROXY=https://goproxy.cn,direct

设置 GOPRIVATE 来跳过私有库,比如常用的 GitLab,中间使用逗号分隔:

go env -w GOPRIVATE=*.gitlab.com

Docker 镜像优化


Docker 过大,会造成镜像拉取时间过长,影响 CD 速度。

Docker 镜像体积优化

尽量优化减小 Docker 镜像大小。

1. 使用Alpine Linux

Alpine Linux 是一个基于 BusyBox 和 Musl Libc 的 Linux 发行版,其最大的优势就是小。一个纯的基础 Alpine Docker 镜像在压缩后仅有 2.67MB。并且不少 Docker 官方镜像都有 Alpine 版本,比如:python:3.9.12-alpine3.15、ruby:2.7.5-alpine3.15 等。

2. 安装最少依赖

如果不是必须,不要安装 vi,wget,curl,ping 等工具。

3. 合并 RUN 指令到一行

Dockerfile 中尽量合并多条指令:

...
RUN echo 1 \&& echo 2
...

4. 多阶段构建

在 Docker 17.05 版本以后,新引入了 multi-stage builds 这一概念,这将会极大地减小镜像大小。

简单来说,multi-stage builds 支持我们将 Docker 镜像的编译分成多个 “阶段”。比如常见的软件编译的情况,我们可以将编译阶段单独提出来,软件编译完成后直接将二进制文件拷贝到一个新的基础镜像中,这样做最大的好处就是,第二个镜像不再包含任何编译阶段使用的中间依赖,干干净净明明白白。

具体使用方法:Dockerfile 多阶段构建 - leffss - 博客园 (cnblogs.com) 

更多 Dockerfile 最佳实践参考:Best practices for writing Dockerfiles | Docker Documentation

使用自建 Docker Hub 镜像仓库

默认情况下,Docker 使用 Docker Hub 的镜像,网络传输较慢。可以搭建本地 Hub 仓库:安装 harbor v2.3.4 - leffss - 博客园 (cnblogs.com) ,加速镜像的 pull 与 push。

Pipeline 中使用本地仓库:

stages:- buildvariables:PROJECTNAME: "test"DOCKERHUB: "hub.leffss.com"DOCKERHUBPROJECT: "library"before_script:- docker login ${DOCKERHUB} -u "${DOCKERHUBUSER}" -p "${DOCKERHUBPASS}"after_script:- docker logout ${DOCKERHUB}job1:stage: buildscript:- docker build --cache-from ${DOCKERHUB}/${DOCKERHUBPROJECT}/${PROJECTNAME}:latest -t ${DOCKERHUB}/${DOCKERHUBPROJECT}/${PROJECTNAME}:${CI_COMMIT_TAG} -t ${DOCKERHUB}/${DOCKERHUBPROJECT}/${PROJECTNAME}:latest .- docker images- docker push ${DOCKERHUB}/${DOCKERHUBPROJECT}/${PROJECTNAME}:${CI_COMMIT_TAG}- docker push ${DOCKERHUB}/${DOCKERHUBPROJECT}/${PROJECTNAME}:latest

在有了本地 Hub 仓库的情况下,还可以根据本章节【Docker 镜像体积优化】的原则自行打包一些项目编译需要用到的基础镜像,把项目需要用到的基础依赖包或者工具提前打包进去,这样又可以减少 Pipeline 安装依赖的时间。

优化 runner


当项目较多时,CI/CD 任务也会增多,这时候运行 Pipeline 效率会降低。极狐GitLab 提供共享 runner 给所有项目 CI/CD 任务使用,这里分享两种优化方式:

使用 Tag 标记 runner

在 runner 编辑页面设置 Tags,并且不勾选 Run untagged jobs,这时候此 runner 只运行使用 Tag 选择器的 Job,这样优化 runner 占用率.

示例:

stages:- testjob1:stage: testscript: - echo 'job1'tag:- "docker"

为项目注册专用 runner

点击具体项目,然后在 settings -> CI/CD - Expand 中查看项目 runner 注册用的地址和 token,然后再按照官方文档注册 runner:Registering runners | GitLab 即可。

注册完成后,这个 runner 只会运行当前项目的 Job。

使用 k8s 运行 runner

将 runner 安装到 Kubernetes 集群中来,并且使用 Kubernetes  executor,这样子运行 Job 时可以动态的申请集群资源,可以有效避免资源不足的情况。

安装方式参考:使用 K3s 来安装和运行极狐GitLab runner_哔哩哔哩_bilibili 或者 GitLab Runner Helm Chart | GitLab 。

监控 runner 资源占用

通过集成的 gitlab runner prometheus metrics 监控 runner 状态,确保 runner 的正常稳定运行。

以上,就是我基于实践经验总结的 CI/CD 效率优化六大招式,欢迎大家一起交流!

这篇关于六大招式,修炼极狐GitLab CI/CD “快” 字诀的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/392241

相关文章

如何使用Ansible实现CI/CD流水线的自动化

如何使用Ansible实现CI/CD流水线的自动化 持续集成(CI)和持续交付(CD)是现代软件开发过程中的核心实践,它们帮助团队更快地交付高质量的软件。Ansible,作为一个强大的自动化工具,可以在CI/CD流水线中发挥关键作用。本文将详细介绍如何使用Ansible实现CI/CD流水线的自动化,包括设计流水线的结构、配置管理、自动化测试、部署、以及集成Ansible与CI/CD工具(如Jen

JavaScript正则表达式六大利器:`test`、`exec`、`match`、`matchAll`、`search`与`replace`详解及对比

在JavaScript中,正则表达式(Regular Expression)是一种用于文本搜索、替换、匹配和验证的强大工具。本文将深入解析与正则表达式相关的几个主要执行方法:test、exec、match、matchAll、search和replace,并对它们进行对比,帮助开发者更好地理解这些方法的使用场景和差异。 正则表达式基础 在深入解析方法之前,先简要回顾一下正则表达式的基础知识。正则

Gerrit与Gitlab同步配置replication其他配置

一、Gerrit与Gitlab同步配置 当配置好gerrit环境后,还需要与现有gitlab库进行同步配置,否则会影响现有开发与打包流程。 1.安装gerrit replication插件 unzip gerrit.warcp WEB-INF/plugins/replication.jar ~/temp/ssh -p 29418 admin@172.19.16.64 gerrit plu

git命令上传代码到gitHub、gitLab

1 、输入git账号和密码 git config --global user.name"git账号" git config --global user.name"密码" 2.添加要上传的SSH (如果你的文件已经有了SSH,删除本身有的)git remote rm origin 添加 git remote add origin SSH或http 3 添加本地的所有文件  git ad

【gitlab 上传代码】gitlab 推送本地代码到远程仓库

1、安装git。 2、新建项目,只勾选私有,或者公开,注意不要勾选readme 3、添加和配置SSH公钥 cd ~/.ssh如果提示 “ No such file or directory”,手动的创建一个 .ssh文件夹即可mkdir ~/.sshgit config --global user.name "赖德发"git config --global user.email "lai

828华为云征文|华为云Flexus X实例docker部署最新gitlab社区版,搭建自己的私人代码仓库

828华为云征文|华为云Flexus X实例docker部署最新gitlab社区版,搭建自己的私人代码仓库 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新

k8s集群本地搭建,使用gitlab、harbor、jenkens、cicd来实现devops自动化构建

k8s集群本地搭建 准备:一台windows即可我windows内存是32gb的,6核,每核2线程全程使用终端 ssh命令操作.我是直接用的mac点操作windows,然后windows连接虚拟机即可.虚拟机记得改网卡,这样才能保证以后ip不变.介绍:k8s集群本地搭建(1master、2node)k8x运用devops来自动化构建服务(gitlab、harbor、jenkens、cicd)简介

《程序员修炼之道》读书笔记(8):注重实效的项目

第8章:注重实效的项目 随着项目开动,我们需要从个体的哲学与编码问题,转向为项目级别的问题。 本章将讨论影响项目成败的几个关键区域。 41《注重实效的团队》 本书在先前讨论了帮助程序员个体更好的方法,这些方法对团队也有效。 下面将针对团队,来重述前面部分章节。 不要留破窗户。团队不应该容忍那些小小的、无人修正的不完美。煮青蛙。团队更容易被煮熟,因为每个人都觉得别人会在监视环境的变化。交流

三十分钟完成 Gitlab 搭建安装指南(支持 HTTPS 访问)

背景 由于我们早期使用 phabricator 进行代码管理,但是在使用的过程当中发现和社区的 github 使用方式有些不同,所以为了让大伙都习惯 github 社区相同的使用风格,所以我们换成了 gitlab 作为公司内部的代码管理系统;并且其强大的 CI/CD 的方式为后续的持续集成工作打下基础。 注意 Gitlab 分为 社区版 (gitlab-ce) 与 企业版 (gitlab-ee)

gitlab结合docker实现CI/CD

gitlab的continue integration 和 continue delivery,因为高可用尚未实现暂时不做continue deployment 1.部署gitlab-runner 官网:https://docs.gitlab.com/runner/install/docker.html centos7下docker部署方式。 docker run -d -