Commit 192e6c19 authored by William Petit's avatar William Petit
Browse files

Build and publish image with Jenkins

Add a Jenkins pipeline to build and publish docker images
on the DockerHub.

The images are built on every branches but only pusblished on staging
and stable branches (i.e. develop and master by default).

Images are published with multiples tags:

- <image_name>:<short_commit_ref>
- <image_name>:<stable|staging>-latest
parent 23b99e2d
Pipeline #224 passed with stage
in 0 seconds
pipeline {
agent {
dockerfile {
filename 'Dockerfile'
dir 'ci'
args '--privileged -v /var/run/docker.sock:/var/run/docker.sock'
}
}
triggers {
gitlab(
triggerOnPush: true,
triggerOnMergeRequest: true,
branchFilterType: 'All',
cancelPendingBuildsOnUpdate: false
)
}
options {
gitLabConnection('Gitlab MIM')
gitlabBuilds(builds: [])
}
parameters {
string(defaultValue: "develop", description: 'Branche "staging"', name: 'stagingBranch')
string(defaultValue: "master", description: 'Branche "stable"', name: 'stableBranch')
}
environment {
IMAGE_NAME = "zephir-server-manager"
IMAGE_COMMIT_TAG = env.GIT_COMMIT.substring(0,8)
}
stages {
stage('Build image') {
steps {
gitlabStage(STAGE_NAME) {
withDockerHubCredentials {
sh """
# Construction de l'image
docker build -t '${DOCKER_USERNAME}/${IMAGE_NAME}' .
# Ajout du tag de commit
docker tag '${DOCKER_USERNAME}/${IMAGE_NAME}:latest' '${DOCKER_USERNAME}/${IMAGE_NAME}:${IMAGE_COMMIT_TAG}'
"""
}
}
}
}
stage('Publish staging image') {
when {
branch params.stagingBranch
}
steps {
gitlabStage(STAGE_NAME) {
addTagAndPublishDockerImage(
env.IMAGE_COMMIT_TAG,
"staging-latest"
)
}
}
}
stage('Publish stable image') {
when {
branch params.stableBranch
}
steps {
gitlabStage(STAGE_NAME) {
addTagAndPublishDockerImage(
env.IMAGE_COMMIT_TAG,
"stable-latest"
)
}
}
}
}
}
def gitlabStage(String stageName, Closure fn) {
gitlabBuilds(builds: [stageName]) {
gitlabCommitStatus(stageName) {
fn()
}
}
}
def withDockerHubCredentials(Closure fn) {
withCredentials([
usernamePassword(credentialsId: 'dockerhub', usernameVariable: 'DOCKER_USERNAME', passwordVariable: 'DOCKER_PASSWORD')]
){
fn()
}
}
def addTagAndPublishDockerImage(String originalTag, String newTag) {
withDockerHubCredentials {
sh """
# Ajout du nouveau tag
docker tag '${DOCKER_USERNAME}/${IMAGE_NAME}:${originalTag}' '${DOCKER_USERNAME}/${IMAGE_NAME}:${newTag}'
# Publication de l'image sur le DockerHub
echo "${DOCKER_PASSWORD}" | docker login --username '${DOCKER_USERNAME}' --password-stdin
docker push '${DOCKER_USERNAME}/${IMAGE_NAME}:${newTag}'
docker push '${DOCKER_USERNAME}/${IMAGE_NAME}:${originalTag}'
docker logout
"""
}
}
\ No newline at end of file
FROM docker:stable
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment