GitLab vs Forgejo

GitLab vs Forgejo

В данной статье мы сравним GitLab и Forgejo. Рассмотрим из каких компонентов состоят оба инструмента. Оценим системные требования. Выполним нагрузочные тесты CI/CD на базе GitLab CI и Forgejo Actions. Оценим производительность и скорость работы

1. Введение

GitLab появился в 2011 году и на текущий момент уже довольно много команд использует его для совместной разработки программного обеспечения и построения CI/CD. Forgejo появился сравнительно недавно (в декабре 2022 года) как бесплатный и поддерживаемый сообществом форк Gitea. Forgejo унаследовал функционал Gitea и мог выступать в роли только Git-сервера, хостинга кода и приватного реестра Docker-образов. В феврале 2023 года появились Forgejo Actions и Forgejo получил все необходимые инструменты для построения полноценного CI/CD. Так же стоит отметить, что сейчас Forgejo набирает обороты. На базе Forgejo работает хостинг кода Codeberg. Сообщество Linux Fedora в декабре 2024 решило перейти со своего старого хостинга кода Pagure на новый, хостинг кода базирующийся на Forgejo. Примечательно, что они выбирали между GitLab и Forgejo. Сообщество Linux Fedora приводит свой анализ сильных и слабых сторон GitLab и Forgejo плюс обоснование своего выбора

2. Компоненты

Ниже приведен список компонетов GitLab и сколько ОЗУ занимает каждый компонент. Функционал GitLab разнесен в несколько модулей Kubernetes, взаимодействующих друг с другом

user@dc1-plane:~$ kubectl top pod -n gitlab
NAME                                               CPU(cores)   MEMORY(bytes)
gitlab-gitaly-0                                    20m          450Mi
gitlab-gitlab-exporter-786f5dfd78-jljcx            8m           37Mi
gitlab-gitlab-runner-f844fdc6-nk4cr                27m          57Mi
gitlab-gitlab-shell-8474df6476-cwrxk               14m          58Mi
gitlab-gitlab-shell-8474df6476-xwf7l               14m          15Mi
gitlab-kas-5b46db4fdd-t4nnj                        3m           38Mi
gitlab-kas-5b46db4fdd-zkttk                        4m           31Mi
gitlab-minio-6cb9f8689f-4sqgk                      67m          41Mi
gitlab-redis-master-0                              27m          36Mi
gitlab-registry-f64bccb5-5rpfr                     47m          30Mi
gitlab-registry-f64bccb5-phqv4                     37m          38Mi
gitlab-sidekiq-all-in-1-v2-86d4747b9-ckh4h         12m          1582Mi
gitlab-toolbox-776b87cbf-nxsfd                     1m           1Mi
gitlab-webservice-default-b897fd6f4-8xvm9          29m          2320Mi
gitlab-webservice-default-b897fd6f4-mdz8m          58m          2307Mi
runner-zkyjccusu-project-1-concurrent-0-u0fejp1i   7m           87Mi
runner-zkyjccusu-project-1-concurrent-1-se2gzngl   4m           87Mi
runner-zkyjccusu-project-1-concurrent-2-3px257p1   7m           87Mi
runner-zkyjccusu-project-1-concurrent-3-66ihavyr   9m           88Mi
runner-zkyjccusu-project-1-concurrent-4-07kffbus   8m           83Mi
runner-zkyjccusu-project-1-concurrent-5-s7m1dbn0   6m           88Mi
runner-zkyjccusu-project-1-concurrent-6-sobjjt7w   6m           86Mi
runner-zkyjccusu-project-1-concurrent-7-rw0h7rts   7m           85Mi

GitLab выполняет CI/CD пайплайны в раннерах. Для примера, мы запустили одновременно 8 пайплайнов в GitLab. Модули раннеров GitLab, выполняющие данные пайплайны вы можете видеть в конце списка выше

Forgejo запускает только один процесс в единственном модуле Kubernetes. Данный процесс реализует функции Git-сервера, приватного реестра Docker-образов и Web-интерфейса

