Skip to content

Instantly share code, notes, and snippets.

@LiberQuack
Last active August 20, 2018 17:38
Show Gist options
  • Save LiberQuack/fa7ad7dce1e37d125e619b3dbbe061a5 to your computer and use it in GitHub Desktop.
Save LiberQuack/fa7ad7dce1e37d125e619b3dbbe061a5 to your computer and use it in GitHub Desktop.
Recipes for configuring jenkins pipelines

Jenkins stage recipes

AWS Bucket Deploy
stage('deploy-hml') {
    agent { docker { image 'garland/docker-s3cmd' } }
    environment {
        BUCKET = 's3://hml.roteamentooi.com.br'
        AWS_KEY = '<KEY>'
        AWS_SECRET = '<SECRET>'
    }
    steps {
        sh '''cd dist && s3cmd --access_key=${AWS_KEY} --secret_key=${AWS_SECRET} put * --recursive --acl-public ${BUCKET}'''
        slackSend channel: '#ci', color: '#36a64f', message: "*${projectName}* deployado em *hml* ${notifyUsers} / referente commit de *${author}*"
    }
}

Tomcat Deploy
stage('deploy-hml') {
    when { branch "develop" }
    agent { docker { image 'jeanlaurent/httpie'} }
    steps {
        sh '''
           http --auth ${TOMCAT_USER_10_25_4_18}:${TOMCAT_PSW_10_25_4_18} PUT 'http://10.25.4.18:7080/manager/text/deploy?update=true&path=/package' < package.war |
           grep 'OK - Deployed application'
           '''
        slackSend channel: '#ci', color: '#36a64f', message: "*${projectName}* deployado em *hml* ${notifyUsers} / referente commit de *${author}*"
    }
}

Archive stage
stage('archive') {
    agent { node { label 'master' } }
    steps {
        sh 'docker cp $(docker-compose -f docker-compose-test.yml ps -q chrome):/data/. ./recording'
        archiveArtifacts "recording/**/*"
        sh 'rm -rf recording'
    }
}

Node install dependencies
stage('install') {
    agent { docker { image 'node' } }
    steps {
        sh 'npm install'
    }
}

Http Request - See Plugin Info
steps {
    httpRequest url: 'http://localhost:8059/api/messages', httpMode: 'POST', requestBody: '{"potato":"chuchu"}', validResponseCodes: '100:999'
}

Zip files
stage('zip') {
    agent { docker { image 'fuww/alpine-zip'} }
    steps {
        sh '(cd dist; zip -r ../package.zip .)'
    }
}

Jenkinsfile recipes

