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 продемонстрировали примерно одинаковую производительность при выполнении пайплайнов, компилируюших проекты из исходного кода и ни один из инструментов не показал какого то ощутимого превосходства над другим