I have a Jenkinsfile setup in an internal project that uses a custom jenkins/slave
build where I add nvm and Node 12 to perform the build. The custom image is in an internal Harbor instance I have running within my Kubernetes cluster. Everything seems to start fine, until it starts performing the pipeline steps. All the folders/files/applications I installed as part of my custom jenkins/slave
is missing.
The Dockerfile for my jenkins/slave
looks like this:
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
And my 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'
}
}
...
}
}
When I run the pipeline I can see it pull the image from Harbor, it prints what looks like a correct YAML for the pod in the console output for the build, and I can see the pod spin up in Kubernetes if I do a kubectl get pods --watch
. In my Jenkinsfile I try to do an ls
at root, which should contain a folder version_1.2
but that folder is missing. Also I tried doing npm --version
and node --version
, but those fail saying the apps are not installed. My current thinking is that the pipeline is running on the Jenkins master, not the slave pod. I also tried using just the node:12.16.1
docker image as well, but that had the exact same results.
To those looking at this in the future...it seems that the Jenkins slaves have their volumes mounted over when they run??? At least, that's what a few posts I found seemed to suggest. This explains why my installed tools are not there, and why my root folder is missing the test "version_1.2" folder I made there.
To fix the NPM issue I simply had to install the NodeJS Plugin (the one that says "NodeJS Plugin executes NodeJS script as a build step." in the description), configure the NodeJS install in Global Tools, then add:
This will cause the version of NodeJS you configure to be installed in the slave prior to running. I am still missing make and docker, so my CI/CD is still not 100%, but I am certain those 2 issues are similar and I just need to figure out which plugins add make and the docker cli and get those installed as well.
Edit Working on this more, I have come to a better solution to the above than to force the tool installation. It appears that by surrounding the
step
s incontainer('label') { ... }
, where "label" is the label you give your agent, causes it to work.I am still stuck, however, in getting Docker to tag and push the images up to my internal Harbor server, but that's another issue.