user@dc1-plane:~$ kubectl top pods -n forgejo
NAME                               CPU(cores)   MEMORY(bytes)   
forgejo-75bcbdfb8d-bg86m            440m         156Mi           
forgejo-runner-1-77dcb488dc-4d9cv   2m           237Mi           
forgejo-runner-1-77dcb488dc-99556   110m         215Mi           
forgejo-runner-1-77dcb488dc-cv6wt   11m          210Mi           
forgejo-runner-1-77dcb488dc-hmlm8   57m          179Mi           
forgejo-runner-1-77dcb488dc-ht9zw   3m           195Mi           
forgejo-runner-1-77dcb488dc-j79ll   5m           184Mi           
forgejo-runner-1-77dcb488dc-kzmfv   73m          207Mi           
forgejo-runner-1-77dcb488dc-r6qlb   2m           180Mi    

Forgejo так же выполняет пайплайны в раннерах, которые запускаются в отдельных модулях Kubernetes, которые вы можете наблюдать в конце списка выше

3. Системные требования

Суммируем значения в столбце MEMORY для списков модулей выше и выясним сколько потребуется ОЗУ для запуска GitLab и Forgejo

Для запуска GitLab потребуется около 7 GB ОЗУ и еще по 86 MB (в среднем) для запуска каждого раннера GitLab

Для запуска Forgejo потребуется 156 MB и по 200 MB (в среднем) для запуска каждого раннера Forgejo

Подсчитаем сколько потребуется места на жестком диске для установки GitLab и Forgejo. Компоненты GitLab и Forgejo работают в контейнерах, запущенных из Docker-образов, которые предварительно скачиваются с официальных сайтов и сохраняются в файловых системах Worker-нод Kubernetes

Список Docker-образов GitLab и их размер:

user@dc1-worker2:/home/user# sudo crictl image ls | grep gitlab
registry.gitlab.com/gitlab-org/build/cng/certificates                    v18.11.3                       542110cd983e1       65.7MB
registry.gitlab.com/gitlab-org/build/cng/gitaly                          v18.11.3                       7a60490b436c3       430MB
registry.gitlab.com/gitlab-org/build/cng/gitlab-base                     v18.11.3                       e60275b69b391       65.7MB
registry.gitlab.com/gitlab-org/build/cng/gitlab-container-registry       v4.39.0-gitlab                 7cfbab78e555b       86.7MB
registry.gitlab.com/gitlab-org/build/cng/gitlab-exporter                 16.7.0                         42d6f5c653cdd       224MB
registry.gitlab.com/gitlab-org/build/cng/gitlab-kas                      v18.11.3                       30b3ff44516cb       38.7MB
registry.gitlab.com/gitlab-org/build/cng/gitlab-shell                    v14.49.0                       7c4faa52f6754       140MB
registry.gitlab.com/gitlab-org/build/cng/gitlab-sidekiq-ee               v18.11.3                       1507f4a887b72       1.16GB
registry.gitlab.com/gitlab-org/build/cng/gitlab-toolbox-ee               v18.11.3                       8eba3bb0500da       1.17GB
registry.gitlab.com/gitlab-org/build/cng/gitlab-webservice-ee            v18.11.3                       33cecbd6504c1       1.08GB
registry.gitlab.com/gitlab-org/build/cng/gitlab-workhorse-ee             v18.11.3                       4a3a31d1d5d0c       526MB
registry.gitlab.com/gitlab-org/build/cng/kubectl                         v18.11.3                       a17fc0b3f116f       74.8M
registry.gitlab.com/gitlab-org/cloud-native/mirror/images/minio/mc       RELEASE.2018-07-13T00-53-22Z   ee62869f5c8d5       6.71MB
registry.gitlab.com/gitlab-org/cloud-native/mirror/images/minio/minio    RELEASE.2017-12-28T01-21-00Z   8cf453f32acfd       10.8MB
registry.gitlab.com/gitlab-org/cluster-integration/auto-build-image      v4.18.0                        10dca33e52478       160MB
registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image     v2.135.0                       bc474bdf90f83       57.4MB
registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/agentk   v18.11.0                       bf1a4452394d0       70MB
registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper        x86_64-v18.11.2                afb7f44ffc13f       37.3MB
registry.gitlab.com/gitlab-org/gitlab-runner                             alpine-v18.11.2                1ce8509963b3b       67.8MB

