Познакомьтесь с GitLab CI Что такое Gitlab Ci?GitLab CI — это базовая функция CI/CD, добавленная GitLab для повышения своей роли в разработке программного обеспечения и улучшения концепции DevOps. Его можно легко интегрировать в процесс разработки программного обеспечения. Полные конвейеры CI/CD можно определить через GitLab CI. Преимущество
-
GitLab CI по умолчанию включен в GitLab, а наш код размещается с помощью GitLab, что упрощает интеграцию.
-
Фронтенд-интерфейс GitLab CI красивее и его легче принять.
-
Включает журналы сборки в реальном времени для удобного отслеживания
-
Используя архитектуру C/S, его можно масштабировать по горизонтали, при этом производительность не пострадает.
-
Настроен с использованием YAML, любой может легко использовать его
-
Все этапы выполняются по порядку, то есть когда один этап завершен, начинается следующий этап
-
Если какой-либо этап завершается сбоем, следующие этапы никогда не будут выполнены, а конвейер выйдет из строя.
-
Только когда все этапы будут завершены, PIPELINE завершится успешно.
-
Задания на одном этапе будут выполняться параллельно
-
Если какое-либо задание завершается сбоем, то происходит сбой Stage и сбой Pipeline.
-
Когда все задания на одном этапе выполняются успешно, этап считается успешным.
docker run --rm -t -i -v /path/to/config:/etc/gitlab-runner --name gitlab-runner gitlab/gitlab-runner register \ --executor "docker" \ --docker-image alpine:3 \ --url "https://gitlab.com/" \ --registration-token "PROJECT_REGISTRATION_TOKEN" \ --description "docker-runner" \ --tag-list "dev" \ --run-untagged \ --locked="true"скопировать кодПриведенный выше пример — это регистрация Runner в качестве контейнера, конечно, вы также можете запустить его непосредственно на физической машине. Регистрация на физической машине работает почти так же, как и в контейнере.sudo gitlab-runner register \ --non-interactive \ --url "https://gitlab.com/" \ --registration-token "PROJECT_REGISTRATION_TOKEN" \ --executor "docker" \ --docker-image alpine:3 \ --description "docker-runner" \ --tag-list "docker,aws" \ --run-untagged \ --locked="false" \скопировать код(Этот код взят из официальной документации)
Далее давайте рассмотрим типы бегунов, чтобы мы могли различать их при использовании.
тип
-
Поделился: бегун проходит рабочие места от всех неназначенных проектов
-
Группа: Runner запускает задания из всех неназначенных проектов в своей группе.
-
Конкретно: Runner запускает задания из назначенных проектов.
-
Заблокировано: Runner не может быть назначен другим проектам
-
Приостановлено: Runner не получит новых заданий
concurrent = 1check_interval = 0скопировать кодэти двое. Сравнивать нужно следующие:Глобальная конфигурация
-
concurrent: количество параллелизма, 0 не ограничено.
-
sentry_dsn: связанные с Sentry исключения могут быть собраны в Sentry.
-
Listay_address: раскрывает метрики для мониторинга прометея.
-
Shell
-
Docker (на этот раз общий контент)
-
Docker Machine и Docker Machine SSH (автомасштабирование)
-
Parallels
-
VirtualBox
-
SSH
-
Кубернетес (рекомендуется)
ОбзорDocker В Docker, называемом dind, при использовании GitLab CI часто можно использовать для сервисной части. dind означает, что контейнер Docker или демон Docker фактически работает в Docker. На самом деле, если вы просто выполняете команды Docker в Docker, вы можете установить бинарный файл. Но если вы хотите запустить демон Docker (например, вам нужно выполнить информацию о докере) или доступ к любому устройству запрещен. Docker предоставляет две очень важные опции — привилегированную и —устройство в команде запуска.Другие опции, такие как —cap-add и —cap-drop, также связаны с разрешениями, но сегодня они не в центре внимания. Таблица. Опция --device позволяет нам получить доступ к указанному устройству без опции --privived, например, docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk /dev/xvdc Но это это только ограниченные разрешения Мы знаем, что техническая реализация Docker на самом деле основана на изоляции ресурсов CGroup, но --device недостаточно, чтобы позволить нам иметь достаточно разрешений в контейнере для завершения запуска демона Docker. Примерно в 2013 году в Docker была добавлена опция --privived, позволяющая запускать контейнеры внутри контейнеров. Хотя первоначальная идея --privated заключалась в том, чтобы сделать контейнерную разработку более удобной, у некоторых людей могут возникнуть некоторые недоразумения при ее использовании. Иногда мы можем просто захотеть иметь возможность нормально создавать образы внутри контейнера или взаимодействовать с демоном Docker, например с образами Docker и другими командами. Ну, dind нам на самом деле не нужен, нам нужен Docker Out Of Docker, то есть dood, когда мы его используем, мы фактически монтируем docker.sock в контейнер. Например, используйте следующую команду:
sudo docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock taobeier/docker /bin/shскопировать кодВ контейнере могут быть обычные образы Docker и другие операции, которые следует учитывать при работе с контейнером, которые будут влиять на демон Docker на хосте.Как добиться
-
Создавайте группы и пользователей и добавляйте пользователей в группу. Используйте команды groupadd и useradd.
-
Обновите файлы subuid и subgid, чтобы настроить новых пользователей и группы в файлах /etc/subgid и /etc/subuid. subuid и subgid указывают, какие подчиненные идентификаторы разрешено использовать пользователю.
-
Затем вам нужно смонтировать /sys/kernel/security как тип securityfs, вы можете использовать команду mountpoint для проверки точки монтирования /sys/kernel/security Если это не точка монтирования, используйте mount -t securityfs none /sys/kernel /security для монтирования. Если он не монтируется успешно, вы можете проверить, не препятствует ли SELinux или AppArmor такому поведению. Для получения подробных сведений о проблемах безопасности здесь вы можете обратиться к Linux Модули безопасности (LSM).
-
Затем разрешите команде dockerd запустить демон, dockerd --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2375 для прослушивания демона docker на порту 2375. .
Практика бегунаПосмотрите на конфигурацию раздела Runner:
[[runners]] name = "docker" url = "https://gitlab.example.com/" token = "TOKEN" limit = 0 executor = "docker" builds_dir = "" shell = "" environment = ["ENV=value", "LC_ALL=en_US.UTF-8"] clone_url = "http://172.17.0.4"скопировать кодПо сетевым причинам clone_url можно настроить как доступный адрес, чтобы настроенный адрес использовался при клонировании кода. Фактический запрос: http://gitlab-ci-token:TOKEN@172.17.0.4/namespace/project.git.
Взгляните еще раз на конфигурацию runners.docker, эта часть повлияет на фактическую работу Docker:[runners.docker] host = "" hostname = "" tls_cert_path = "/home/tao/certs" image = "docker" dns = ["8.8.8.8"] privileged = false userns_mode = "host" devices = ["/dev/net/tun"] disable_cache = false wait_for_services_timeout = 30 cache_dir = "" volumes = ["/data", "/home/project/cache"] extra_hosts = ["other-host:127.0.0.1"] services = ["mongo", "redis:3"] allowed_images = ["go:*", "python:*", "java:*"]скопировать кодDNS, Privileged, extra_hosts, более важные службы, особенно при создании различных сетевых условий, требуют особого внимания. Что касается конфигурации устройств, начиная с уже упомянутого общего доступа Comin, разрешенных_изображений, то делается ограничение.
Несколько вышеперечисленных элементов конфигурации, используемые студентами Docker, должны быть просты для понимания. Смотрим пункты конфигурации Services:image: registry.docker-cn.com/taobeier/dockervariables: DOCKER_DRIVER: overlay2 # overlay2 is best bug need kernel >= 4.2services: - name: registry.docker-cn.com/taobeier/docker:stable-dind alias: dockerstages: - build - deploybuild_and_test: stage: build tags: - build script: # change repo #- sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories # 使用默认官方源 apk 耗时 7min 30s. 修改后 耗时 18s - ping -c 1 docker - ping -c 1 registry.docker-cn.com__taobeier__docker - ipaddr - apk add --no-cache py-pip # 使用默认耗时 1 min 15s. 修改后耗时 43s - pip install -i https://mirrors.ustc.edu.cn/pypi/web/simple docker-compose - docker-compose up -d - docker-compose run --rm web pytest -s -v tests/test_session.pydeploy: image: "registry.docker-cn.com/library/centos" stage: deploy tags: - deploy script: # install ssh client - 'ssh-agent || (yum install -y openssh-clients)' # run ssh-agent - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null # create ssh dir - mkdir -p ~/.ssh - chmod 700 ~/.ssh # use ssh-keyscan to get key - ssh-keyscan -p $SSH_PORT $DEPLOY_HOST >> ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts # - ssh -p $SSH_PORT $DEPLOY_USER@$DEPLOY_HOST ls - rm -rf .git - scp -r -P $SSH_PORT . $DEPLOY_USER@$DEPLOY_HOST:~/we/скопировать кодСуть Services заключается в использовании Docker'овской --link, давайте посмотрим, как это работает:Как работают исполнители Docker
-
Создайте сервис-контейнер (образ уже настроен в сервисе)
-
Создайте контейнер кеша (сохраните уже настроенный том в config.toml и Dockerfile для сборки образа)
-
Создайте контейнер сборки и контейнер службы для Link
-
Запустите контейнер сборки и отправьте скрипт задания в контейнер.
-
Скрипт для выполнения задания
-
Код оформления заказа: /builds/имя-группы/имя-проекта/
-
Выполните шаги, определенные в .gitlab-ci.yml
-
Проверьте код состояния после выполнения скрипта, если он не равен 0, сборка завершится неудачно.
-
Удаление сборочных и сервисных контейнеров
{ "auths": { "registry.example.com": { "auth": "5oiR5piv5byg5pmL5rab" } } }скопировать кодПростой способ заключается в том, что мы запускаем источник частного изображения для входа в систему на локальном сервере / сервере.После успешного входа в систему скопируйте содержимое файла ~/.docker/config.json непосредственно в качестве значения нашей переменной.
Или echo -n 'username:password' |base64, чтобы таким образом получить содержимое auth, собрать его в соответствующий формат и записать в value configuration GitLab.
Оптимизация производительности CI в производственных средахservices: - name: registry.docker-cn.com/taobeier/docker:stable-dindскопировать кодЧто является хозяином этого сервиса?
Хостом этого сервиса на самом деле станет register.docker-cn.com__taobeier__docker, тогда GitLab Runner не сможет его найти, и задание не выполнится.
Есть два решения, одно из них — добавить переменную.variables: DOCKER_HOST: "tcp://registry.docker-cn.com__taobeier__docker:2375"скопировать кодНо этот путь очень хлопотный, никто не может до конца вспомнить, что он встречает/превращает в _ неизбежные проблемы. Тогда есть второй способ:services: - name: registry.docker-cn.com/taobeier/docker:stable-dind alias: dockerскопировать кодДобавьте псевдоним. Этот метод редко используется в настоящее время, ведь первый способ встречается в Интернете, но этот способ самый простой.
вопросы и ответы