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

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