Список Docker-образов Forgejo и их размер:

user@dc1-worker1:~$ sudo crictl image ls | grep forgejo
code.forgejo.org/forgejo/forgejo                                         15.0.1-rootless                            cc2a97ab2ef82       75.1MB
code.forgejo.org/forgejo/runner                                          12                                         facd5ec08a710       18.2MB

Суммируем размеры Docker-образов в последнем столбце

Для установки GitLab потребуется около 5.5 GB на жестком диске

Для установки Forgejo потребуется около 100 MB на жестком диске. Плюс по 1.6 GB для каждого раннера, о чем мы подробно расскажем в следующем пункте

4. Раннеры

GitLab и Forgejo выполняют пайплайны CI/CD в отдельных модулях Kubernetes - раннерах. Как GitLab, так и Forgejo выполняют сборку Docker-образов приложений в контейнере Docker-in-Docker. AutoDevops от GitLab и Forgejo Actions развертывают приложения в кластер Kubernetes как helm-чарт

Ключевое отличие Forgejo от GitLab заключается в запуске раннеров

Сначала разберем, как запускает раннеры GitLab. Как только разработчик делает коммит в Git-репозиторий, GitLab автоматически запускает пайплайн сборки Docker-образа приложения и доставки в кластер Kubernetes

Для выполнения первой Job-ы "build" GitLab запускает модуль раннера, включающий в себя 3 контейнера

user@dc1-plane:~$ kubectl get pod -n gitlab | grep runn
NAME                                               READY   STATUS    RESTARTS       AGE
runner-fmynxzeiu-project-1-concurrent-0-v4go43ln   3/3     Running   0              2m48s

kubectl describe pod runner-fmynxzeiu-project-1-concurrent-0-v4go43ln -n gitlab
Containers:
  build:
    Image: registry.gitlab.com/gitlab-org/cluster-integration/auto-build-image:v4.18.0
  helper:
    Image: registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-v18.11.2
  svc-0:
    Image: docker:29.4.3-dind

auto-build-image:v4.18.0 - содержит скрипт /build/build.sh от разработчиков GitLab, который собирает Docker-образ вашего приложения

docker:29.4.3-dind - контейнер Docker-in-Docker в котором собирается Docker-образ вашего приложения

Раннер собирает Docker-образ вашего приложения, отправляет его в приватный реестр Docker-образов и завершает свою работу, а GitLab следом запускает второй раннер

user@dc1-plane:~$ kubectl get pod -n gitlab | grep runn
NAME                                               READY   STATUS    RESTARTS       AGE
runner-fmynxzeiu-project-1-concurrent-0-v4go43ln   3/3     Terminating   0              28s
runner-fmynxzeiu-project-1-concurrent-0-p1w3fsv6   2/2     Running       0              7s

В этом раннере выполняется Job-а "staging", устанавливающая helm-чарт вашего приложения в кластер Kubernetes

Модуль раннера для Job-ы "staging" включает в себя 2 контейнера

kubectl describe pod runner-fmynxzeiu-project-1-concurrent-0-p1w3fsv6 -n gitlab
Containers:
  build:
    Image: registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:v2.135.0
  helper:
    Image: registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-v18.11.2

auto-deploy-image:v2.135.0 - содержит команду helm для установки helm-чарта вашего приложения в кластер Kubernetes

На картинке ниже пайплайн GitLab успешно выполнен

А модуль раннера для Job-ы "staging" завершает свою работу

