基于GitLab构建企业级CICD-Gitlab-Runner

8 篇文章 0 订阅
2 篇文章 0 订阅

背景

  • 在过往企业开发中,大部分企业从开发到测试,到部署目前还是手工进行
  • 在一些某些中大型企业中,目前构建及部署还是直接使用二进制包部署,或直接单机运行
  • 在某些场合下,仓库中代码的编译需要硬件支持,致使本地无法编辑及运行
  • 在某些场合下,我们希望根据不同的用户需求部署到不同集群环境中,以实现资源的合理分配
  • 在某些时候,用户编译及部署是一项枯燥的工作,我们希望能实现开发工程师无感知的配置代码仓库中的配置文件即可

愿景

  • 简化开发上线流程
  • 提供基于细粒度的镜像版本构建,做到业务的滚动升级,无覆盖
  • 提供上线前自动化测试用户验证
  • 提供k8s集群化部署方案或轻量级集群部署(多集群管理,GPU集群,普通CPU集群)
  • 提供CICD流程化日志查询
  • 提供CICD简单化配置即可自动运行
  • 提供CICD消息通知(Webhook, 邮件通知)

目标

  • 简单配置
  • 自动触发CI
  • 自动测试
  • 自动构建镜像
  • 自动部署
  • 自动消息通知

组件介绍

Rancher

  • k8s集群管理工具,提供多集群管理工具,内置商店可以实现多场景应用部署

GitLab

  • 代码仓库,用户记录代码历史,jeckins将根据代码仓库的commit变化,进行Pipeline 流程

GitLab-Runner

  • 为Pipeline流水线提供运行Runner
  • 在实际环境中可以分类,例如Cpu-runner,Gpu-runner

Harbor

  • 镜像仓库,主要用户镜像存储

K8s

  • docker容器化编排技术,实现多节点管理与部署

k3s

  • 同上,但是以轻量方式,单进程服务跑完所有k8s依赖的组件,功能与k8s一样

环境准备

  • 本次测试以最小化部署来实现,简化流程,所以集群会有两个
  1. k3s部署的最小化单节点集群(可多节点)
  2. k8s部署的8节点集群
  • Gitlab自行构建
  • Harbor镜像仓库自行构建

获取Gitlab Runner注册令牌在这里插入图片描述

  • 获取图片中api地址,后面会用到
  • 获取图片中api另外,后面会用到

安装Gitlab-Runner

  • docker-compose 配置文件
version: "3"
services:
  runner:
    image: gitlab/gitlab-runner:latest
    container_name: gitlab-runner
    restart: always
    volumes:
      - /srv/gitlab-runner/config:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/.kube/config:/root/.kube/config
      - /etc/docker/daemon.json:/etc/docker/daemon.json
      - /usr/bin/docker:/usr/bin/docker
  • 运行runner,并注册runner到Gitlab中
command=$1
#
url="http://git.xxxxx.cn/"
token="aaaaaaaaaaaaaaaaaaaa"
# 修改下面两项
tag="global-runner,ALP,ARD,CPU"
description="ARD-ALP-Normal-runner"

if [ "$command" = "register" ]; then
  echo "注册服务中..."
  docker run --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \
    --non-interactive \
    --executor "docker" \
    --docker-image alpine:latest \
    --url $url \
    --registration-token $token \
    --description $description \
    --tag-list $tag \
    --run-untagged="true" \
    --locked="false" \
    --access-level="not_protected"
fi

  • 编辑挂载目录下的/srv/gitlab-runner/config/config.toml文件
concurrent = 1
check_interval = 0
shutdown_timeout = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "ARD-ALP-Normal-runner" # Runner名称
  url = "http://git.xxxxxx.cn/"  # Gitlab Api地址
  id = 2389 # runner id 由register生成
  token = "aaaaaaaaaaaaaaaaaa" # Gitlab Api令牌
  token_obtained_at = 2022-12-26T15:21:24Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "docker" # 执行器docker
  [runners.custom_build_dir]
  [runners.cache]
    MaxUploadedArchiveSize = 0
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false # 是否进行ssl认证
    image = "docker:latest" # 默认使用的镜像
    privileged = false # 是否特权启动
    disable_entrypoint_overwrite = false
    oom_kill_disable = false 
    disable_cache = false # volumes 数据挂载,将宿主机docker配置信息,k8s配置信息一起挂载进去,保证执行CICD过程无需在仓库暴露认证信息
    volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock","/usr/bin/docker:/usr/bin/docker","/root/.docker/config.json:/root/.docker/config.json","/root/.kube/config:/root/.kube/config"]
    shm_size = 0
  • 查看runner
    在这里插入图片描述

Demo

  • 在项目中构建如何下文件.gitlab.ci.yml

项目中请自行准备Dockerfile与k8s deployment.yaml

variables: # 定义全局可以使用的变量
  image_name: harbor.uat.xxxxxx.cc/library/enflame.cn/topsmodel-db

