网络知识 娱乐 基于GitLab的CI/CD系统重点记要

基于GitLab的CI/CD系统重点记要

{"data":{"title":"基于GitLab的CI/CD系统重点记要","abstract":"一、总体原理概述Gitlab是套功能完善的源码管理系统,平时用于公司内部各研发组的源码同步、问题跟踪、开发协同。Gitlab自带的CI/CD功能与Gitlab更简单、灵活的协同工作,也减小了日常维护的压力,因此,本文针对Gitlab的CI/CD功能做的要点分享。","cover":"https://p3.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/8a2711ab7d714524bc3dc9ce06a65dca","articleType":"article","itemId":"7112635903897534976","groupId":"7112635903897534976","groupSource":2,"isOriginal":true,"banComment":false,"publishTime":"2022-06-24 12:25","source":"键盘人字拖","tag":"technique","mediaSite":null,"pathname":"/article/7112635903897534976/","loginUserInfo":null,"favorite":false,"relation":{"isFollowing":false,"isFollowed":false},"likeData":{"userLikeStatus":0,"count":0},"isSelf":false,"content":"

一、总体原理概述

Gitlab是套功能完善的源码管理系统,平时用于公司内部各研发组的源码同步、问题跟踪、开发协同。Gitlab自带的CI/CD功能与Gitlab更简单、灵活的协同工作,也减小了日常维护的压力,因此,本文针对Gitlab的CI/CD功能做的要点分享。

基于GitLab的CI/CD系统由Gitlab与Gitlab-runner两个主要部分构成。

1.1、Gitlab部分

Gitlab源码库管理系统,提供基于Git的源码库管理、协作、权限等丰富的功能。

在Gitlab源码库的根目录中如果创建有`.gitlab-ci.yml`文件,相当于为当前源码库启用了CI/CD功能。

该文件用于控制CI/CD流程与行为,每次源码的提交、合并动作都会触发Gitlab执行当前操作分支上的该文件。

该文件中通过gitlab提供的关键字、预定义变量、脚本代码等等来规划pipeline和定义Job,实现依据条件控制不同Gitlab-Runner中的执行器进行需要动作,共同完成代码的编译、打包、发布等操作。

1.2、Gitlab-Runner部分

Gitlab-Runner运行在本地或远程目标机上的一个程序,作用是接收执行Gitlab的指令,比如编译、打包部署等等。

一个Gitlab可接入多个Gitlab-Runner,每个Runner可以注册多种相同或不同形式的“执行器”。

Runner与Gitlab联接需要通过Gitlab生成的Token,每个Runner对应且仅对应到一个唯一的Token。

二、关于Gitlab-Runner与执行器

Gitlab-Runner基于Go语言开发,可运行在多种系统平台。Gitlab-runner在Gitlab中有三种使用权限范围,第一种是全局共享,第二种是群组共享,第三种是项目特定。

  1. 全局共享Runner:可供Gitlab上的所有项目使用。用管理员账号登入Gitlab,在“管理中心"->“概览"->“Runner”页面中的“注册一个实例Runner”按钮可以生成与查看全局共享Runner的Token,用该Token接入的Runner则为全局共享。(注:一个Token只能用于一个Runner实例,可以使用“重置注册令牌”生成新的Token用于新的Runner实例。
  2. 群组共享Runner:可供关联组中的所有项目使用。进入Gitlab要操作的群组,“设置”-“CI/CD”页面中可以找到“群组Runner”,其中有群组Token或重生成新Token,用该Token接入的Runner则为该群组内项目可用的Runner。
  3. 项目特定Runner:仅可被该项目使用。进入Gitlab要操作的项目页面,“设置”-“CI/CD”页面中可以找到“Runner”,其中有项目Token或重生成新Token,用该Token接入的Runner则为仅该项目可用的Runner。

Gitlab-Runner的作用是接收Gitlab指令,并控制与管理“执行器”的程序。具体动作执行则是由Runner派生出的“执行器”这个逻辑模块来完成,Runner支持多种“执行器”形式,有Shell,有Docker等等。

Gitlab-Runner的安装有两种方式,一种是直接安装到原生系统,另一种是以Docker容器方式进行安装。Runner安装完成后,需要执行Runner中的注册命令,建立与Gitlab的关联。

在注册过程中需要填入Gitlab服务器地址、Gitlab提供的Token、执行器形式,以及不同执行器的配置等等。

三、Docker形式的执行器配置

将Runner以原生系统方式进行安装(也可以以Docker形式安装),并在Runner注册时选择Docker执行器形式。

在注册过程中会要求指定一个Docker Image,该Docker Image是默认用于执行指令的实体(即在`.gitlab-ci.yml`中未指定Image时默认使用,也可以在Job中明确指定其它的Docker Image)。Runner注册完成后会在`/etc/gitlab-runner`中生成一个`config.toml`文件,如要修改Runner配置,可重新注册(重新注册原配置不会删除,原注册的执行器还保持有效,需要在Gitlab端删除)或修改该文件。另外,一个Runner实例可以配置多个同类型或不同类型的执行器。

执行器是用于Job执行不同的指令,因此执行器的环境需要依据Job的具体要求进行配置,比如用于Java构建,则执行器环境中需要支持jdk、maven等指令。由于本篇用的是Docker形式的执行器,因此在指定的DockerImage中要安装好JDK与MAVEN包(注:为了更好的利用自建的DockerImage,需要创建一个Docker私服,可以用Harbor或Nexus3来实现自定义的Docker Image的管理)。

每个Job都会重新启动一个新的容器,并且会自动完成源码库的下载(放在启动容器的`/build`目录中),并且这个不要求执行器镜像支持Git(原理不清楚,有清楚的欢迎评论区指教!),如何在Job中禁止下载原码还需要再学习(有清楚的欢迎评论区指教!)。

以下是`config.toml`文件及主要字段说明:

concurrent = 1nncheck_interval = 0nn[session_server]nnsession_timeout = 1800nn[[runners]]nnname = "Lumlord154" # 执行器的名称,在Gitlab中会显示,用于标识与区分不同的执行器(在Gitlab中看到的是一个个Runner实例,可以理解为一个执行器被看成一个Runner实例,一个Gitlab-Runner程序可以有多个或多种执行器,即不同的Runner实例)nnurl = "http://122.112.150.154:9980/" # Gitlab服务器地址(注:最后面的斜杠是必须要的)nntoken = "oMZ82xXRXQZGdGxS-dbi" # Gitlab生成的Token(Gitlab上可以生成全局共享、群组共享、项目私有的Token)nnexecutor = "docker" # 执行器形式(有多种,如Shell,Docker等等)nnenvironment = ["DOCKER_AUTH_CONFIG={"auths":{"122.112.150.154:9901":{"auth":"d2lnYXRoZXI6d2lnYXRoZXI="}}}"] # 由于使用了自已的Docker私服,需要登录,在此设置登录私服务的账号与密码。(通过在命令行执行Docker login登入一次后,在 $USER_HOME/.docker/config.json中可以得到配置信息)nn[runners.custom_build_dir]nn[runners.cache]nn[runners.cache.s3]nn[runners.cache.gcs]nn[runners.cache.azure]nn[runners.docker]nntls_verify = false # 指明不使用httpsnnimage = "122.112.150.154:9901/docker/exector" # 指明执行器默认的用于执行指令的docker image。nnprivileged = true # 相当于在`docker run`中的`--privileged`选项,这个配置不仅会用于默认Docker Image的Run,也会应用于所有要在此Runner上Run的Docker镜像。nndisable_entrypoint_overwrite = falsennoom_kill_disable = falsenndisable_cache = falsennvolumes = ["/root/.m2:/root/.m2", "/root/.npm:/root/.npm", "/var/run/docker.sock:/var/run/docker.sock", "/cache"] # 这个配置指明在Run镜像时要加载的数据卷(或宿主目录),相当于`docker run`中的`-v`选项,需要说明的是不仅默认镜像,所有在此runner实例中加载的镜像都会使用这个配置,因此,可以利用这个来进行不同Job间的数据共享。这个配置中在所有启用的容器中都将/cache作为共享目录。nn# 其中"/var/run/docker.sock:/var/run/docker.sock",如果需要在该执行器控制Docker,比如下载与生成新的image,则必须设置。nnshm_size = 0

四、关于`.gitlab-ci.yml`

`.gitlab-ci.yml`文件必须在源码库的根目录中,该文件用于控制源码何时、何地、如何加工处理代码的配置脚本,并且需要符合`YAML`的格式与语法。

在该脚本中,通过`stages`关键字定义代码处理阶段,定义的上下顺序则是阶段执行次序。

stages: <- gitlab定义的关键字n - begin <- stage名称,只要不与关键字有重名就可n - mavenn - buildn - deploy

然后就是各种各样的JOB定义,在Job中需要指明哪个阶段执行,在哪个执行器运行,什么条件下执行,以及执行的具体动作。多个不同的JOB可以关联到同一个阶段,实现并发处理不同的事务。

begin_job: <- Job的名称,没有特别的约束,不重名,不与系统定义的关键字相同即可n stage: begin <- 关联到定义的stages,指定该Job将在哪个阶段执行nn tags: tt<- 指出当前Job将在哪个或哪些执行器上运行(注:Runner在注册好执行器后,在Gitlab端可为该“执行器”打上一个或多个Tag)n - java8-buildernn rules: tt<- 指出当前Job什么条件下才执行n - if: $CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "merge_request_event"nn script: tt<- 当前Job执行的脚本,该脚本将在关联的一个或多个执行器中运行。(由于本人用的执行器是Linux系统,因此脚本是基于Bash形式)n - echo "This is the master maven job"n - mvn -Dmaven.repo.local=$MAVEN_REPO clean package -Dmaven.test.skip=true

五、结语

Gitlab为CI/CD提供了平台与机制,在微服务、异构系统开发时代CI/CD已成为必不可少的效率工具,也可以说是软件自动化生产线,但要用好和维护好一套CI/CD,需要有丰富的研发经验与广泛的系统知识。

","imageList":[],"mediaInfo":{"userId":"MS4wLjABAAAAyZCGbsgHrHSh7kCmdMw85sbXufWc_Gk8lLb-dyuMOCk","unsafeUserId":"6482788721","name":"键盘人字拖","avatarUrl":"https://p26.toutiaoimg.com/origin/137240002ebabf0c16335","description":"","userVerified":1},"seoTDK":{"title":"基于GitLab的CI/CD系统重点记要-今日头条","description":"一、总体原理概述Gitlab是套功能完善的源码管理系统,平时用于公司内部各研发组的源码同步、问题跟踪、开发协同。Gitlab自带的CI/CD功能","keywords":"Git,Docker,Go语言,Java,脚本语言,人生第一份工作","publishTimestamp":"1656044733","modifiedTimestamp":"1656051817"},"logId":"202206241426510101290970270D8A525D","sylpageConfig":{"card":{"id":""}},"identity":{"web_id":"7111199547455817229","user_is_login":false},"abtestInfo":{"rsp_type":5,"version_name":"4252807,4164637","parameters":{"feat_repost_type":{"new":true},"home_nav_conf":{"dcd_out":1},"local_filter":{"core_filter":{"filter_list":{"ms::TicaiFilter":true}}},"page_upgrade":{"new_profile":true,"video_double_column":true},"sati":{"enable_ad_prime":true,"enable_sorter_optimus":true,"prime_rule_rank_version":"toutiao_web","use_toutiao_web_feed":true,"format_max_consecutive_middle":2,"format_max_consecutive_nogroups":3,"enable_reduce_nogroup":true},"seraph":{"score_rule":{"default":{"replace":{"group_util":"_CTR - 1000*dislike"}},"new_user":{"replace":{"group_util":"_CTR - 1000*dislike"}}}},"sort":{"allowed_ticai":["forum_post","pgc_text","pgc_video"]},"video_detail_page_upgrade":{"new_page":true}},"env_flag":0},"localCityInfo":{"name":"北京","code":"110000","channelId":3202164529},"showResearch":false}}