user@dc1-plane:~$ kubectl get pod -n gitlab | grep runn
NAME                                               READY   STATUS    RESTARTS       AGE
runner-fmynxzeiu-project-1-concurrent-0-p1w3fsv6   2/2     Terminating   0          32sec

Теперь разберем специфику запуска и работы раннеров Forgejo

В отличие от Kubernetes модулей раннеров GitLab, модули раннеров Forgejo запущены постоянно

NAME                                READY   STATUS    RESTARTS   AGE
forgejo-84ffcc799-7jd7j             1/1     Running   0          20m
forgejo-runner-1-7fdfc4bd89-p28kj   2/2     Running   0          17m

Модуль раннера Forgejo включает в себя два контейнера

kubectl describe pod forgejo-runner-1-7fdfc4bd89-p28kj -n forgejo
Containers:
Containers:
  runner:
    Image: code.forgejo.org/forgejo/runner:12
  dind:
    Image: docker.io/library/docker:29.4.3-dind

code.forgejo.org/forgejo/runner:12 - раннер с официального сайта Forgejo

docker.io/library/docker:29.4.3-dind - Docker-in-Docker для сборки Docker-образов ваших приложений

Если GitLab запускает отдельный модуль Kubernetes для каждой Job-ы, то ранер Forgejo запускает один контейнер в Docker-in-Docker и все Job-ы выполняет в нем. На картинке ниже раннер Forgejo вытягивает официальный Docker-образ "data.forgejo.org/oci/node:tls" с официального сайта Forgejo и использует его для запуска контейнера в Docker-in-Docker

Подключимся к контейнеру Docker-in-Docker в модуле раннера Forgejo и найдем контейнер, запущенный во время выполнения "Set up job" на картинке выше

user@dc1-plane:~$ kubectl exec -it forgejo-runner-1-7fdfc4bd89-p28kj -n forgejo -c dind -- /bin/bash
/ # docker container ls
CONTAINER ID   IMAGE                           COMMAND               CREATED          STATUS          PORTS     NAMES
80300be42968   data.forgejo.org/oci/node:lts   "tail -f /dev/null"   15 seconds ago   Up 14 seconds             FORGEJO-ACTIONS-TASK-3197_WORKFLOW-ad1047f74ca190334cd4c2a3fcea535849f43339dbb9bbd4b28082043a8032f2_JOB-staging

Далее, в данном контейнере выполняется Job-а "checkout", вытягивающая исходный код приложения из Git-репозитория. Cледом выполняется Job-а "build", которая собирает Docker-образ приложения и отправляет его в приватный реестр Docker-образов Forgejo. Здесь же выполняется Job-а "staging", которая устанавливает helm-чарт вашего приложения в кластер Kubernetes

Следует отметить, что Docker-образ контейнера "code.forgejo.org/forgejo/runner:12" с официального сайта Forgejo сохраняется в файловой системе контейнера Docker-in-Docker

/ # docker image ls
IMAGE                                                                                  ID             DISK USAGE   CONTENT SIZE   EXTRA
data.forgejo.org/oci/node:lts                                                          032e78d7e54e       1.64GB          425MB
forgejo.gitorion.ru/owneruser/frontend/main:0d7e1019af71ab0ac9fa38af81c5bc1c9b3a75a0   51586737224d       67.2MB         67.2MB
forgejo.gitorion.ru/owneruser/frontend/main:latest                                     51586737224d       67.2MB         67.2MB

При всех последующих запусках пайплайнов раннер Forgejo не тратит время на скачивание Docker-образа, а сразу стартует контейнер, используя сохраненный Docker-образ, что сокращает время запуска контейнера с 3min 33sec до 3sec (подчеркнуто красным на картинках)

Также существенно сократилась нагрузка на дисковую систему Worker-нод Kubernetes при одновременной работе нескольких раннеров, о чем мы расскажем в следующем пункте

