首页 > 其他分享 >gitlab CI实践

gitlab CI实践

时间:2024-06-05 23:31:22浏览次数:28  
标签:CI usm gitlab 实践 构建 front 64 产物

1. 概念

每个工程里可编写.gitlab-ci.yml, 对应一个流水线(pipeline),流水线分不同阶段(stage),每个阶段包含不同作业(job)

每个作业有产物(artifacts)

默认情况下,后期阶段的作业会自动下载早期阶段作业创建的所有产物。可以使用 dependencies控制作业中的产物下载行为,只取部分产物。使用 needs 关键字时,作业只能从 needs 配置中定义的作业下载产物。

2. 多工程构建 - 产物依赖

多工程构建,如果一个工程依赖另外一个工程,比如usm-electron-client依赖usm-front生成的js、css、html等文件,

usm-electron-client的配置可以这样写:依赖usm/usm-front工程,build_usm_front这个作业,分支为$CI_COMMIT_BRANCH(当前usm-electron-client提交分支,这样写表示usm-front也需要有相应分支),分支得是分支名或者tag,不能是hash。

needs:
  - project: usm/usm-front
    job: build_usm_front
    ref: $CI_COMMIT_BRANCH
    artifacts: true

而usm_front的配置可这样写:

build_usm_front:
  image: openeuler/openeuler:20.03-lts—sp3-x86_64
  stage: build
  script:
    - yarn build
  tags:
    - x86_64, ssd
  artifacts:
    paths:
      - dist/
    expire_in: 5 day

trigger:
  stage: deploy
  variables:
    UPSTREAM_BRANCH: $CI_COMMIT_BRANCH
  trigger:
    project: usm/usm-electron-client
    branch: $CI_COMMIT_BRANCH
  when: manual

build_usm_front作业构建前端产物,trigger作业触发usm-electron-client工程,使用的分支为usm_front一样的提交分支。注意其实不用写触发,下游的项目同样可以从上游拿产物。只不过如果从上游工程构建,然后再构建下游工程,上游的产物一定会有。而如果直接从下游构建,可能存在上游项目的产物不存在的情况,比如上游分支不存在、没有构建、构建失败没有生产产物等。

实践中,我们的产物一般设置为多少天过期,下游来取的时候不一定能拿到,所以这种情况可以在工程勾选"Keep artifacts from most recent Successful jobs More information ”,这样即时设置了产物过期,也不会清理最新的产物,保证下游始终能取到。

或者更严谨一点,可以专门设置一个阶段,收到之前阶段的产物后,如果发现有生产tag,才上传产物,并且设置为永不过期。

注意:使用needs取其他工程是gitlab收费特性,要premium版本。同时较新的gitlab版本中,想取另外一个工程的产物,还需要去CI配置中设置哪些工程可以取本工程的产物。

3. 三方包管理

构建中往往要依赖其他三方组件、库、包等二进制文件,推荐使用minio(类似S3的对象存储)来管理,建立一个bucket,分门别类地存放这类文件,构建时下载使用。这类文件可以从互联网中下载,往往也没有包管理可以管理它们(比如C/C++的包)。当然现代语言的包还是推荐用包管理来做,比如nodejs、golang等。

4. 关于gitlab cache

在使用硬盘而非ssd的情况下,很多时候没有太大用处,瓶颈在于磁盘IO,特别是像前端/nodejs这样的有几万个小文件,而gitlab即使把缓存放在runner所在的机器作为一个zip(共享cache还是放在服务器上先下一次),unzip的速度依然很慢,实际缓存node_ modules测试下来,有很大的额外花销(overhead),甚至还不如自己把zip放在服务器上,下载下来解压缩

5. 变量

对于环境变量可使用 https://docs.gitlab.com/ee/ci/variables/#define-a-cicd-variable-in-the-gitlab-ciyml-file ,用variables关键字,而不是在作用中比如shell用export,cmd里用set来设置环境变量

6. 基于产物的构建

总的来说,像gitlab这样的系统构建还是基于任务的,而不是基于产物的

基于任务就是你告诉构建系统1做什么,2做什么,3做什么

而基于产物就是你告诉系统你的输入(依赖库、其他产物)是什么,你希望产物是什么

关于这个 可以去看 google software 中关于基于产物与基于任务的介绍

