make a deployment redownload an image with jenkins

1/29/2022

I wrote a pipeline for an Hello World web app, nothing biggy, it's a simple hello world page. I made it so if the tests pass, it'll deploy it to a remote kubernetes cluster.

My problem is that if I change the html page and try to redeploy into k8s the page remains the same (the pods aren't rerolled and the image is outdated).

I have the autopullpolicy set to always. I thought of using specific tags within the deployment yaml but I have no idea how to integrate that with my jenkins (as in how do I make jenkins set the BUILD_NUMBER as the tag for the image in the deployment).

Here is my pipeline:

pipeline {

agent any
environment 
{
	user = "NAME"
	repo = "prework"
	imagename = "${user}/${repo}"
	registryCreds = 'dockerhub'
	containername = "${repo}-test"
}

stages 
{
	stage ("Build")
	{
		steps {
		// Building artifact
			sh '''
			docker build -t ${imagename} .
			docker run -p 80 --name ${containername} -dt ${imagename}
			'''
			}
	}

	stage ("Test")
	{
		steps {
			sh '''

			IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${containername})
			STATUS=$(curl -sL -w "%{http_code} \n" $IP:80 -o /dev/null)

				if [ $STATUS -ne 200 ]; then
				echo "Site is not up, test failed"
				exit 1
				fi
				echo "Site is up, test succeeded"
			'''
		}
	}
	stage ("Store Artifact")
	{
		steps {
			echo "Storing artifact: ${imagename}:${BUILD_NUMBER}"
			script {
				docker.withRegistry('https://registry.hub.docker.com', 'dockerhub') {
    				def customImage = docker.image(imagename)
				customImage.push(BUILD_NUMBER)
				customImage.push("latest")
				}
			}
		}

	}
	stage ("Deploy to Kubernetes")
	{
		steps {

			echo "Deploy to k8s"
			script {
			kubernetesDeploy(configs: "deployment.yaml", kubeconfigId: "kubeconfig") }
			}
	}

}

post {
	always {

			echo "Pipeline has ended, deleting image and containers"
		sh '''
			docker stop ${containername}
			docker rm ${containername} -f
		'''
	}
}

}

EDIT: I used sed to replace the latest tag with the build number every time I'm running the pipeline and it works. I'm wondering if any of you have other ideas because it seems so messy right now. Thanks.

-- Nutz
cicd
deployment
devops
jenkins
kubernetes

1 Answer

2/10/2022

According to the information from Kubernetes Continuous Deploy Plugin p.6. you can add enableConfigSubstitution: true to kubernetesDeploy() section and use ${BUILD_NUMBER} instead of latest in deployment.yaml:

By checking "Enable Variable Substitution in Config", the variables (in the form of $VARIABLE or `${VARIABLE}) in the configuration files will be replaced with the values from corresponding environment variables before they are fed to the Kubernetes management API. This allows you to dynamically update the configurations according to each Jenkins task, for example, using the Jenkins build number as the image tag to be pulled.

-- Andrew Skorkin
Source: StackOverflow