pipeline { agent any environment { REGISTRY = 'registry.example.com/docker-images' } stages { stage('Detect changed images') { steps { script { def base = env.CHANGE_TARGET ? "origin/${env.CHANGE_TARGET}" : "HEAD~1" def changed = sh( script: "git diff --name-only ${base} HEAD | cut -d/ -f1 | sort -u", returnStdout: true ).trim().split('\n') // keep only dirs containing a Dockerfile env.IMAGES_TO_BUILD = changed.findAll { fileExists("${it}/Dockerfile") }.join(',') } } } stage('Build & push') { when { expression { env.IMAGES_TO_BUILD } } steps { script { def shortSha = env.GIT_COMMIT.take(8) env.IMAGES_TO_BUILD.split(',').each { img -> def tag = "${REGISTRY}/${img}" sh """ docker build \ --label org.opencontainers.image.source=${env.GIT_URL} \ --label org.opencontainers.image.revision=${env.GIT_COMMIT} \ -t ${tag}:${shortSha} \ ${img}/ """ if (env.BRANCH_NAME == 'main') { sh """ docker tag ${tag}:${shortSha} ${tag}:latest docker push ${tag}:${shortSha} docker push ${tag}:latest """ } } } } } } }