soldatov
@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 проекте.
  • Вопрос задан
  • 857 просмотров
Решения вопроса 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...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы