基本概念
.gitlab-ci.yml
- 即gitlab cicd的配置文件
- 在项目根目录下配置.gitlab-ci.yml文件,可以控制ci流程的不同阶段
- CI的阶段主要分为安装(install)/检查(eslint)/编译(build)/部署(deploy)
- gitlab平台会扫描.gitlab-ci.yml文件,并据此处理ci流程
- 在每次团队成员push/merge后触发,gitlab-ci检查项目下有没有.gitlab-ci.yml文件,如果有则会执行设置的脚本内容,并完整地走一遍流程
Pipleline
- 即流水线
- Pipeline是Gitlab根据项目的.gitlab-ci.yml文件执行的流程,它由许多个任务节点组成, 而这些Pipeline上的每一个任务节点,都是一个独立的Job
- 每个Job都会配置一个stage属性,来表示这个Job所处的阶段
- 一个Pipleline有若干个stage,每个stage上有至少一个Job
Runner
- 运行流水线的执行机,用于拉起执行容器进行job的作业
- 在特定机器上根据项目的.gitlab-ci.yml文件,对项目执行pipeline的程序
- 分为 Specific Runner 和 Shared Runner两种类型
- Specific Runner:指定Runner,私有项目使用的,无运行时间限制,因此我们后续默认使用此类型Runner
- Shared Runner:共享Runner
- Gitlab平台提供的免费使用的runner程序,它由Google云平台提供支持,每个开发团队有十几个。对于公共开源项目是免费使用的,如果是私人项目则有每月2000分钟的CI时间上限
步骤
前提
gitlab版本
- 最低版本要求:11.3
- 登录gitlab
- 点击【帮助】,在内容中可以查看到当前版本
gitllab项目开启CICD
- gitlab新增的项目已默认开启CICD
- 如果CICD项目默认关闭,需要使用以下步骤开启
- 登录Gitlab-进入项目
- 点击设置-通用,点击展开【可见性,项目功能,权限】
- 在【仓库】下确保【CI/CD】的开关处于打开状态
准备Executor
executor选择
- 可以理解为gitlba-runner以什么平台/方式运行,这个平台/方式就是"Executor”
- 当前案例,executor选项为Docker
- executor选择参考表
- 准备一台安装了Docker的Linux执行机
拉取gitlab-runner镜像
- 登录dockerhub(需要代理上网),搜索【gitlab/gitlab-runner】,查看最新的稳定版tag(不选择bleeding后缀的版本,不稳定),如v16.6.2
- 不建议使用latest,不利于版本控制和更新
创建Runner容器
- gitlab-runner是根据tag触发执行的,因此需要先确定项目tag,如main
- 创建数据存储路径和compose路径
# 创建Runner数据存储路径
mkdir -p /data/gitlab/runner/main
# 创建Runner的compose路径
mkdir -p /data/gitlab/compose/main
# 创建docker-compose.yaml文件到Runner的compose目录
cd /data/gitlab/compose/main && touch docker-compose.yaml
docker network create --driver bridge --subnet 172.19.0.0/16 --gateway 172.19.0.1 server
version: "3.0"
services:
runner:
image: gitlab/gitlab-runner:v16.6.2
# 需要增加伪终端,不然无限重启
tty: true
container_name: runner-main
restart: unless-stopped
privileged: true
hostname: 'runner-main'
# 设置自定义域名解析
extra_hosts:
- "test.gitlab.com:192.168.1.2"
environment:
- TZ=Asia/Shanghai
ports:
- '2100:22'
volumes:
- "/data/gitlab/runner/main:/etc/gitlab-runner"
- "/var/run/docker.sock:/var/run/docker.sock"
networks:
server:
ipv4_address: "172.19.0.2" # 指定容器静态IP
networks:
server: # 此处使用已存在的网络,实际使用中需要根据情况修改
external: true
cd /data/gitlab/compose/main && docker compose up -d
Gitlab上注册Runner
权限检查
- 登录gitlab,进入到需要使用cicd的项目
- 检查自身账户在此项目的的权限,请确保权限大于等于Maintainer
- 在【设置】-【CI/CD】-【Runner】-【指定Runner】,获取token和gitlab url
- 登录runner容器执行注册相关命令
登录容器
# 登陆容器
docker exec -ti runner-main bash
# 写入gitlab的域名信息,假设IP为192.168.1.2,域名为test.gitlab.com,如果docker-compose设置了
echo "192.168.1.2 test.gitlab.com" >> /etc/hosts
执行登录命令
gitlab是http的情况
- 15.10 版本之前,旧版注册方法
- docker-image是用于运行流水线的构建容器,需要用户根据自己需求制作,安装如git、svn之类的如那就
gitlab-runner register --url "http://test.gitlab.com" --registration-token "xxxxxxxxx" --name "runner-main" --executor "docker" --tag-list "main" --docker-image "registry.cn-hangzhou.aliyuncs.com/oudezhinu/gitlab-server:latest"
- 15.10 版本之后,新版注册方法
- 在gitlab项目-设置-CI/CD设置-Runner下点击【新建项目runner】
- 在新的界面填写runner设置后,获得类似下面的命令后在gitlab-runner中执行
- 后续设置都需要手动填写,新版本安全更新导致
gitlab-runner register --url http://test.gitlab.com --token xxxxx
- 17.7.0后 --tag-list参数不再支持,tag需要在gitlab CICD界面添加
gitlab是自签名https的情况
- 15.10 版本之前,旧版注册方法
- gitlab坑爹的不允许跳过https验证,必须使用证书才行
# 创建存放自签名certs文件的地址
mkdir -p /etc/gitlab-runner/certs
openssl s_client -showcerts -connect test.gitlab.com:443 -servername test.gitlab.com < /dev/null 2>/dev/null | openssl x509 -outform PEM > /etc/gitlab-runner/certs/test.gitlab.com.crt
# 注册
gitlab-runner register --url "https://test.gitlab.com/" --registration-token "xxxx" --name "runner-main" --executor "docker" --tag-list "main" --tls-ca-file "/etc/gitlab-runner/certs/test.gitlab.com.crt" --docker-image "registry.cn-hangzhou.aliyuncs.com/oudezhinu/gitlab-server:latest"
gitlab-runner register --url https://test.gitlab.com --token xxxxx
- 17.7.0后 --tag-list参数不再支持,tag需要在gitlab CICD界面添加
验证注册情况
- 在gitlab项目下查看【设置】-【CI/CD】-【Runner】-【指定Runner】下是否新增一个runner
- 如果新增runner的图标部署绿色而是黑色,或者想验证下Runner是否注册成功,都可以执行以下命令
gitlab-runner verify
- 查看/etc/gitlab-runner/下注册后新增的高级配置文件:config.toml
- 我们也可以在物理执行机的/data/gitlab/runner/main下查看,因为此路径已经挂载了
- 新增几处配置,如下
concurrent = 1
check_interval = 0
shutdown_timeout = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "runner-main"
url = "http://test.gitlab.com/"
id = 1
token = "xxxxxx"
token_obtained_at = 2024-01-03T19:54:00Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "docker"
environment = ["TZ=Asia/Shanghai"] # 新增
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.docker]
tls_verify = false
image = "registry.cn-hangzhou.aliyuncs.com/oudezhinu/gitlab-server:latest"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"] # 编辑新增docker.sock
shm_size = 0
network_mtu = 0
allowed_pull_policies = ["if-not-present"] # 新增
pull_policy = ["if-not-present"] # 新增
dns = ["192.168.1.254", "8.8.8.8"] # 新增,此处我添加了内部dns 192.168.1.254和谷歌dns,根据需求更改
gitlab-runner restart
gitlab-runner verify
参考链接
评论区