六大招式,修炼极狐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.7
-
-
stages:
-
- test
-
-
variables:
-
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
-
-
cache:
-
paths:
-
- .cache/pip/
-
# 已项目 id 区分 cache,如果不区分,就是全局 cache
-
key: $CI_PROJECT_ID
-
-
job1:
-
stage: test
-
script:
-
- pip install ansible==2.9.2
or
-
image: python:3.9.7
-
-
stages:
-
- test
-
-
cache:
-
paths:
-
- pip-cache
-
# 已项目 id 区分 cache,如果不区分,就是全局 cache
-
key: $CI_PROJECT_ID
-
-
before_script:
-
- export PIP_CACHE_DIR="pip-cache"
-
- mkdir -p pip-cache
-
-
job1:
-
stage: test
-
script:
-
- pip install ansible==2.9.2
nodejs cache
示例:
-
variables:
-
NPM_CONFIG_CACHE: npm_cache
-
NPM_CONFIG_REGISTRY: https://registry.npm.taobao.org
-
-
default:
-
cache:
-
paths:
-
- ${NPM_CONFIG_CACHE}
-
-
build:
-
stage: build
-
image: node:14-alpine
-
script:
-
- node -v
-
- npm -v
-
- npm ci
-
- npm run build
-
artifacts:
-
name: "build-package"
-
paths:
-
- dist
-
expire_in: 1 day
jave maven cache
-
build:
-
image: maven:3.8.5-jdk-11
-
stage: build
-
variables:
-
MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
-
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
-
cache:
-
paths:
-
- .m2/repository/
-
- target/
-
key: $CI_PROJECT_ID
-
script:
-
- mvn package
-
- ls -l target/*
使用 needs 改变多阶段执行顺序
默认情况下,同一阶段作业并行运行,不同阶段按顺序执行,存在排队等待时间,致使编译、测试时间被拉长。
我们可以使用 needs 参数改变多阶段执行顺序:Pipeline 定义阶段 Stages,如果全局未定 Stages,则按顺序运行 Build,Test,Deplo。Job 如果未设置 Stage,默认是 Test 阶段。
示例:
-
stages:
-
- build
-
- test
-
- deploy
-
-
build fontend:
-
stage: build
-
script:
-
- echo 'build fontend job'
-
-
build backend:
-
stage: build
-
script:
-
- echo 'build backend job'
-
-
test fontend:
-
stage: test
-
script:
-
- echo 'test fontend job'
-
needs: ["build fontend"]
-
-
test backend:
-
stage: test
-
script:
-
- echo 'test backend job'
-
needs: ["build backend"]
-
-
deploy fontend:
-
stage: deploy
-
script:
-
- echo 'deploy fontend job'
-
needs: ["test fontend"]
-
-
deploy backend:
-
stage: deploy
-
script:
-
- 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
-
- test
-
-
build job:
-
stage: build
-
script:
-
- echo 'build job'
-
-
test job:
-
stage: test
-
script:
-
- 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:
-
- build
-
-
variables:
-
PROJECTNAME: "test"
-
DOCKERHUB: "hub.leffss.com"
-
DOCKERHUBPROJECT: "library"
-
-
before_script:
-
- docker login ${DOCKERHUB} -u "${DOCKERHUBUSER}" -p "${DOCKERHUBPASS}"
-
-
after_script:
-
- docker logout ${DOCKERHUB}
-
-
job1:
-
stage: build
-
script:
-
- 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:
-
- test
-
-
job1:
-
stage: test
-
script:
-
- 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 效率优化六大招式,欢迎大家一起交流!
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiakckh
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
excel打印预览压线压字怎么办
PHP中文网 06-22