Avec Jenkins 2 est arrivé le pipeline DSL, voici un exemple d’utilisation avec GitLab, Docker, Sonar et Rancher.

Le plugin sonar de Jenkins ne gère pas (encore) le pipeline DSL. Pour Docker, il existe un plugin de chez CloudbeesDocker Pipeline DSL que je n’utilise pas.

node {
    // La version du Rancher-CLI
    def rancherCli = 'v0.8.6'

    stage 'Checkout'
    git credentialsId: '123456', url: 'git@gitlab.com:giwi/monApp.git'
    // on récupère les tags
    sh 'git fetch --tags' 
    // on récupère le dernier tag, et on incrémente le patch
    def version = version() 
    echo("Building $version")

    stage "Build $version" // Une étape de mon pipe
    sh './gradlew clean build -x test' // on compile

    stage "Test $version" 
    // on teste
    sh './gradlew test' 
    // les résultats Junit
    junit keepLongStdio: true, testResults: 'build/test-results/test/*.xml' 
    // les résultats Jacoco
    step([$class: 'JacocoPublisher', classPattern: 'build/jacoco/classpathdumps/', exclusionPattern: '**/test/**/*.class', execPattern: 'build/jacoco/**.exec', inclusionPattern: 'org/giwi/**/*.class', sourcePattern: 'src/main/java'])


    stage "Doc $version"
    // on génère de la doc d'API (cf l'excellent APIdoc)
    sh './gradlew apidoc -x test'
    // on génère un rapport d'activité Git
    sh 'git_stats generate -o docs/git'
    // la javadoc
    step([$class: 'JavadocArchiver', javadocDir: 'build/docs/javadoc/', keepAll: true])

    stage "Quality $version"
    // haha, on appelle Sonar mais via le build.gradle
    sh "./gradlew sonarqube -x test -Dsonar.projectVersion=$version -Dsonar.login=giwi -Dsonar.password=toto"

    stage "Docker $version"
    // On attend une confirmation utilisateur pendant 30 jours pour passer à la suite
    timeout(time: 30, unit: 'DAYS') {
        input 'Build docker ?'
    }
    // On build docker
    sh "docker build -t registry.gitlab.com/giwi/monApp:$version ."
    // On tague l'image
    sh "docker tag -f registry.gitlab.com/giwi/monApp:$version registry.gitlab.com/giwi/monApp"
    // Et on pushe sur le registry Gitlab
    sh "docker push registry.gitlab.com/giwi/monApp:$version"
    sh "docker push registry.gitlab.com/giwi/monApp"
    // On efface l'image locale intermédiaire
    sh "docker rmi registry.gitlab.com/giwi/monApp:$version"
    // On commite le nouveau tag Git
    sh "git tag -a $version -m \"$version\""
    sh "git push origin --tags"

    // Déploiement sur Eancher
    stage "Deploy $version in REC"
    sh "wget https://github.com/rancher/rancher-compose/releases/download/$rancherCli/rancher-compose-linux-amd64-$rancherCli"+ ".tar.gz"
    sh "tar -zxf rancher-compose-linux-amd64-$rancherCli"+".tar.gz"
    sh "rm -f rancher-compose-linux-amd64-$rancherCli"+".tar.gz"
    sh "cat > docker-compose.yml <<EOC\n" +
            "monApp:\n" +
            "  ports:\n" +
            "  - 8080:8080/tcp\n" +
            "  environment:\n" +
            "    ENV: REC\n" +
            "  log_driver: ''\n" +
            "  labels:\n" +
            "    io.rancher.container.pull_image: always\n" +
            "    io.rancher.container.dns: 'true'\n" +
            "  image: registry.gitlab.com/giwi/monApp:$version\n" +
            "  links:\n" +
            "  - db:mongo\n" +
            "  volumes:\n" +
            "  - /opt/monApp:/opt/monApp\n" +
            "  net: host\n" +
            "EOC"
    sh "./rancher-compose-$rancherCli/rancher-compose \\\n" +
            "--url  \\\n" +
            "--access-key 123456 \\\n" +
            "--secret-key 789123  \\\n" +
            "--project-name Stack-Giwi \\\n" +
            "up -d --force-upgrade monApp\n" +
            "./rancher-compose-$rancherCli/rancher-compose \\\n" +
            "--url  \\\n" +
            "--access-key 123456 \\\n" +
            "--secret-key 789123  \\\n" +
            "--project-name Stack-Giwi \\\n" +
            "up -d --upgrade --confirm-upgrade"
    sh "rm -f docker-compose.yml"
    sh "rm -fr rancher-compose-$rancherCli"
}


def version() {
    def v = sh(returnStdout: true, script: 'git describe --abbrev=0 --tags').trim().substring(1).tokenize('.').toArray()
    def gitVersion = [
            major: v[0].toInteger(),
            minor: v[1].toInteger(),
            patch: v[2].toInteger() + 1
    ]
    def version = 'v' + gitVersion.values().join('.')
    return version
}

Leave a Comment