У меня есть настройка 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, но это другая проблема.