stages: # 定义三个阶段
  - Build
  - Test
  - Deploy

Image Build: # 构建阶段-镜像打包
  stage: Build
  script:
    - docker build -t $image_name:$CI_COMMIT_SHA . # 无需关心harbor,因为密钥已挂载到容器中,可以拉取

Image Push: # 构建阶段-推送仓库
  stage: Build
  script:
    - docker push $image_name:$CI_COMMIT_SHA  # 无需关心harbor,因为密钥已挂载到容器中,可以推送

Deploy K8s: # 构建阶段-k8s部署
  stage: Deploy
  image: roffe/kubectl # 使用kubectl镜像,因为附带了client工具,注意kube/config文件已挂载进容器
  when: manual # 表示手动执行
  script:
    - sed -i "s#{CICD_IMAGE}#$image_name:$CI_COMMIT_SHA#g" ./deployment.yaml # 全局修改配置文件,进行替换
    - echo ./deployment.yaml
    - kubectl apply -f deployment.yaml # 更新到集群中


  • 提交仓库并查询仓库变化
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Gitlab-CICD可以使用的系统环境变量

变量描述
CI指定作业在CI环境中完成。
CI_COMMIT_REF_NAME为项目构建定义分支或标记名称。
CI_COMMIT_REF_SLUG它使用小写的
CI_COMMIT_SHA指定构建项目的提交修订
CI_COMMIT_TAG它提交标签名称
CI_CONFIG_PATH指定CI配置文件的路径
CI_DEBUG_TRACE它启用调试跟踪。
CI_ENVIRONMENT_NAME定义作业的环境名称。
CI_ENVIRONMENT_SLUG它是一个环境名称,适用于DNS,URL,Kubernetes标签等。
CI_ENVIRONMENT_URL定义作业的环境URL。
CI_JOB_ID表示GitLab
CI_JOB_MANUAL它指定作业已经手动启动。
CI_JOB_NAME作业名称在
CI_JOB_STAGEstage名称在
CI_JOB_TOKEN该标记用于在涉及触发器时用GitLab
CI_REPOSITORY_URL它指定了克隆Git存储库的URL
CI_RUNNER_DESCRIPTION它指定runner的描述。
CI_RUNNER_ID它为正在使用的runner提供了唯一的身份证。
CI_RUNNER_TAGS它定义了
CI_RUNNER_VERSION它指定当前作业的GitLab
CI_RUNNER_REVISION它指定了当前作业的GitLab修订版本。
CI_PIPELINE_ID它提供了当前管道的唯一ID。
CI_PIPELINE_SOURCE它通过使用push,web,trigger,schedule,api,pipeline等选项来指定流水线的触发方式。
CI_PIPELINE_TRIGGERED它指定作业已被触发。
CI_PIPELINE_SOURCE它指定了诸如push,web,trigger,schedule,api,external之类的管道源。
CI_PROJECT_DIR它定义了克隆存储库的完整路径,作业运行的地方。
CI_PROJECT_ID它提供了当前项目的唯一ID。
CI_PROJECT_NAME它提供当前项目的名称。
CI_PROJECT_PATH它提供了项目名称以及命名空间。
CI_PROJECT_URL它提供了http地址来检索项目。
CI_PROJECT_VISIBILITY它规定了项目的可见性,无论是内部的,私人的还是公共的。
CI_REGISTRY0
CI_REGISTRY_IMAGE它只有在启用容器注册表的情况下才返回与特定项目绑定的GitLab
CI_REGISTRY_PASSWORD密码可用于将容器推送到GitLab容器注册表。
CI_REGISTRY_USER用户名可以用来将容器推送到GitLab容器注册表。
CI_SERVER它指定作业在CI环境中执行。
CI_SERVER_NAME它提供CI服务器名称来协调作业。
CI_SERVER_REVISION它用于通过使用GitLab修订来安排作业。
CI_SERVER_VERSION它用于通过使用GitLab版本来安排作业。
CI_SHARED_ENVIRONMENT它表明作业在共享环境中执行,并且如果环境共享,则它被设置为true。
ARTIFACT_DOWNLOAD_ATTEMPTS它指定尝试下载运行作业的工件的次数。
GET_SOURCES_ATTEMPTS它指定了获取源运行作业的尝试次数。
GITLAB_CIall
GITLAB_USER_ID它指定正在运行作业的GitLab用户的ID。
GITLAB_USER_EMAIL它指定正在运行作业的GitLab用户的电子邮件。
GITLAB_USER_LOGIN它指定正在运行作业的GitLab用户的登录用户名。
GITLAB_USER_NAME它指定了正在运行作业的GitLab用户的真实姓名。
GITLAB_FEATURES它提供了GitLab实例和计划的许可功能列表。
RESTORE_CACHE_ATTEMPTS它定义了恢复执行作业的缓存尝试次数。
CI_DISPOSABLE_ENVIRONMENT它表明工作是在一次性环境中执行的,如果环境是一次性的,则它被设置为true。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值