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 .)'
}
}
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}*"
}
}
}
}
}
}
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