Один раннер Forgejo в моменте может выполнять только один пайплайн. Если все раннеры заняты, то очередной запущенный пайплайн ставится в очередь и ждет, пока освободится один из раннеров. Любой освободившийся раннер подхватывает пайплайны из очереди на обработку. Запустить необходимое количество раннеров можно изменив количество реплик в Deployment-е манефесте раннера

kubectl edit deployment forgejo-runner-1 -n forgejo
apiVersion: apps/v1
kind: Deployment
metadata:
  name: forgejo-runner-1
  namespace: forgejo
spec:
  replicas: 5

Теперь Forgejo может запустить одновременно пайплайны 5ти разработчиков

user@dc1-plane:~$ kubectl get pod -n forgejo
NAME                                READY   STATUS    RESTARTS       AGE
forgejo-84ffcc799-7jd7j             1/1     Running   0   	     144m
forgejo-runner-1-7fdfc4bd89-p28kj   2/2     Running   0              144m
forgejo-runner-1-7fdfc4bd89-v9gn2   2/2     Running   0              144m
forgejo-runner-1-7fdfc4bd89-wbqj4   2/2     Running   0              144m
forgejo-runner-1-7fdfc4bd89-x866z   2/2     Running   0              144m
forgejo-runner-1-7fdfc4bd89-x8h78   2/2     Running   0              144m

К сожалению, сообщество Forgejo еще не проработало автоматический запуск раннеров по коммиту в Git-репозиторий и завершение раннера после выполнения пайплайна. Поэтому вам придется самостоятельно оценивать количество разработчиков, одновременно запускающих пайплайны и запускать необходимое число раннеров, чтобы не возникало очередей

5. Нагрузочные тесты дисковой системы

Раннеры GitLab и Forgejo для ускорения сборки Docker-образов активно используют кэши сборки Docker. Кэш Docker сборки сохраняется в привантом реестре Docker образов. При пересборке одного и того же Docker-образа контейнеры Docker-in-Docker как GitLab так и Forgejo копируют Docker кэш предыдущей сборки из приватного реестра Docker-образов в файловую систему контейнера Docker-in-Docker (по сути в файловую систему Worker-ноды, на которой запущен раннер). При повторной сборке Docker-образа билдятся только слои претерпевшие изменения. Слои, не претерпевшие изменения, просто копируются из кэша сборки Docker

Ниже мы выполним нагрузочное тестирование и сравним, как сильно нагружают диски раннеры GitLab и Forgejo. Будем запускать одновременно 5, 10, 15, 20, 25 и т.д пайплайнов иммитируя работу сразу нескольких программистов. Оценивать нагрузку на дисковую систему будем по параметру "Disk I/O Utilization" и среднему времени выполнения пайплайнов

Пример 5-ти одновременно работающих пайплайнов Forgejo

Пример 5-ти одновременно работающих пайплайнов GitLab

Билдить будем Docker-образ бэкенда на Django. В качестве базового слоя используем официальный Docker-образ FROM:python:3.13.5-alpine3.22. В итоге мы собрали Docker-образ бэкенда на Django размером 67 MB. Примерно такого же размера кэш Docker сборки будет записывать каждый раннер в файловую систему контейнера Docker-in-Docker (по факту на диск Worker-ноды Kubernetes) при выполнении каждого пайплайна

Раннеры будем запускать на Worker-ноде Kubernetes со следующими характеристиками:

CPU i7-7700 CPU @ 3.60 GHz 8 ядер
Mem 32GB DDR4 2400 MHz
HDD WD Blue WD10EZEX 7200 об/мин 150 Мбайт/с
SSD Samsung SSD 850 520 Мбайт/с

Сперва оценим нагрузку на HDD WD Blue WD10EZEX

График "Disk I/O Utilization" для 5, 10, 15, 20 и 25 одновременно работающих раннеров Forgejo

График "Disk I/O Utilization" для 5, 10, 15, 20 одновременно работающих раннеров GitLab

Среднее время работы пайплайнов сведем в таблицу