像这样基于任务的构建系统,缺点在于你构建时,你不确定你的依赖库变没有(尤其是大型工程),你只有老老实实的全量编译,造成改一点代码构建要很久

但其实我们可以把这个用在平时的非正式构建上

例如下面的例子 install_x86_64_debug这个作业,扩展了install_x86_64作业,它只依赖默认分支的tar_x86_64 与 generate_config_x86_64 这两个作业的产物,只要只两个产物是之前在默认分支构建过的,

就可以构建它

这样在平时的测试、调试中,我们只需专注 install_x86_64本身改动的逻辑,做到增量构建,不用每次都去构建上游tar_x86_64 与 generate_config_x86_64 这两个作业

标签:CI,usm,gitlab,实践,构建,front,64,产物
From: https://blog.csdn.net/ppxo123/article/details/139425532

相关文章

  • [email protected]: Permission denied (publickey)
    输入ssh-keygen-trsa-C"[email protected]"   [email protected]的邮箱 一直回车,直到看到  然后到这个路径下打开文件  将里面的内容复制到git帐号的ssh中 ......
  • Gitlab 配置LDAP身份认证
     vi /etc/gitlab/gitlab.rbgitlab_rails['ldap_enabled']=truegitlab_rails['ldap_servers']=YAML.load<<-'EOS'main:#'main'istheGitLab'providerID'ofthisLDAPserverlabel:'LDA......
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk
    [CISCN2019华北赛区Day1Web5]CyberPunk在源代码中发现提示可能存在文件包含,并且还有search.php,change.php,delete.php这三个文件,通过php伪协议进行读取?file=php://filter/convert.base64-encode/resource=index.php?file=php://filter/convert.base64-encode/resource=sear......
  • 云原生时代:从 Jenkins 到 Argo Workflows,构建高效 CI Pipeline
    作者:蔡靖ArgoWorkflowsArgoWorkflows[1]是用于在Kubernetes上编排Job的开源的云原生工作流引擎。可以轻松自动化和管理Kubernetes上的复杂工作流程。适用于各种场景,包括定时任务、机器学习、ETL和数据分析、模型训练、数据流pipline、CI/CD等。KubernetesJobs......
  • P7860 [COCI2015-2016#2] ARTUR
    原题链接教训1.计算几何,能用乘法就不用除法2.计算几何,开longlong3.计算几何,注意直线的特殊性code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;structnode{llx1,y1,x2,y2;}sk[5005];intcheck(nodea,nodeb){if(a.x2<b.x1||a.x1>b.......
  • 图像检索实践
    1、Related_functions.pyimporttorchfromtorchvisionimportmodels,transformsfromPILimportImageimportosimportnumpyasnpimportwarningswarnings.filterwarnings("ignore",category=Warning)defget_feature(image_dir):vgg_model=......
  • Samza在企业级应用中的最佳实践
    Samza在企业级应用中的最佳实践作者:禅与计算机程序设计艺术/ZenandtheArtofComputerProgramming1.背景介绍1.1大数据处理的挑战在当今大数据时代,企业面临着海量数据的采集、存储、处理和分析等一系列挑战。传统的批处理模式已经无法满足实时性要求,流式数据......
  • Python深度学习实践:自动编码器在数据降维中的应用
    Python深度学习实践:自动编码器在数据降维中的应用1.背景介绍在现代数据科学和机器学习领域中,高维数据处理是一个常见的挑战。许多真实世界的数据集包含大量的特征,这些特征往往存在高度的冗余和噪声。高维数据不仅增加了计算复杂性,还容易导致维数灾难(curseofdimensio......
  • 【计算机网络】P2 计算机网络体系结构基本概念,涉及分层的基本术语、SDU、PCI 与 PDU
    目录概述分层的基本元组基本术语SDU、PCI以及PDU层次结构含义概述在两个系统中实体间的通信是一个很复杂的过程。而为了降低协议设计以及调试过程的复杂性,同时便于对网络进行研究、实现和维护,促进标准化工作,通常对计算机网络的体系结构以分层的方式进行建模。我们......
  • Grafana监控系统的构建与实践
    本文深入探讨了Grafana的核心技术、数据源集成、仪表盘与可视化构建以及监控与告警配置,旨在为专业从业者提供全面的Grafana技术指南。关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复......