Files
homelab-jenkins-shared-libs/vars/dockerBuildPush.groovy
duynguyen 647a6f28a7 fix: also push :latest tag on every build
values.yaml image.tag defaults to 'latest' for initial deploy.
Pipeline always pushes both <branch>-<random8> and :latest so
ArgoCD can pull the newest image without a chart version bump.
2026-04-26 15:00:31 +07:00

44 lines
1.8 KiB
Groovy

/**
* Logs in to Harbor, builds and pushes a Docker image.
* Must be called inside container('docker') block.
* Returns the full image tag used (e.g. "main-a1b2c3d4").
*
* config keys:
* appName (required) - image name, e.g. 'tictactoe'
* registry (optional) - Harbor internal service, default: harbor-core.harbor.svc.cluster.local
* project (optional) - Harbor project, default: library
* credId (optional) - Jenkins credential id, default: harbor-credentials
* tag (optional) - image tag; auto-generated as <branch>-<random8> if not set
* dockerfile(optional) - path to Dockerfile, default: Dockerfile
* context (optional) - Docker build context, default: .
*/
def call(Map config) {
def appName = config.appName
if (!appName) error('dockerBuildPush: appName is required')
def registry = config.registry ?: 'harbor-core.harbor.svc.cluster.local'
def project = config.project ?: 'library'
def credId = config.credId ?: 'harbor-credentials'
def dockerfile = config.dockerfile ?: 'Dockerfile'
def context = config.context ?: '.'
def tag = config.tag ?: "${env.BRANCH_NAME.replaceAll('/', '-')}-${UUID.randomUUID().toString().take(8)}"
def fullImage = "${registry}/${project}/${appName}"
withCredentials([usernamePassword(
credentialsId: credId,
usernameVariable: 'HARBOR_USER',
passwordVariable: 'HARBOR_PASS'
)]) {
sh """
docker login ${registry} -u \${HARBOR_USER} -p \${HARBOR_PASS}
docker build -f ${dockerfile} -t ${fullImage}:${tag} ${context}
docker push ${fullImage}:${tag}
docker tag ${fullImage}:${tag} ${fullImage}:latest
docker push ${fullImage}:latest
"""
}
return tag
}