Jenkins Pipeline Image.inside запускает команду оболочки в рабочей области, а не внутри контейнера - PullRequest
0 голосов
/ 03 мая 2020

У меня возникли проблемы с подключением моего конвейера Jenkins к тому, что должно быть простым сценарием.

Я использую DockerDesktop для запуска образа Jenkins (https://hub.docker.com/r/jenkinsci/blueocean/). У меня есть стандартное приложение реагирования, которое я хочу создавать и запускать тесты после моих коммитов.

Конфигурации Webhooks уже работают, но команды, которые я запускаю в моем Jenkinsfile, похоже, не работают так, как я ожидал:

Это мой текущий Jenkinsfile:

node {
def app

stage('Clone repository') {
    checkout scm
}

stage('Build image') {
    app = docker.build("getintodevops/hellonode", "-f Dockerfile.dev ./")
}

stage('Test image') {
    app.inside {
        sh 'pwd'
        sh 'npm run build'
    }
}

}

Dockerfile-dev выглядит так:

FROM node:alpine

COPY ./package.json ./
RUN ["npm", "install"]
COPY ./src/ ./src/
COPY ./public/ ./public/

я ожидал, что Команды внутри стадии (тестовое изображение) будут выполняться внутри контейнера с изображением, которое я только что создал, но команда pwd показывает, что команды exe c находятся внутри рабочей области jenkins, связываясь в основном с то, что я зафиксировал на github (/ sr c, / publi c, package. json e cc ..), поэтому, когда запускается npm run build, я получаю сообщение об ошибке отсутствия узлов_модулей.

Я что-то упустил? Разве команды не должны запускаться на встроенном образе, который, как я проверял, имеет все необходимые папки?

Дайте мне знать, если необходимы другие файлы или конфигурации, которые я использую

PS Я также пытался использовать этот тип Jenkinsfile, но у меня всегда одна и та же проблема (даже если агент определен вне сцены):

pipeline {
  agent none

  stages {
    stage('Build') {
      agent{
        dockerfile {
          filename 'Dockerfile.dev'
        }
      }

      steps {
        sh "npm run build"
      }
    }

1 Ответ

0 голосов
/ 03 мая 2020

Я что-то упустил? Разве команды не должны запускаться на встроенном образе, который, как я проверял, имеет все необходимые папки?

Да. Я попытаюсь объяснить немного о той части, которую вам не хватает.

Когда конвейер Jenkins запускает сцену как контейнер Docker, он делает пару вещей за сценой:

  • Рабочая область монтируется в контейнер во время выполнения (как вы заметили).
  • Рабочая папка устанавливается в эту папку рабочей области (поэтому команды показывают файлы вашей рабочей области в контейнере).
  • Контейнер запускается с идентификатором пользователя Jenkins.
  • Различные другие опции передаются в контейнер (например, переменные среды).

Зная это, Есть два возможных решения, которые вы можете сделать (и у каждого из них есть свои плюсы и минусы):

Вариант 1

Вы можете игнорировать node_modules и код в контейнере и, по сути, просто использовать его как NodeJS среда. В этом случае ваш конвейер Jenkins будет отвечать за выполнение npm install и других тестовых команд. Это сохранит node_modules в вашем рабочем пространстве. Но у вас также будет встроенный образ контейнера, который потенциально может быть развернут где-то.

Это также потенциально помогает решить проблемы, в которых node_modules содержит двоичные файлы, которые потенциально могут различаться в образе Jenkins Docker (который, я считаю, основан на однако в Debian есть альпийский вариант).

Вариант 2

Если вы не хотите, чтобы рабочее пространство Jenkins было источником правды, вам нужно go в расположение node_modules в контейнере. Похоже, это просто / в соответствии с вашим Dockerfile. Вы можете изменить свои шаги так, чтобы они находились внутри dir, например:

pipeline {
  agent none

  stages {
    stage('Build') {
      agent {
        dockerfile {
          filename 'Dockerfile.dev'
        }
      }

      steps {
        dir("/") {
          sh "npm run build"
        }
      }
    }
  }
}

Вариант 2 имеет потенциальные проблемы с разрешениями, поскольку ваше изображение Docker создает и создает файлы как root, но конвейер Jenkins будет работать как пользователь Jenkins.

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