Pipeline for Docker Projects
pipeline {
    agent none
    options { skipDefaultCheckout() }
    triggers {
        bitbucketPush()
        githubPush()
    }
    stages {
        stage('checkout') {
            agent { node { label 'master' } }
            steps {
                script {
                    remote = scm.userRemoteConfigs[0]
                    checkout([$class: 'GitSCM', branches: scm.branches, userRemoteConfigs: [[refspec: '+refs/pull/*/head:refs/remotes/origin/PR-* +refs/heads/*:refs/remotes/origin/*', url: remote.url, credentialsId: remote.credentialsId]]])
                    author = (sh(returnStdout: true, script: 'git show --no-patch --format="%an" HEAD')).trim()
                    notifyUsers = '@tmartins' //'<@USER_SLACKID>'
                    projectName = (currentBuild?.rawBuild?.project?.parent?.displayName ?: env.JOB_NAME).replaceAll(/\/.*/, '')
                    dockerImageName = "martinsthiago/${projectName}"
                    dockerImageTag = "${env.BRANCH_NAME}-${env.BUILD_NUMBER}"
                    cmmtsAheadDev = (sh(returnStdout: true, script: "git log origin/master ^origin/develop --no-merges --pretty=format:'%h - %s'")).trim()
                    cmmtsAheadDev && slackSend(channel: '#ci', color: '#ffbc00', message: "${notifyUsers} - *${projectName} has commits in master not present in develop* \n```$cmmtsAheadDev```")
                    cmmtsBehindDev = (sh(returnStdout: true, script: "git log origin/develop ^origin/${env.BRANCH_NAME} --no-merges --pretty=format:'%h - %s'")).trim()
                    cmmtsBehindDev && slackSend(channel: '#ci', color: '#ffbc00', message: "${notifyUsers} - *${projectName} has commits in develop not present in ${env.BRANCH_NAME}* \n```$cmmtsBehindDev```")
                    slackSend channel: '#ci', color: '#36a64f', message: "Iniciando build de *${projectName}* / referente commit de *${author}*"
                }
            }
        }
        stage('test') {
            agent { node { label 'master' } }
            steps {
                sh 'docker-compose -f docker-compose-test.yml down && docker-compose -f docker-compose-test.yml up --abort-on-container-exit --build -t 30'
            }
        }
        stage('deploy-hml') {
            when { branch "develop" }
            agent { node { label 'master' } }
            steps {
                script {
                    docker.withRegistry(env.DOCKER_REGISTRY, env.DOCKER_REGISTRY_LOGIN) {
                        image = docker.build(dockerImageName)
                        image.push(dockerImageTag)
                        slackSend channel: '#ci', color: '#1B63B5', message: "${notifyUsers} o projeto *${projectName}* necessita de <${env.RUN_DISPLAY_URL}|aprovação> para deploy / referente commit de *${author}*"
                        input "Proceed Deploy to Homologation?"
                        sh """
                           docker container rm -f ${projectName}_develop &> /dev/null || echo "No container removal needed"
                           docker container run -d --restart always --name ${projectName}_develop ${image.imageName()}:${dockerImageTag}
                           """
                        slackSend channel: '#ci', color: '#36a64f', message: "*${projectName}* deployado em *hml* ${notifyUsers} / referente commit de *${author}*"
                    }
                }
            }
        }
        stage('deploy') {
            when { branch "master" }
            agent { node { label 'master' } }
            steps {
                script {
                    docker.withRegistry(env.DOCKER_REGISTRY, env.DOCKER_REGISTRY_LOGIN) {
                        image = docker.build(dockerImageName)
                        image.push(dockerImageTag)
                        image.push('latest')
                        slackSend channel: '#ci', color: '#1B63B5', message: "${notifyUsers} o projeto *${projectName}* necessita de <${env.RUN_DISPLAY_URL}|aprovação> para deploy / referente commit de *${author}*"
                        input "Proceed Deploy to Production?"
                        sh """
                           docker container rm -f ${projectName} &> /dev/null || echo "No container removal needed"
                           docker container run -d --restart always --name ${projectName} -p 8059:8059 ${image.imageName()}:${dockerImageTag}
                           """
                        slackSend channel: '#ci', color: '#36a64f', message: "*${projectName}* deployado em *prd* ${notifyUsers} / referente commit de *${author}*"
                    }
                }
            }
        }
    }
}

Werckerfile recipes

Pipeline with services
services:
  - name: DB
    id: postgres:10
    env:
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: security
  - name: CACHE
    id: redis:3

build:
  box: busybox
  steps:
    - script:
      name: "Wait services"
      box: busybox
      code: |
        while ! sh -c "busybox nc DB 5432"; do echo "Waiting DB"; sleep 1; done;
        while ! sh -c "busybox nc CACHE 6379"; do echo "Waiting CACHE"; sleep 1; done;

test:
  box: maven
  steps:
    - script:
      name: "Prepare vars for testing"
      code: |
        export DB_HOST="DB"
        export REDISDB_HOST="CACHE"
    - script:
      name: "Test"
      code: mvn test

image:
  box: busybox
  steps:
    - internal/docker-build:
        image-name: ssq_security

deploy-stage:
  box: martinsthiago/docker-client
  steps:
    - add-to-known_hosts:
        hostname: 206.189.226.229
    - add-ssh-key:
        keyname: WERCKER
    - script:
        name: stage deploy
        code: |
          export IMAGE_NAME="martinsthiago/rangs-api:`git describe --tags`"
          rdocker "root@206.189.226.229" \
                  docker-compose --project-name ssq_security -f docker-compose-stage.yml up -d --force-recreate
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment