Как загрузить из файла раздел Docker моего конвейера Jenkins (Jenkinsfile)? - PullRequest
0 голосов
/ 10 мая 2018

У меня есть несколько конвейеров, использующих Jenkinsfiles, которые получают образ докера из частного реестра.Я хотел бы иметь возможность загружать определенную информацию о докере в конвейеры из файла, чтобы мне не приходилось изменять все мои файлы Jenkinsfile при изменении метки док-станции или учетных данных.Я попытался сделать это, используя приведенный ниже пример jenkinsfile:

def common

pipeline {
   agent none
   options {
     timestamps()
   }
   stages {
    stage('Image fetch') {
     steps{
        script {
              common = load('/home/jenkins/workspace/common/docker_image')
              common.fetchImage()
        }
     }
  }
}

С docker_image, содержащим:

def fetchImage() {
  agent {
   docker {
    label “target_node ”
    image 'registry-url/image:latest'
    alwaysPull true
    registryUrl 'https://registry-url’
    registryCredentialsId ‘xxxxxxx-xxxxxx-xxxx’
   }
  }
}

При выполнении конвейера я получил следующую ошибку:

Обязательный класс контекста hudson.FilePath отсутствует. Возможно, вы забыли окружить код шагом, который обеспечивает это, например: node, dockerNode

Как я могу сделать это с помощью декларативного конвейера?

1 Ответ

0 голосов
/ 10 мая 2018

Есть несколько проблем с этим:

  1. Вы можете выделить node только на верхнем уровне

    pipeline {
      agent ...
    }
    

    Или вы можете использовать выделение узла для каждого этапа следующим образом:

    pipeline {
      agent none
      ....
      stages {
        stage("My stage") {
          agent ...
          steps {
            // run my steps on this agent
          }
        }
      }
    }
    

    Вы можете проверить документы здесь

  2. Предполагается, что steps будут выполняться на выделенном узле (или в некоторых случаях они могут выполняться вообще без выделения узла).

  3. Declarative Pipeline и Scripted Pipeline - это две разные вещи. Да, их можно смешивать, но scripted pipeline предназначено либо для абстрагирования некоторой логики в разделяемую библиотеку , либо для предоставления вам возможности стать «хардкорным мастером ниндзя» и полностью написать свой собственный пользовательский конвейер с использованием конвейера scripted и без сахара declarative.

Я не уверен, как настроено ваше Docker <-> Jenkins соединение, но вам, вероятно, будет лучше, если вы установите плагин и используете agent templates для предоставления необходимых вам агентов.

Если у вас есть Docker Swarm, вы можете установить Docker Swarm Plugin , а затем в своем конвейере вы можете просто настроить pipeline { agent { label 'my-agent-label' } }. Это автоматически обеспечит ваш Jenkins агентом в контейнере, который использует указанное вами изображение.

Если вы выставили /var/run/docker.sock своему Дженкинсу, то вы можете использовать И еще один подключаемый модуль Docker , который имеет ту же концепцию.

Таким образом, вы можете удалить конфигурацию агента в agent template, и ваш конвейер будет использовать label только для того, чтобы иметь агента, который ему нужен.

...