CONTINOUS DELIVERYWITH SBT
JENKINS, DOCKER, GATLING AND MORECreated by Wojciech Pituła
DEPLOYMENT PIPELINE
BENEFITSRepeatable deploysHistory of deploysNo knowledge needed to deployFast rollback to previous version
RELEASE STAGE
COMMIT> ...
> sbt test
> ...
> git push
JENKINS POLL
SBT RELEASEproject/plugins.sbt
addSbtPlugin("com.github.gseitz" % "sbtrelease" % "1.0.0")
shell> sbt release
jenkins
RELEASE PROCESSBUILD.SBT
import sbtrelease.ReleasePlugin.autoImport.ReleaseTransformations._releaseProcess := Seq[ReleaseStep]( checkSnapshotDependencies, inquireVersions, runTest, setReleaseVersion, commitReleaseVersion, tagRelease, ReleaseStep(releaseStepTask(publish in Docker)), publishArtifacts, setNextVersion, commitNextVersion, pushChanges)
inquireVersionsReleaseStep(releaseStepTask(publish in Docker))publishArtifactspushChanges
RELEASE: INQUIRE VERSIONSVERSION.SBT
version in ThisBuild := "0.1.40SNAPSHOT"
inquireVersionspublishArtifactsReleaseStep(releaseStepTask(publish in Docker))pushChanges
RELEASE: PUBLISH ARTIFACTSoptional
> sbt publish
inquireVersionspublishArtifactsReleaseStep(releaseStepTask(publish in Docker))pushChanges
BUILD.SBTpublishMavenStyle := truepublishArtifact in Test := falsepomIncludeRepository := _ => false publishTo := val nexus = "http://nexus.int.wpsa.pl/" if (isSnapshot.value) Some("snapshots" at nexus + "content/repositories/snapshots" else Some("releases" at nexus + "content/repositories/releases")
RELEASE: DOCKERplugins.sbt
addSbtPlugin("com.typesafe.sbt" % "sbtnativepackager" % "1.0.3")
shell> sbt docker:publish
inquireVersionspublishArtifactsReleaseStep(releaseStepTask(publish in Docker))pushChanges
BUILD.SBTenablePlugins(JavaAppPackaging)dockerBaseImage := "java:8"dockerRepository := Some("hub.docker.grupawp.pl/itrd")
RELEASE: PUSHPush bumped version and tag to origin
inquireVersionspublishArtifactsReleaseStep(releaseStepTask(publish in Docker))pushChanges
SUCCESS
TRIGGER NEXT STEP
ADD RELEASED_VER PARAMETER
TRIGGER BUILD WITH PARAMS
DEPLOY TO DEV
DEPLOY BUILD
DEPLOY SCRIPT#!/usr/bin/env bashset xueAPP_VERSION=$1HOST=$2APP_NAME=abtestsserviceDOCKER_IMAGE=hub.docker.grupawp.pl/itrd/abtestsservice:$APP_VERSIONshift 2RUN_OPTS=$@ssh t o StrictHostKeyChecking=no jenkinsci@$HOST << EOF docker pull $DOCKER_IMAGE docker stop $APP_NAME docker rm $APP_NAME docker run name $APP_NAME d p 8080:8080 $DOCKER_IMAGE $RUN_OPTSEOF# verify if docker is runningsleep 30ssh t o StrictHostKeyChecking=no jenkinsci@$HOST 'RUNNING=docker inspect format=" .State.Running " abtestsservice; [[ $RUNNING == "true" ]]'
MACHINE SETUPANSIBLE PLAYBOOK
hosts: all sudo: yes
tasks: name: install dockerengine yum: name=dockerengine state=present
name: create jenkins user user: name=jenkinsci groups=docker state=present shell=/bin/bash home=/opt/jenkinsci createhome=yes
name: Set up authorized_keys for the deploy user authorized_key: user=jenkinsci key=" item " with_file: id_rsa.pub_noweci id_rsa.pub
SUCCESS
TESTSTriggered automatically after deploy
GATLINGAn open-source load testing framework based on Scala,
Akka and Netty
High performanceReady-to-present HTML reportsScenario recorder and developer-friendly DSL
GATLING SCENARIOPut in src/it/scala
class AddAndDeleteSingleTestSimulation extends Simulation val httpConf = http.baseURL("some.url") val testScenario = scenario("AddAndGetSingleTest") .exec( http("PostNewTest") .post("some/endpoint") .header("ContentType", "application/json") .body(StringBody("body")) .check(status.is(201)) ) .exec( http("GetCreatedTest") .get("some/endpoint") .check(status.is(200), jsonPath("$.testDef.name").is(testName)) ) .exec( http("DeleteCreatedTest")
PLUGINS.SBTaddSbtPlugin("io.gatling" % "gatlingsbt" % "2.1.5")
BUILD.SBTenablePlugins(GatlingPlugin)configs(IntegrationTest, GatlingIt)Defaults.itSettings
20150909 12:38:33 +02:00, duration : 0 secondsGLOBAL DETAILS
> Global Information
Expand all groups | Collapse all groups
ASSERTIONS
Assertion
For all requests: count of failed requests is 0
STATISTICS
Executions Response Time (ms)
KO OK
0
1
Number of requestsNu
mber o
f Requests
t < 800 ms 800 ms < t < 1200ms
t > 1200 ms failed0
1
2
3
4
5
Indicators
addanddeletesingletestsimulation
Active Users
Requests / sec
Responses / sec
SUCCESS
DEPLOY TO PRODUCTIONExactly the same process like with DEV environment
TRIGGER MANUALLY
SUCCESS
DRAWBACKS AND PROBLEMSbinaries and config separationsmoke testsproduction db passworddata migration/schema updatesdeployment downtime
TRICKSbuild-name-setter
Top Related