Jenkins: команды агента dockerfile не запускаются в контейнере - PullRequest
0 голосов
/ 27 декабря 2018

Это мой Jenkinsfile:

pipeline {
    agent {
        dockerfile true
    }

    stages {
        stage('Run tests') {
            steps {
                sh 'pwd'
                sh 'vendor/bin/phpunit'
            }
        }
    }
}

Я работаю в Jenkins, и хотя я могу успешно создать образ, «Выполнить тесты» запускается вне новогоКонтейнер в хосте.Это не хорошо;Я хочу, чтобы команда запускалась из нового контейнера, созданного с помощью агента dockerfile.

Я знаю, что команда оболочки запускается на хосте, потому что я уже попробовал отладку с sh pwd длякоторый я получил /var/jenkins_home/workspace/youtube-delete-tracker_jenkins.

Вот конец вывода в консоли для задания Jenkins:

Step 18/18 : RUN chmod a+rw database/
 ---> Using cache
 ---> 0fedd44ea512
Successfully built 0fedd44ea512
Successfully tagged e74bf5ee4aa59afc2c4524c57a81bdff8a341140:latest
[Pipeline] dockerFingerprintFrom
[Pipeline] }
[Pipeline] // stage
[Pipeline] sh
+ docker inspect -f . e74bf5ee4aa59afc2c4524c57a81bdff8a341140
.
[Pipeline] withDockerContainer
Jenkins does not seem to be running inside a container
$ docker run -t -d -u 112:116 -w /var/jenkins_home/workspace/ube-delete-tracker_stackoverflow -v /var/jenkins_home/workspace/ube-delete-tracker_stackoverflow:/var/jenkins_home/workspace/ube-delete-tracker_stackoverflow:rw,z -v /var/jenkins_home/workspace/ube-delete-tracker_stackoverflow@tmp:/var/jenkins_home/workspace/ube-delete-tracker_stackoverflow@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** e74bf5ee4aa59afc2c4524c57a81bdff8a341140 cat
$ docker top 64bbdf257492046835d7cfc17413fb2d78c858234aa5936d7427721f0038742b -eo pid,comm
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Run tests)
[Pipeline] sh
+ pwd
/var/jenkins_home/workspace/ube-delete-tracker_stackoverflow
[Pipeline] sh
+ vendor/bin/phpunit
/var/jenkins_home/workspace/ube-delete-tracker_stackoverflow@tmp/durable-4049973d/script.sh: 1: /var/jenkins_home/workspace/ube-delete-tracker_stackoverflow@tmp/durable-4049973d/script.sh: vendor/bin/phpunit: not found
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
$ docker stop --time=1 64bbdf257492046835d7cfc17413fb2d78c858234aa5936d7427721f0038742b
$ docker rm -f 64bbdf257492046835d7cfc17413fb2d78c858234aa5936d7427721f0038742b
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline

Как видите, pwd дает мне путь нахост (папка заданий Jenkins) и vendor/bin/phpunit не были найдены (что должно быть в контейнере, поскольку менеджер пакетов успешно скомпилировал его в соответствии с выводом сборки докера, который я не включил).

Так как мне запустить команды sh из контейнера?Или как получить имя тега изображения, сгенерированное агентом dockerfile, чтобы я мог вручную выполнить docker run из-за пределов нового контейнера для запуска нового контейнера?

ИНФОРМАЦИЯ: Проблема, похоже, не возникаетЯ имею в виду декларативные конвейеры, потому что я только что попытался сделать это в императивном стиле, а также получить тот же pwd контейнера Jenkins: https://github.com/amcsi/youtube-delete-tracker/blob/4bf584a358c9fecf02bc239469355a2db5816905/Jenkinsfile.groovy#L6

INFO 2: Сначала я думал, что это Jenkins-проблема в Docker, и я написал свой вопрос как таковой ... но оказалось, что у меня возникает та же проблема, если я запускаю Jenkins на своем хосте, а не в контейнере.

ИНФОРМАЦИЯ 3: Версии ...

Jenkins ver. 2.150.1
Docker version 18.09.0, build 4d60db4
Ubuntu 18.04.1 LTS

1 Ответ

0 голосов
/ 30 декабря 2018

РЕДАКТИРОВАТЬ:

Дженкинс монтирует свою локальную рабочую область в док-контейнер, и компакт-диск в него автоматически.Таким образом, WORKDIR, установленный в Dockerfile, перезаписывается.В выводе вашей консоли команда docker run показывает этот факт:

docker run -t -d -u 112:116 -w /var/jenkins_home/workspace/ube-delete-tracker_stackoverflow -v /var/jenkins_home/workspace/ube-delete-tracker_stackoverflow:/var/jenkins_home/workspace/ube-delete-tracker_stackoverflow:rw,z

Из справочной страницы запуска Docker (man docker run):

   -w, --workdir=""
      Working directory inside the container

Рабочим каталогом по умолчанию для запуска двоичных файлов внутри контейнера является корневой каталог (/).Разработчик может установить другое значение по умолчанию с помощью инструкции Dockerfile WORKDIR.Оператор может переопределить рабочий каталог с помощью параметра -w.

   -v|--volume[=[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]]
      Create a bind mount. 

Если вы укажете -v / HOST-DIR: / CONTAINER-DIR, Docker привязывает mounts / HOST-DIR на хосте к/ CONTAINER-DIR в контейнере Docker.Если «HOST-DIR» опущен, Docker автоматически создает новый том на хосте.ОПЦИИ представляют собой список с разделителями-запятыми и могут иметь следующий вид:

Итак, перед выполнением указанных команд вам необходимо вручную вставить компакт-диск в ваш собственный $ WORKDIR.Кстати, вы также можете создать символическую ссылку (ln -s) из jenkins volume mount dir на ваш собственный $ WORKDIR.Это позволяет вам просматривать рабочее пространство через пользовательский интерфейс Jenkins и т. Д.

Наконец, чтобы еще раз повторить для ясности, Jenkins запускает все этапы сборки в док-контейнере, если вы указали агент докера вверху.


Старый ответ:

Jenkins запускает все этапы сборки в док-контейнере, если вы указали агент докера вверху.Вы можете проверить, под каким исполнителем и ведомым выполняется сборка, используя переменные среды.

Итак, сначала найдите переменную окружения, специфичную для вашего ведомого устройства.Я использую NODE_NAME env var для этой цели.Вы можете узнать все доступные переменные окружения в вашем экземпляре Jenkins с помощью http://localhost:8080/env-vars.html (замените имя хоста на соответствующее вашему экземпляру).

...
stages {
    stage('Run tests') {
        steps {
            echo "I'm executing in node: ${env.NODE_NAME}"
            sh 'vendor /bin/phpunit'
        }
    }
}
...

Примечание относительно vendor/bin/phpunit was not found - похоже, этоиз-за опечатки, если я не ошибаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...