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

目录路径就不那么讲究了...

请替换xxxxxx代表用户名

部署

通用

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
  1. 输入您的极狐GitLab 实例 URL(也称为 gitlab-ci coordinator URL)。

  2. 输入注册 Runner 时获取的令牌。

    1. 进入GitLab管理中心

    2. 点击CI/CD

    3. 点击Runner

    4. 右上角详情(3个点)查看

  3. 输入 Runner 描述。您可以在极狐GitLab UI 中进行变更。

  4. 输入以逗号隔开的与 Runner 有关的标签,您可以后续在极狐GitLab UI 中进行变更。

  5. 为 Runner 输入可选的维护记录。

  6. 提供 Runner 执行器。对于大多数用例来说,输入 docker。

  7. 如果您输入 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

测试成功,可以看到分为四个阶段

  1. Preparing the "docker" executor

    1. 准备docker执行器,没有配置镜像,所以这里加载默认的镜像:eclipse-temurin:17-jre

  2. Preparing environment

    1. 准备环境

  3. Getting source from Git repository

    1. 拉取代码

  4. Executing "step_script" stage of the job script

    1. 执行脚本

共享Runner配置

  1. 点击管理中心

  2. 点击CI/CD

  3. 点击Runner

  4. 配置要共享的Runner

  5. 标签可填可不填

  6. 勾选运行未打标签的作业