Дженкинс выполняет команду внутри контейнера? - PullRequest
1 голос
/ 30 марта 2020

Я хочу запустить конвейер Дженкинса в контейнере docker, как все тесты, выполнение сонарного сканирования и т. Д. c.

Вот так выглядит мой конвейер.

pipeline {  
    agent {
        docker { 
            image 'node:10-alpine' 
            args '-u root:root'
        }
    }

    stages {
        stage('Checkout') {
            steps {
                sh 'node --version; cat /proc/1/cgroup; touch /root/my_file' 
                checkout(...)
            }
        }
        stage('Run Unit Tests') {
            steps {
                sh ''' 
                    npm install --unsafe-perm
                '''
           }
      }
    }
}

Теперь в качестве вывода этого я вижу следующие журналы в консоли

+ cat /proc/1/cgroup
...
2:freezer:/docker/eeea802143ce0f1b4047650956e58624a0c38a5fbc601f189755a381dcf9c271
1:name=systemd:/docker/eeea802143ce0f1b4047650956e58624a0c38a5fbc601f189755a381dcf9c271

Это означает, что команда выполняется в контейнере docker. Также я вижу, что /root/my_file не существует на хосте.

Теперь, далее, я вижу следующий вывод

+ npm install --unsafe-perm
> libpq@1.8.8 install /home/jenkins/mount-dir/workspace/test-docker-pipeline/api/node_modules/libpq
> node-gyp rebuild

Теперь я вижу, что в журнале упоминается каталог, который присутствует на хосте.

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

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Все ваши команды выполняются внутри контейнера, как вы ожидаете. Так что все в порядке.

Что Дженкинс делает, так это подключает папку Workspace в том же месте внутри контейнера. Если вы проверите выходные данные своей консоли заданий, вы должны найти что-то вроде:

Docker 1 does not seem to be running inside a container
$ docker run -t -d -u 1002:1002 -w /home/jenkins/build/workspace/<my-project> -v   /home/jenkins/build/workspace/<my-project>:/home/jenkins/build/workspace/<my-project>:rw,z -v /home/jenkins/build/workspace/<my-project>@tmp:/home/jenkins/build/workspace/<my-project>@tmp:rw,z    $ docker top 8948be0b380b033f20cd8c27647b88719b47a237f839513ebf66a9693b4c2975 -eo pid,comm
Running in /home/jenkins/build/workspace/<my-project>

Опция -v выполняет привязку вашей Папки рабочего пространства с вашего хоста в то же место внутри работающего контейнера. Для получения дополнительной информации о возможности связывания Docker см. Официальную документацию по адресу: https://docs.docker.com/storage/bind-mounts/

Редактировать: Поскольку Pipeline 2.5 Jenkins Pipeline имеет встроенную поддержку Docker Изображения , Поэтому Docker Pipeline Plugin больше не нужен.

0 голосов
/ 31 марта 2020

После тщательного просмотра журналов конвейерного задания я увидел эту строку

$ docker run -t -d -u 1001:1001 -u root:root -w /home/jenkins/mount-dir/workspace/test-docker-pipeline -v /home/jenkins/mount-dir/workspace/test-docker-pipeline:/home/jenkins/mount-dir/workspace/test-docker-pipeline:rw,z -v /home/jenkins/mount-dir/workspace/test-docker-pipeline@tmp:/home/jenkins/mount-dir/workspace/test-docker-pipeline@tmp:rw,

Это команда docker run, используемая Дженкинсом. Здесь Дженкинс монтирует каталог по тому же пути. Поэтому, когда мы видим ссылку /home/jenkins/mount-dir/... в журналах, она действительно запускается в контейнере Docker, но фактическое хранилище монтируется на хосте Jenkins.

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