N GitLab Forgejo
5 3min 20sec 1min 20sec
10 5min 10sec 2min 18sec
15 8min 10sec 3min 40sec
20 12min 40sec 5min 30sec
25 - 7min 3sec

Из графиков видно, что только 25 и более одновременно работающих раннеров Forgejo нагрузили HDD на 100%. Следовательно, в случае Forgejo на одной Worker ноде Kubernetes смогут одновременно работать не более 25 программистов. Для большего числа разработчиков придется подключать дополнительные Worker ноды и распределять раннеры между ними.

В случае GitLab уже начиная с 10 одновременно запущенных раннеров нагрузка на HDD уперлась в 100%. Следовательно для GitLab лучше сразу установить в Worker-ноды SSD или NVMe накопители

Теперь проведем аналогичную серию тестов и оценим нагрузку на Samsung SSD 850

График "Disk I/O Utilization" для 5, 10, 15, 20 и 25 для одновременно работающих раннеров Forgejo

График "Disk I/O Utilization" для 5, 10, 15, 20 и 25 одновременно работающих раннеров GitLab

Среднее время работы пайплайнов сведем в таблицу

N GitLab Forgejo
5 55sec 24sec
10 1min 30sec 29sec
15 1min 56sec 31sec
20 2min 30sec 39sec
25 2min 50sec 43sec

Из графиков видно, что 25 одновременно запущенных раннеров Forgejo нагрузили SSD не более чем на 86%. Для GitLab, начиная с 10 одновременно работающих пайплайнов нагрузка на SSD приближается к 100%, однако существенно снизилось время выполнения пайплайнов по сравнению с HDD

Можно сделать вывод, что раннеры Forgejo быстрее выполняли CI/CD пайплайны, чем раннеры GitLab и при этом создавали меньшую нагрузку на дисковую систему Worker-нод Kubernetes

Заглянем в логи одного из 25 пайплайнов GitLab и Forgejo работающих во время тестирования SSD и выясним, почему у GitLab на сборку и доставку ушло 2min 50sec а у Forgejo 43sec

Мы пометили зеленым на картинке выше момент запуска контейнеров для выполнения пайплайнов - GitLab потребовалось 37 sec на запуск контейнера для Job-ы "build" и 4 секунды на запуск контейнера для Job-ы "review", в то время, как Forgejo запустил единственный контейнер для всех Job-ов за 6 sec. Такое преимущество Forgejo продемонстрировал благодаря специфике запуска раннеров, разобранную нами в п.4 выше

Красным на картинке мы пометили момент установки helm-чарта вашего приложения в кластер Kubernetes - GitLab потребовалось 36 sec в то время, как Forgejo справился за 5 sec

Синим мы пометили момент сборки Docker-образа приложения. GitLab справился за 1min 14sec в то время, как Forgejo потребовалось всего 23sec. Раскрываем секцию сборки Docker-образа пайплайна GitLab и видим что 45sec (подчеркнуто красным) GitLab потратил на запуск контейнера BuildKit и соответственно 29sec на сборку Docker-образа

Forgejo раннер скачивает с официального сайта и устанавливает Forgejo Action "docker/setup-buildx-action" только один раз при первом запуске и на это потребовалось 4min 28sec (подчеркнуто красным на картинке ниже). Скачанный Forgejo Action сохраняется локально в файловой системе контейнера

При всех последующих запусках Forgejo Action "docker/setup-buildx-action" запускается из локальной файловой системы контейнера раннера

С данным различием в специфике запуска контейнера BuildKit мы связываем тот факт, что GitLab сильнее нагружает дисковую систему чем Forgejo. Если подключиться к контейнеру Docker-in-Docker ранера GitLab то можно увидеть, что Docker-образа BuildKit занимает 249 MB на жестком диске

user@dc1-plane:~$ kubectl exec -it runner-zyc4f3znf-project-1-concurrent-0-r9fjeqn9 -n gitlab -c svc-0 -- /bin/sh
/ # docker image ls
IMAGE                                                                  ID             DISK USAGE   CONTENT SIZE   EXTRA
registry.gitorion.ru/owneruser/backend/moby/buildkit:buildx-stable-1   6db049f808b3        242MB             0B    U   

Получается, что помимо записи кэшей сборки Docker на диск, раннеры GitLab дополнительно нагружают дисковую систему Worker-нод Kubernetes записью Docker-образов BuildKit

6. Нагрузочные тесты CPU

В заключение, сравним нагрузку на CPU, создаваемую раннерами GitLab и Forgejo. Для этого будем выполнять пайплайн, который компилирует Nginx из исходнного кода, упаковывает в Docker-образ и развертывает в кластер Kubernetes как helm-чарт. Чтобы минимизировать дисковые операции, в качестве базового Docker-образа используем FROM alpine:3.24.1 размером 3.7МB и Multi-stage сборку, чтобы не тащить промежуточные файлы компиляции в результирующий Docker-образ. Размер итогового Docker-образа получился 6.9MB

Раннеры будем запускать на той же Worker-ноде Kubernetes, что и в предыдущем пункте:

CPU i7-7700 CPU @ 3.60 GHz 8 ядер
Mem 32GB DDR4 2400 MHz
SSD Samsung SSD 850 520 Мбайт/с

Зададим одинаковые условия для раннеров GitLab и Forgejo. Контейнеру Docker-in-Docker, в котором будет компилироваться Nginx установим ограничение на использование CPU в 250m

Для Kubernetes модуля раннера Forgejo:

image: docker.io/library/docker:29.4.3-dind
imagePullPolicy: IfNotPresent
name: dind
resources:
  limits:
    cpu: 250m
    memory: 350Mi
  requests:
    cpu: 200m
    memory: 300Mi

Для Kubernetes модуля раннера GitLab:

image: docker:29.4.3-dind
imagePullPolicy: IfNotPresent
name: svc-0
resources:
  limits:
    cpu: 250m
    memory: 350Mi
  requests:
    cpu: 200m
    memory: 300Mi

Теперь будем одновременно запускать 2, 4, 6, 8, 10, 12 пайплайнов, компилирующих Nginx, фиксировать нагрузку на CPU, суммарное время выполнения пайплайна и время выполнения компиляции Nginx (слой "RUN make && make install" в Dockerfile)

График загрузки CPU для Forgejo

График нагрузки на дисковую систему для Forgejo

График загрузки CPU для GitLab

График нагрузки на дисковую систему для GitLab

Среднее время работы пайплайнов и среднее время компиляции Nginx сведем в таблицу

N GitLab Forgejo GitLab compile Forgejo compile
2 2min 11sec 1min 17sec 52 sec 51 sec
4 2min 32sec 1min 30sec 60 sec 59 sec
6 3min 05sec 1min 51sec 77sec 78sec
8 3min 40sec 2min 16sec 95sec 97sec
10 4min 40sec 2min 45sec 112sec 124sec
12 5min 30sec 3min 18sec 139sec 151sec

И здесь Forgejo выполнял пайплайны за меньшее время чем GitLab благодаря специфике запуска раннеров, которые мы осветили в главе 4

А вот конкретно на компиляцию Nginx как GitLab так и Forgejo затратили примерно одинаковое время

Из графиков загрузки CPU видно, что 2, 4 и 6 одновременно работающих пайплайнов Forgejo во время компиляции Nginx загрузили 8-ми ядерный процессор на 30, 60 и 80 процентов соответственно. Примерно такую же нагрузку на CPU создали 2, 4 и 6 пайплайнов GitLab. И только 8 и более пайплайнов, как GitLab так и Forgejo одновременно компилирующих Nginx загрузили 8-ми ядерный процессор на 100 процентов. GitLab и Forgejo продемонстрировали примерно одинаковую производительность при выполнении пайплайнов, компилируюших проекты из исходного кода и ни один из инструментов не показал какого то ощутимого превосходства над другим