Skip to content

Instantly share code, notes, and snippets.

@denisxab
Created June 25, 2024 16:04
Show Gist options
  • Save denisxab/2f35c8f91ed1207116760dab3f86bdd6 to your computer and use it in GitHub Desktop.
Save denisxab/2f35c8f91ed1207116760dab3f86bdd6 to your computer and use it in GitHub Desktop.
Настройка собственного GitLab CI/CD сервера с помощью Docker Compose
version: "3.5"
services:
gitlab:
image: gitlab/gitlab-ce:latest
hostname: "localhost"
restart: unless-stopped
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://localhost'
gitlab_rails['gitlab_shell_ssh_port'] = 8822
gitlab_rails['initial_root_password'] = 'CHANGEME123'
ports:
- "8000:80"
- "8822:22"
volumes:
- ./data/docker/gitlab/etc/gitlab:/etc/gitlab
- ./data/docker/gitlab/var/opt/gitlab:/var/opt/gitlab
- ./data/docker/gitlab/var/log/gitlab:/var/log/gitlab
networks:
- gitlab_net
dind:
image: docker:20-dind
restart: always
privileged: true
environment:
DOCKER_TLS_CERTDIR: ""
command:
- --storage-driver=overlay2
volumes:
- ./data/dind/docker:/var/lib/docker
networks:
- gitlab_net
depends_on:
- gitlab
gitlab-runner:
image: gitlab/gitlab-runner:alpine
restart: unless-stopped
environment:
- DOCKER_HOST=tcp://dind:2375
# command:
# # Скачаем docker чтобы можно было увидеть какие есть контейнеры
# - apk update
# - apk add --no-cache docker
# - addgroup gitlab-runner docker
volumes:
- ./config:/etc/gitlab-runner:z
- ./data/runner/cache:/cache
- /var/run/docker.sock:/var/run/docker.sock
networks:
- gitlab_net
depends_on:
- gitlab
register-runner:
restart: "no"
image: gitlab/gitlab-runner:alpine
environment:
- REGISTRATION_TOKEN=${REGISTRATION_TOKEN}
- CI_SERVER_URL=http://gitlab
command:
- register
- --non-interactive
- --locked=false
# Имя для runner, обычно название такое же как у проекта
- --name=${RUNNER_NAME}
- --executor=docker
# Url до своего gitlab сервера, тут он у нас в одной сети
- --url=http://gitlab
- --clone-url=http://gitlab
- --docker-image=docker:20-dind
- --docker-volumes=/var/run/docker.sock:/var/run/docker.sock
# Чтобы контейнре мог иметь сетевой доступ к контейнеру с gitlab
- --docker-network-mode=host
volumes:
- ./config:/etc/gitlab-runner:z
- ./data/dind/docker:/var/lib/docker
networks:
- gitlab_net
depends_on:
- dind
networks:
gitlab_net:
name: gitlab_net
@denisxab
Copy link
Author

denisxab commented Jun 25, 2024

Заголовок:

Настройка собственного GitLab CI/CD сервера с помощью Docker Compose

Введение:

В этой статье мы рассмотрим, как развернуть собственный GitLab сервер и GitLab Runners с использованием Docker Compose. Это руководство поможет вам создать локальную среду для изучения и практики GitLab CI/CD. Мы пройдем через все этапы: от настройки контейнеров до регистрации раннеров и создания примера CI/CD пайплайна. Независимо от того, новичок вы в CI/CD или опытный разработчик, этот гайд предоставит вам ценные знания для улучшения вашего процесса разработки.

Основная часть статьи:

Зачем нужен собственный GitLab сервер?

Собственный GitLab сервер позволяет:

  1. Изучить GitLab CI/CD в безопасной среде
  2. Экспериментировать с настройками без риска для производственных систем
  3. Создать тестовую площадку для отработки CI/CD практик
  4. Получить полный контроль над инфраструктурой и данными

Как запустить свой сервер GitLab в контейнере?

1. Подготовка файловой структуры:

mkdir -p ./data/docker/gitlab/{var/opt/gitlab,var/log/gitlab,etc/gitlab-runner,var/run/docker.sock}
mkdir -p ./config
touch ./config/config.toml

2. Запуск Docker Compose:

Ссылка на docker-compose.yml

docker-compose up --build

3. Доступ к веб-интерфейсу GitLab:

  • URL: http://localhost:8000/
  • Логин: root
  • Пароль: CHANGEME123

4. Настройка SSH-ключа:

  1. Перейдите на http://localhost:8000/-/user_settings/ssh_keys
  2. Добавьте содержимое вашего ~/.ssh/id_rsa.pub

Регистрация GitLab Runner для выполнения задач в Docker

  1. Отредактируйте файл .env:
RUNNER_NAME=ИмяПроекта
REGISTRATION_TOKEN=ВашТокенРегистрации

REGISTRATION_TOKEN - Его можно получить в http://localhost:8000/root/${Проект}/-/settings/ci_cd в разделе Runner's-> Project runners -> : -> Скопировать

  1. Перезапустите сервис register-runner:
docker-compose restart register-runner

Управление GitLab Runner

Для выполнения команд войдите в контейнер register-runner:

# Запуск всех раннеров
gitlab-runner run

# Список раннеров
gitlab-runner list

# Проверка раннеров
gitlab-runner verify

# Удаление всех раннеров
gitlab-runner unregister --all-runners

# Удаление конкретного раннера
gitlab-runner unregister --name ${name_runner}

Пример настройки проекта с GitLab CI/CD

  1. Создайте новый проект в GitLab, по имени test
  2. Зарегистрируйте runner. Как это сделать было написано выше
  3. Клонируйте проект: git clone ssh://git@localhost:8822/root/test.git
  4. Добавьте файл main.py:
def main():
    print('Hello World')

main()
  1. Создайте файл .gitlab-ci.yml:
stages:
    - linting

variables:
    COMMIT_MESSAGE_PATTERN: "^.{0,10}:[[:space:]]#[0-9]{5,6}[[:space:]].{5,150}$"

.default_rules: &default_rules
    rules:
        - if: '$CI_COMMIT_BRANCH != "main" && $CI_PIPELINE_SOURCE == "merge_request_event"'

commit-name-test:
    stage: linting
    <<: *default_rules
    script:
        - |
            if [[ "$CI_COMMIT_MESSAGE" =~ $COMMIT_MESSAGE_PATTERN ]]; then
              echo "Корректный формат сообщения коммита"
            else
              echo "Некорректный формат: $CI_COMMIT_MESSAGE"
              exit 1
            fi

pylint:
    stage: linting
    <<: *default_rules
    image: python:3.9
    before_script:
        - pip install pylint
    script:
        - pylint **/*.py
  1. Создайте ветку: git checkout -b test_ci
  2. Закоммитьте изменения: git add -A && git commit -m "feat: #12345 Добавлен CI/CD пайплайн"
  3. Отправьте изменения: git push -u origin test_ci
  4. Создайте Merge Request в GitLab
  5. Проверьте выполнение пайплайна на вкладке "Сборочная линия"

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

@lexakimov
Copy link

lexakimov commented Aug 29, 2024

Привет. в разделе "Управление GitLab Runner" вроде ошибка

Для выполнения команд войдите в контейнер register-runner

должно быть

Для выполнения команд войдите в контейнер gitlab-runner

Ещё почему-то при выполнении docker-compose restart register-runner у меня не подтянулись значения из .env. Такой вариант сработал:

docker compose stop register-runner
docker compose up -d register-runner

@kosukhin
Copy link

kosukhin commented Dec 17, 2024

Добрый день следую вашей инструкции

Получаю такой результат
image

docker ps
выводит у меня 3 контейнера

e9af7df0c982   docker:20-dind                "dockerd-entrypoint.…"   31 minutes ago   Up 2 minutes                      2375-2376/tcp                                                                         gitlab-dind-1
63b93c628360   gitlab/gitlab-runner:alpine   "/usr/bin/dumb-init …"   31 minutes ago   Up 2 minutes                                                                                                            gitlab-gitlab-runner-1
241948f044fc   gitlab/gitlab-ce:latest       "/assets/wrapper"        31 minutes ago   Up 2 minutes (health: starting)   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp, 0.0.0.0:8822->22/tcp, [::]:8822->22/tcp   gitlab-gitlab-1

У вас написано

Для выполнения команд войдите в контейнер register-runner:

Но у меня нет контейнера register-runner

при выполнении docker compose up --build
получаю такие логи

register-runner-1  | Runtime platform                                    arch=amd64 os=linux pid=7 revision=374d34fd version=17.6.0
register-runner-1  | Running in system-mode.                            
register-runner-1  |                                                    
register-runner-1  | WARNING: Support for registration tokens and runner parameters in the 'register' command has been deprecated in GitLab Runner 15.6 and will be replaced with support for authentication tokens. For more information, see https://docs.gitlab.com/ee/ci/runners/new_creation_workflow 
register-runner-1  | ERROR: Registering runner... failed                 runner=GR1348941o1QkfGY3 status=couldn't execute POST against http://gitlab/api/v4/runners: Post "http://gitlab/api/v4/runners": dial tcp 172.19.0.2:80: connect: connection refused
register-runner-1  | PANIC: Failed to register the runner.  

Если позже выполняю команду - docker-compose restart register-runner
то регистрация успешно проходит ранера, но ничего не работает в пайплайне stuck написано

register-runner-1  | Registering runner... succeeded                     runner=Zmxrx-NV
gitlab-1           | 172.19.0.5 - - [17/Dec/2024:09:42:41 +0000] "POST /api/v4/runners HTTP/1.1" 201 67 "" "gitlab-runner 17.6.0 (17-6-stable; go1.22.7; linux/amd64)" -
register-runner-1  | Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

image

Пока не знаю куда копать

Возможно дело в том что я задал тэг ранеру shell-linux? попробую поменять на test

docker --version
Docker version 27.4.0, build bde2b89

@kosukhin
Copy link

kosukhin commented Dec 17, 2024

Да переименовал в .env в RUNNER_NAME=test убрал привязку к тэгу shell-linux в .gitlab-ci.yml
и прошел пайплайн

Screenshot

Плюс еще какая-то политика protected branch не дает запускать пайплайн на main ветке тк она protected я так понял.
поэтому я сделал отдельную ветку не protected и на ней запустилось

@6elkir
Copy link

6elkir commented Mar 24, 2025

При запуске раннера валится с ошибкой:

Running with gitlab-runner 17.10.0 (67b2b2db)
  on Common t1_JsbSV, system ID: r_Z[2](http://*****/-/jobs/4#L2)q6neIE6mOj
Preparing the "docker" executor
00:12
Using Docker executor with image docker:20-dind ...
Using helper image:  registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_6[4](http://*****/-/jobs/4#L4)-v17.10.0
Pulling docker image registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-v17.10.0 ...
WARNING: Failed to pull image with policy "always": failed to register layer: ApplyLayer exit status 1 stdout:  stderr: lchown /usr: no such file or directory (manager.go:2[5](http://*****/-/jobs/4#L5)4:11s)
ERROR: Job failed: failed to pull image "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x8[6](http://*****/-/jobs/4#L6)_64-v17.10.0" with specified policies [always]: failed to register layer: ApplyLayer exit status 1 stdout:  stderr: lchown /usr: no such file or directory (manager.go:254:11s)

@alexkag
Copy link

alexkag commented May 15, 2025

При запуске раннера валится с ошибкой:

Running with gitlab-runner 17.10.0 (67b2b2db)
  on Common t1_JsbSV, system ID: r_Z[2](http://*****/-/jobs/4#L2)q6neIE6mOj
Preparing the "docker" executor
00:12
Using Docker executor with image docker:20-dind ...
Using helper image:  registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_6[4](http://*****/-/jobs/4#L4)-v17.10.0
Pulling docker image registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-v17.10.0 ...
WARNING: Failed to pull image with policy "always": failed to register layer: ApplyLayer exit status 1 stdout:  stderr: lchown /usr: no such file or directory (manager.go:2[5](http://*****/-/jobs/4#L5)4:11s)
ERROR: Job failed: failed to pull image "registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x8[6](http://*****/-/jobs/4#L6)_64-v17.10.0" with specified policies [always]: failed to register layer: ApplyLayer exit status 1 stdout:  stderr: lchown /usr: no such file or directory (manager.go:254:11s)

Та же ошибка. Раннер поломан безнадежно.

@JbanS
Copy link

JbanS commented May 25, 2025

Была та же проблема с раннером. Помогло что-то из этого:

  1. После этого не заработало:
    Изменил в docker-compose.yml
  • CI_SERVER_URL=http://gitlab
    на
  • GITLAB_URL=http://"ip моего сервера":8000/
    и выполнил
    docker compose up --force-recreate -d
  1. После этого заработало:
docker compose stop register-runner
docker compose up -d register-runner

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment