Changes in the environment scripts

Changes to the start test environment script

The new deployment in the start.js script have to look like the following snippet:

...
var version = $ENV.VERSION;
var kubectl = $ENV.KUBECTL;

var name = "battleapp";
var image = "disruptor.ninja:30500/robertbrem/battleapp:" + version;
var replicas = 1;
var port = 8080;
var clusterPort = 8088;
var nodePort = 31080;
var deploymentFileName = "deployment.yml";
var serviceFileName = "service.yml";
var registrysecret = "registrykey";
var url = "http://disruptor.ninja:31080/battleapp/resources/health";
var timeout = 2;
var realmName = "battleapp";
var authServerUrl = "https://disruptor.ninja:31182/auth";
var cassandraHost = "cassandra";
var namespace = "test";
var keycloakMasterClientId = "master";
...
var dfw = new FileWriter(deploymentFileName);
dfw.write("apiVersion: extensions/v1beta1\n");
dfw.write("kind: Deployment\n");
dfw.write("metadata:\n");
dfw.write("  name: " + name + "\n");
dfw.write("  namespace: " + namespace + "\n");
dfw.write("spec:\n");
dfw.write("  replicas: " + replicas + "\n");
dfw.write("  template:\n");
dfw.write("    metadata:\n");
dfw.write("      labels:\n");
dfw.write("        name: " + name + "\n");
dfw.write("    spec:\n");
dfw.write("      containers:\n");
dfw.write("      - resources:\n");
dfw.write("        name: " + name + "\n");
dfw.write("        image: " + image + "\n");
dfw.write("        ports:\n");
dfw.write("        - name: port\n");
dfw.write("          containerPort: " + port + "\n");
dfw.write("        env:\n");
dfw.write("        - name: KEYCLOAK_MASTER_CLIENT_ID\n");
dfw.write("          value: \"" + keycloakMasterClientId + "\"\n");
dfw.write("        - name: KEYCLOAK_MASTER_USER_NAME\n");
dfw.write("          valueFrom:\n");
dfw.write("            secretKeyRef:\n");
dfw.write("              name: keycloak-master\n");
dfw.write("              key: username\n");
dfw.write("        - name: KEYCLOAK_MASTER_PASSWORD\n");
dfw.write("          valueFrom:\n");
dfw.write("            secretKeyRef:\n");
dfw.write("              name: keycloak-master\n");
dfw.write("              key: password\n");
dfw.write("        - name: REALM_NAME\n");
dfw.write("          value: \"" + realmName + "\"\n");
dfw.write("        - name: AUTH_SERVER_URL\n");
dfw.write("          value: \"" + authServerUrl + "\"\n");
dfw.write("        - name: CASSANDRA_ADDRESS\n");
dfw.write("          value: \"" + cassandraHost + "\"\n");
dfw.write("      imagePullSecrets:\n");
dfw.write("      - name: " + registrysecret + "\n");
dfw.close();
...

We're using a new secret that we've to create:

kc create secret generic keycloak-master --from-literal=username=admin --from-literal=admin

Changes to the start canary script

Similar to the test environment script we've to extend the deployment in the canary with the following parts:

...
var keycloakMasterClientId = "master";
...
dfw.write("        - name: KEYCLOAK_MASTER_CLIENT_ID\n");
dfw.write("          value: \"" + keycloakMasterClientId + "\"\n");
dfw.write("        - name: KEYCLOAK_MASTER_USER_NAME\n");
dfw.write("          valueFrom:\n");
dfw.write("            secretKeyRef:\n");
dfw.write("              name: keycloak-master\n");
dfw.write("              key: username\n");
dfw.write("        - name: KEYCLOAK_MASTER_PASSWORD\n");
dfw.write("          valueFrom:\n");
dfw.write("            secretKeyRef:\n");
dfw.write("              name: keycloak-master\n");
dfw.write("              key: password\n");
...

Changes to the pipeline

The Jenkisnfile has to be changed to the following:

withEnv([   "VERSION=1.0.${currentBuild.number}",
            "REGISTRY_EMAIL=brem_robert@hotmail.com",
            "KUBECTL=kubectl",
            "HOST=disruptor.ninja",
            "REALM_NAME=battleapp",
            "KEYCLOAK_URL=https://disruptor.ninja:31182/auth",
             "PORT=31080"]) {

  stage "checkout, build, test and publish"
  node {
    git url: "http://disruptor.ninja:30130/rob/battleapp"
    def mvnHome = tool 'M3'
    sh "${mvnHome}/bin/mvn clean install"
    sh "./build.js"
  }

  stage "start test environment"
  node {
    git url: "http://disruptor.ninja:30130/rob/battleapp-starttestenv"
    sh "./start.js"
  }

  stage "system test"
  node {
    git url: "http://disruptor.ninja:30130/rob/battleapp-st"
    def mvnHome = tool 'M3'
    sh "${mvnHome}/bin/mvn clean install failsafe:integration-test failsafe:verify"
    step([$class: 'JUnitResultArchiver', testResults: '**/target/failsafe-reports/TEST-*.xml'])
  }

  stage "ui test"
  node {
    git url: "http://disruptor.ninja:30130/rob/battleapp-uit"
    def mvnHome = tool 'M3'
    sh "${mvnHome}/bin/mvn clean install failsafe:integration-test failsafe:verify"
    step([$class: 'JUnitResultArchiver', testResults: '**/target/failsafe-reports/TEST-*.xml'])
  }

  stage "last test"
  node {
    git url: "http://disruptor.ninja:30130/rob/battleapp-lt"
    def mvnHome = tool 'M3'
    sh "${mvnHome}/bin/mvn clean verify -Dperformancetest.webservice.host=disruptor.ninja -Dperformancetest.webservice.port=31080 -Dperformancetest.webservice.threads=5 -Dperformancetest.webservice.iterations=500 -Dperformancetest.webservice.url=/battleapp/resources/health"
    archiveArtifacts artifacts: 'target/reports/*.*', fingerprint: true
  }

  stage "consumer driven contract test"
  node {
    git url: "http://disruptor.ninja:30130/rob/battleapp-cdct"
    def mvnHome = tool 'M3'
    sh "${mvnHome}/bin/mvn clean install failsafe:integration-test failsafe:verify"
    step([$class: 'JUnitResultArchiver', testResults: '**/target/failsafe-reports/TEST-*.xml'])
  }

  stage "manual testing"
  input "everything ok?"

  stage "start canary"
  input "deploy the canary?"
  node {
    git url: "http://disruptor.ninja:30130/rob/battleapp-canary"
    sh "./start.js"
  }

  stage "go full production"
  input "undeploy other versions?"
  node {
    git url: "http://disruptor.ninja:30130/rob/battleapp-prod"
    sh "./start.js"
  }
}