Docker部署GitLab-Runner
Docker部署GitLab-Runner
环境:
RockyLinux9.4
虚拟机配置 4C12G(运存至少4G)
Docker version 26.1.3
防火墙关闭
安装
拉取镜像
sudo docker pull gitlab/gitlab-runner:v17.0.0
创建挂载文件目录
sudo mkdir /home/xxx/docker/gitlab-runner
目录路径就不那么讲究了...
请替换xxx ,xxx代表用户名
部署
通用
sudo docker run -d --name my-gitlab-runner -p 52703:8093 -e TZ=Asia/Shanghai -v /home/xxx/docker/gitlab-runner:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:v17.0.0
-p 52703:8093
按照官方文档,如果您使用的是session_server,则需要公开端口。
-v /var/run/docker.sock:/var/run/docker.sock
绑定docker执行请替换 xxx 为你的用户名
个人
sudo docker run -d --net my-network --ip 172.18.0.7 --name my-gitlab-runner -p 52703:8093 -e TZ=Asia/Shanghai -v /home/yd/docker/gitlab-runner:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:v17.0.0
配置
进入容器内部
sudo docker exec -it my-gitlab-runner bash
注册
新-使用身份验证令牌注册
在UI界面生成注册命令
Docker部署Runner后进入Runner容器
sudo gitlab-runner register --url http://<gitlab服务器IP>:<端口>/ --token glrt-xxxxxxxxxxxx
旧-使用注册令牌注册
该方式目前还能用,官方计划18.0以后废除
sudo gitlab-runner register
输入您的极狐GitLab 实例 URL(也称为 gitlab-ci coordinator URL)。
输入注册 Runner 时获取的令牌。
进入GitLab管理中心
点击CI/CD
点击Runner
右上角详情(3个点)查看
输入 Runner 描述。您可以在极狐GitLab UI 中进行变更。
输入以逗号隔开的与 Runner 有关的标签,您可以后续在极狐GitLab UI 中进行变更。
为 Runner 输入可选的维护记录。
提供 Runner 执行器。对于大多数用例来说,输入 docker。
如果您输入 docker 作为执行器。对于在 .gitlab-ci.yml 中没有定义镜像的项目,系统会要求您使用默认镜像。
注意事项
修改config.toml
配置文件后,请重启整个容器,而不是重启gitlab-runner
修改项
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
config.toml说明
# 全局配置
# concurrent 定义了可以并行运行的作业数量上限
concurrent = 4
# check_interval 设置 GitLab Runner 检查新作业的时间间隔(以秒为单位)
check_interval = 30
# 定义第一个 Runner
[[runners]]
# Runner 的名称,用于区分多个 Runner
name = "My Docker Runner"
# GitLab 实例的 URL
url = "https://gitlab.com/"
# 注册 Runner 时生成的 token,用于认证
token = "your_runner_token"
# 指定执行器类型,可以是 shell, docker, docker+machine 等
executor = "docker"
# Docker 执行器的配置
[runners.docker]
# 是否启用 TLS 验证
tls_verify = false
# 默认使用的 Docker 镜像
image = "ruby:2.7"
# 是否以特权模式运行容器
privileged = true
# 禁用 entrypoint 覆盖
disable_entrypoint_overwrite = false
# 是否禁用 OOM kill
oom_kill_disable = false
# 是否禁用缓存
disable_cache = false
# 挂载到容器的卷,可以添加多个卷
volumes = ["/cache"]
# 设置 /dev/shm 的大小
shm_size = 0
# 定义缓存配置(如使用 S3 作为缓存存储)
#[runners.cache]
# 缓存的类型,可以是 s3, gcs 等
#type = "s3"
# 缓存的路径
#path = "cache/"
# 是否在 Runner 之间共享缓存
#shared = true
# 适用于 Runner 的标签,用于 GitLab 作业中选择 Runner
tags = ["docker", "linux"]
# 配置 Runner 环境变量
environment = ["MY_VAR=my_value", "ANOTHER_VAR=another_value"]
# 限制单个 Runner 同时运行的作业数
limit = 2
# 作业输出的最大字节数,超出将被截断
output_limit = 4096
# 定义第二个 Runner
[[runners]]
name = "My Shell Runner"
url = "https://gitlab.com/"
token = "another_runner_token"
executor = "shell"
tags = ["shell", "linux"]
environment = ["SHELL_VAR=shell_value"]
limit = 1
output_limit = 2048
# shell 执行器的配置可以直接在 runners 里指定
shell = "bash"
# 定义第三个 Runner(例如使用 Kubernetes 执行器)
#[[runners]]
#name = "My Kubernetes Runner"
#url = "https://gitlab.com/"
#token = "kubernetes_runner_token"
#executor = "kubernetes"
#tags = ["kubernetes", "cloud"]
#limit = 3
#output_limit = 8192
#[runners.kubernetes]
#namespace = "default"
#image = "alpine:latest"
#privileged = false
#poll_timeout = 600
开始使用
进入GitLab主页,随意选择一个项目,选择 构建 => 流水线编辑器 ,选择要创建流水线的分支(一般为release)
若没有对应配置文件,面板会提示你创建一个.gitlab-ci.yml,文件位置默认在根目录下
.gitlab-ci.yml标签说明
# 定义流水线的不同阶段,按顺序执行
stages:
- build
- test
- deploy
# 全局变量,适用于所有作业
variables:
GIT_SUBMODULE_STRATEGY: recursive
# 在每个作业开始之前执行的脚本
before_script:
- echo "Setting up the environment"
# 在每个作业结束之后执行的脚本
after_script:
- echo "Cleaning up the environment"
# 定义一个作业
build_job:
stage: build
script:
- echo "Compiling the code..."
- make
tags: # 指定运行作业的 Runner 标签
- docker
artifacts: # 指定在作业结束后保存的文件或目录
paths:
- build/
cache: # 缓存目录或文件以加快构建速度
key: build-cache
paths:
- .m2/repository
only: # 指定作业在哪些分支或标签运行
- branches
except: # 指定作业在哪些分支或标签不运行
- tags
retry: # 失败后重试作业的次数
max: 2
timeout: # 作业的超时时间
duration: 30m
parallel: # 并行运行多个作业实例
matrix:
- PROVIDER: aws
- PROVIDER: gcp
allow_failure: true # 允许作业失败而不影响整个流水线
when: on_success # 定义作业何时运行,如 on_success、on_failure、always、manual
environment: # 部署环境信息
name: staging
url: http://staging.example.com
test_job:
stage: test
script:
- echo "Running tests..."
- make test
dependencies: # 指定作业依赖的上游作业
- build_job
deploy_job:
stage: deploy
script:
- echo "Deploying the application..."
- make deploy
only:
- master
environment:
name: production
url: http://example.com
# 使用 extends 重用配置
.default_job: &default_job
before_script:
- setup_env
script:
- run_task
job1:
stage: build
<<: *default_job
script:
- compile_code
job2:
stage: test
<<: *default_job
script:
- run_tests
# 使用 rules 动态控制作业执行
conditional_job:
stage: test
script:
- make test
rules:
- if: '$CI_COMMIT_BRANCH == "master"'
- if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/'
# 使用 Docker 镜像
docker_job:
image: ruby:2.7 # 使用特定的 Docker 镜像运行作业
services: # 定义与作业一起启动的服务容器
- postgres:latest
script:
- bundle install
- rake db:create
- rake db:migrate
- rake spec
父标签 |
标签 |
含义 |
特殊说明 |
---|---|---|---|
- |
stages |
定义任务内的阶段,每个阶段必须从全局定义的阶段中选择 |
定义流水线全局阶段,默认有3个阶段,build、test、deploy。如果作业未定义stage阶段,默认使用test阶段 |
- |
include |
作业加载其他YAML文件 |
|
- |
pages |
上传GitLab Pages的结果 |
最多配置一个 |
- |
variables |
定义全局变量 |
|
- |
before_script |
每个作业开始之前执行的脚本 |
|
- |
after_script |
每个作业结束之后执行的指令 |
|
作业名 |
script |
由runner执行的shell脚本(必填项) |
|
作业名 |
retry |
发生故障时自动重试作业的时间和次数 |
|
retry |
max |
最大重试次数 |
|
作业名 |
image |
指定基础运行环境的docker镜像,如java,python,maven等 |
|
作业名 |
tags |
指定流水线使用哪个runner去运行,只能定义到一个具体的项目,tags的取值范围是该项目可见的runner |
|
作业名 |
only |
限定某些分支或者某些tag |
|
作业名 |
except |
排除某些分支和某些tag |
|
作业名 |
services |
使用Docker services(服务)镜像 |
|
作业名 |
when |
什么时候运行作业 |
on_success、 on_failure、 always、 manual |
作业名 |
environment |
部署的环境名称 |
|
作业名 |
cache |
指定需要在job之间缓存的文件或目录 |
|
cache |
key |
缓存的唯一标识符 |
可以是一个字符串、预定义的变量或自定义的变量 |
cache |
paths |
需要缓存的文件或目录路径列表 |
|
cache |
policy |
定义缓存策略 |
可选值为 pull-push(默认值,拉取并推送缓存)、push(仅推送缓存)、pull(仅拉取缓存) |
cache |
untracked |
是否缓存未跟踪的文件,布尔值 |
默认值为 false |
作业名 |
artifacts |
归档文件列表,指定成功后应附加到job的文件和目录的列表 |
|
作业名 |
dependencies |
当前作业依赖的其他作业,你可以使用依赖作业的归档文件 |
|
作业名 |
coverage |
作业的代码覆盖率 |
|
作业名 |
parallel |
指定并行运行的作业实例 |
|
作业名 |
trigger |
定义下游流水线的触发器 |
|
作业名 |
allow_failure |
允许作业失败,失败的作业不影响提交的状态 |
自定义测试
#流水线的stages的顺序可以自己定义
#相同阶段的任务将会并发的执行,上一个阶段的任务完整的结束之后,下一个阶段的任务才会开始执行
stages: # 作业的阶段列表及其执行顺序
- check
- build
- test
- deploy
check-job:
stage: check
script:
- echo 'check-job ,读取变量为:' $param1
build-job-1:
stage: build
script:
- echo 'build-job-1 ,读取变量为:' $param2
build-job-2:
stage: build
script:
- echo 'build-job-2 ,读取变量为:' $param3
test-job-1:
stage: test
script:
- echo 'test-job-1 ,读取变量为:' $param4
test-job-2:
stage: test
script:
- echo 'test-job-2 ,读取变量为:' $param5
test-job-3:
stage: test
script:
- echo 'test-job-3 ,读取变量为:' $param6
deploy-job:
stage: deploy
script:
- echo 'deploy-job,读取变量为:' $param1
配置好CI/CD选项,自动启动流水线,选取一个阶段进行查看
Running with gitlab-runner 17.0.0 (44feccdf)
on runner-description p7yZs76_, system ID: r_rDtrFVd6RYeh
Preparing the "docker" executor
00:03
Using Docker executor with image eclipse-temurin:17-jre ...
Pulling docker image eclipse-temurin:17-jre ...
Using docker image sha256:bc23ead92b20f18466cc055578a85c4e8ba1d86791543e6e98d199484a8f75d4 for eclipse-temurin:17-jre with digest eclipse-temurin@sha256:05c05e24fa58831f07d2964b7e0f6d15f655d1f422844ffd6d3f7faf51898d31 ...
Preparing environment
00:00
Running on runner-p7yzs76-project-1-concurrent-0 via 1196de9919c0...
Getting source from Git repository
00:01
Fetching changes with git depth set to 20...
Reinitialized existing Git repository in /builds/demo/backend/demo/.git/
Checking out 3dc11184 as detached HEAD (ref is release)...
Skipping Git submodules setup
Executing "step_script" stage of the job script
00:00
Using docker image sha256:bc23ead92b20f18466cc055578a85c4e8ba1d86791543e6e98d199484a8f75d4 for eclipse-temurin:17-jre with digest eclipse-temurin@sha256:05c05e24fa58831f07d2964b7e0f6d15f655d1f422844ffd6d3f7faf51898d31 ...
$ echo 'check-job ,读取变量为:' $param1
check-job ,读取变量为: 变量1
Job succeeded
Running with gitlab-runner 17.0.0 (44feccdf)
on runner-description p7yZs76_, system ID: r_rDtrFVd6RYeh
Preparing the "docker" executor
00:03
Using Docker executor with image eclipse-temurin:17-jre ...
Pulling docker image eclipse-temurin:17-jre ...
Using docker image sha256:bc23ead92b20f18466cc055578a85c4e8ba1d86791543e6e98d199484a8f75d4 for eclipse-temurin:17-jre with digest eclipse-temurin@sha256:05c05e24fa58831f07d2964b7e0f6d15f655d1f422844ffd6d3f7faf51898d31 ...
Preparing environment
00:01
Running on runner-p7yzs76-project-1-concurrent-0 via 1196de9919c0...
Getting source from Git repository
00:00
Fetching changes with git depth set to 20...
Reinitialized existing Git repository in /builds/demo/backend/demo/.git/
Checking out e1915c41 as detached HEAD (ref is release)...
Skipping Git submodules setup
Executing "step_script" stage of the job script
00:00
Using docker image sha256:bc23ead92b20f18466cc055578a85c4e8ba1d86791543e6e98d199484a8f75d4 for eclipse-temurin:17-jre with digest eclipse-temurin@sha256:05c05e24fa58831f07d2964b7e0f6d15f655d1f422844ffd6d3f7faf51898d31 ...
$ echo 'deploy-job,读取变量为:' $param1
deploy-job,读取变量为: 变量1
Job succeeded
测试成功,可以看到分为四个阶段
Preparing the "docker" executor
准备docker执行器,没有配置镜像,所以这里加载默认的镜像:eclipse-temurin:17-jre
Preparing environment
准备环境
Getting source from Git repository
拉取代码
Executing "step_script" stage of the job script
执行脚本
共享Runner配置
点击管理中心
点击CI/CD
点击Runner
配置要共享的Runner
标签可填可不填
勾选运行未打标签的作业