Назад | Перейти на главную страницу

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

У меня есть настройка Jenkinsfile во внутреннем проекте, который использует настраиваемый jenkins/slave build, где я добавляю nvm и Node 12 для выполнения сборки. Пользовательский образ находится во внутреннем экземпляре Harbour, который я запускал в моем кластере Kubernetes. Кажется, все идет нормально, пока не начнутся этапы конвейера. Все папки / файлы / приложения, которые я установил как часть моего пользовательского jenkins/slave пропал, отсутствует.

Dockerfile для моего jenkins/slave выглядит так:

FROM jenkins/slave

MAINTAINER xxx

USER root

RUN apt-get update && apt-get install -y build-essential libssl-dev curl apt-transport-https ca-certificates software-properties-common

RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
RUN apt update && apt install docker-ce-cli

RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs

RUN mkdir /version_1.2.0

USER jenkins
RUN which node
RUN which npm
RUN node --version
RUN npm --version
RUN echo $PATH

И мой Jenkinsfile:

pipeline {
  agent {
    kubernetes {
      label 'jenkins-slave-build'
      yaml """
kind: Pod
metadata:
  name: jenkins-slave-build
spec:
  containers:
  - name: jenkins-slave
    image: harbor.mydomain.com/library/custom/jenkinsslave:latest
    imagePullPolicy: Always
    tty: true
  restartPolicy: Never
"""
    }
  }
  stages {
    stage('Test') {
      steps {
        echo 'Testing..'
        sh 'ls -lart /'
        sh 'npm --version'
        sh 'node --version'
      }
    }
    ...
  }
}

Когда я запускаю конвейер, я вижу, что он извлекает изображение из Harbour, он печатает то, что выглядит как правильный YAML для модуля в выводе консоли для сборки, и я могу видеть, как модуль запускается в Kubernetes, если я выполняю kubectl get pods --watch. В моем Jenkinsfile я пытаюсь сделать ls в корне, который должен содержать папку version_1.2 но эта папка отсутствует. Также я пробовал делать npm --version и node --version, но те не говорят, что приложения не установлены. В настоящее время я думаю, что конвейер работает на главном устройстве Jenkins, а не на подчиненном модуле. Я также пробовал использовать только node:12.16.1 образ докера, но он дал точно такие же результаты.

Для тех, кто смотрит на это в будущем ... кажется, что подчиненные устройства Jenkins имеют свои тома, когда они работают ??? По крайней мере, это то, что я нашел в нескольких сообщениях. Это объясняет, почему моих установленных инструментов нет, и почему в моей корневой папке отсутствует тестовая папка "версия_1.2", которую я создал там.

Чтобы исправить проблему NPM, мне просто нужно было установить подключаемый модуль NodeJS (тот, в котором в описании указано «Подключаемый модуль NodeJS выполняет сценарий NodeJS как этап сборки»), настроить установку NodeJS в Global Tools, затем добавить:

tools { nodejs: "whatever_you_called_it_in_global_tools" }

Это приведет к тому, что настроенная вами версия NodeJS будет установлена ​​на ведомом устройстве перед запуском. Мне все еще не хватает make и docker, поэтому мой CI / CD все еще не на 100%, но я уверен, что эти две проблемы схожи, и мне просто нужно выяснить, какие плагины добавляют make и docker cli, и также установить их.

редактировать Работая над этим больше, я пришел к лучшему решению вышеперечисленного, чем принудительная установка инструмента. Похоже, что окружая stepс в container('label') { ... }, где "label" - это ярлык, который вы даете своему агенту, заставляет его работать.

Однако я все еще застрял в том, чтобы заставить Docker пометить и отправить изображения на мой внутренний сервер Harbour, но это другая проблема.