@soldatov
Разработчик PHP

Объясните на пальцах, как приготовить CI с помощью GitLab, GitLab runner, docker, php?

Изучаю непрерывное интегрирование. Пытаюсь разобраться в базовых процессах и никак у меня в голове не сложится картина.

Дано:
1. Сервер где установлен GitLab, там лежит проект на PHP. Файл index.php с содержанием <?php phpinfo();.

2. Виртуальная машина с CentOS 7.
2.1. На ней установил docer.
bash

docker -v
Docker version 19.03.7, build 7141c199a2


2.2 Установил GitLab runner в виде отдельного контейнера по инструкции.
bash

docker run -d --name gitlab-runner --restart always \
  -v /docker/gitlab-runner/volumes/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest


2.3 Зарегистрировал runner в GitLab.
bash

docker run --rm -t -i -v /docker/gitlab-runner/volumes/config:/etc/gitlab-runner gitlab/gitlab-runner register


Получился такой конфиг.
config.toml

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "xxxRunner"
  url = "http://_xxx_/gitlab/"
  token = "_xxx_"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
  [runners.docker]
    tls_verify = false
    image = "alpine:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0


2.4 Стартую runner. В GitLab вижу его активным.

3. В проекте создал тестовый .gitlab-ci.yml файл:
.gitlab-ci.yml

job1:
  script:
    - php -v
job2:
  script:
    - php -v


После пуша и запуска pipelines, job падает с ошибкой. Наверно, потому что в контейнере runner нет php.
job

Running with gitlab-runner 12.8.0 (1b659122)
  on _xxx_Runner 50b311ce
Using Docker executor with image alpine:latest ...
Pulling docker image alpine:latest ...
Using docker image sha256:e7d92cdc71feacf90708cb59182d0df1b911f8ae022d29e8e95d75ca6a99776a for alpine:latest ...
Running on runner-50b311ce-project-8-concurrent-0 via 2333629aca2f...
Fetching changes...
Reinitialized existing Git repository in /builds/gitlab/_xxx_/_xxx_/.git/
From _xxx_
   2c41219..48aa22e  master     -> origin/master
Checking out 48aa22eb as master...

Skipping Git submodules setup
/bin/sh: eval: line 56: php: not found
$ php -v
ERROR: Job failed: exit code 127



На этой стадии застрял, не пойму что дальше.

Что нужно:
Контейнер с apache+php7 (не знаю какой выбрать). Внутри контейнера проект на php.
После пуша, нужно чтобы проект выкачался из гита, образ и контейнер пересобрались с обновлениями из master ветки.

Вопросы:
Правильно ли устанавливать gitlab runner в контейнер?
Правильная ли конфигурация gitlab runner?
Команды из .gitlab-ci.yml выполняются внутри контейнера раннера или хоста докера?
Если команды выполняются внутри runner контейнера, как мне выкачать проект из гита и положить его на хосте?
Как мне проект передать в другой контейнер с php, через volumes?

Подскажите, пожалуйста, простой рецепт, как настроить деплой на php проекте.
  • Вопрос задан
  • 246 просмотров
Решения вопроса 1
@akdes
Во первых, посоветую Вам взять тот-же alpine или любой другой docker image,

1. запустить у себя на компьютере
docker run -it *IMAGE* sh
или
docker run -it *IMAGE* bash
и установить всё необходимое для постройки. php, curl, composer.. в зависимости от проекта.

2. далее, на основе Ваших действий составить dockerfile
FROM image

RUN apk update && apk add php7-fpm curl...

3. С помощью COPY/ADD скопировать проект в контейнер (для симуляции процесса). И выполнить необходимое в контейнере для постройки проекта.

4. Необходимые команды скопировать в gitlab-ci.yaml

Учтите, если Вы хотите упаковывать Ваш проект в докер, к примеру для запуска в k8s, Вам необходимо использовать dind (docker in docker) либо gitlab runner должен работать напрямую, не в докер. Ибо в противном случае Вы не сможете запустить docker build ... в процессе CI/CD

Если команды выполняются внутри runner контейнера, как мне выкачать проект из гита и положить его на хосте?


При запуске runner'a, он сам "выкачивает" Ваш проект, это видно здесь:
Reinitialized existing Git repository in /builds/gitlab/_xxx_/_xxx_/.git/
From _xxx_
   2c41219..48aa22e  master     -> origin/master
Checking out 48aa22eb as master...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
UMA.TECH Москва
от 200 000 до 245 000 ₽
Yota Санкт-Петербург
от 170 000 до 250 000 ₽
от 140 000 до 160 000 ₽
08 апр. 2020, в 04:51
16000 руб./за проект
08 апр. 2020, в 00:40
15000 руб./за проект