From ecc9784e1a00663e18620b3cc3be1a3c3e44aec3 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 10:04:54 +0100 Subject: [PATCH 01/29] Added new cicd scripts --- jenkins/angular/README.md | 0 jenkins/angular/cicd/Jenkinsfile | 95 ++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 jenkins/angular/README.md create mode 100644 jenkins/angular/cicd/Jenkinsfile diff --git a/jenkins/angular/README.md b/jenkins/angular/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile new file mode 100644 index 000000000..0e44005e6 --- /dev/null +++ b/jenkins/angular/cicd/Jenkinsfile @@ -0,0 +1,95 @@ +pipeline{ + agent any + + options { + buildDiscarder(logRotator(artifactDaysToKeepStr: '1', artifactNumToKeepStr: '1', daysToKeepStr: '5', numToKeepStr: '50')) + // Disable concurrent builds. It will wait until the pipeline finish before start a new one + // disableConcurrentBuilds() + } + + tools { + nodejs "NodeJS 10.14.0" + } + + environment { + buildScript = "build:prodcompose" + lintScript = "lint" + testScript = "test:ci" + angularDir = "angular" + } + + stages { + stage ('Loading Custom Tools') { + steps { + print "Hello world" + + script { + + def sonar = tool name: 'SonarQube-scanner', type: 'hudson.plugins.sonar.SonarRunnerInstallation' + // withSonarQubeEnv('SonarQube-scanner') { + // sh """sonar-scanner""" + // } + sh """${sonar}/sonar-scanner""" + } + + // Check if it can be at tools + tool 'Chrome-stable' + + } + } + + stage ('Fresh Dependency Installation') { + steps { + dir(angularDir){ + sh "yarn" + } + } + } + + stage ('Code Linting') { + steps { + dir(angularDir) { + sh """yarn ${lintScript}""" + } + } + } + + stage ('Execute Angular tests') { + steps { + dir(angularDir) { + sh """yarn ${testScript}""" + } + } + } + + stage ('SonarQube code analysis') { + steps { + dir(angularDir) { + //sh "yarn test:ci" + } + } + } + + stage ('Build Application') { + steps { + dir(angularDir) { + sh """yarn ${buildScript}""" + } + } + } + + stage ('Deliver application into Nexus') { + steps { + dir(angularDir) { + + } + } + } + } + + post { + always { + cleanWs() + } + } +} \ No newline at end of file From b76afd4e1c696992db4537257ea85ee9c6a95ed0 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 10:11:50 +0100 Subject: [PATCH 02/29] Updated Jenkinsfile --- jenkins/angular/cicd/Jenkinsfile | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index 0e44005e6..cce0187e9 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -23,14 +23,14 @@ pipeline{ steps { print "Hello world" - script { - - def sonar = tool name: 'SonarQube-scanner', type: 'hudson.plugins.sonar.SonarRunnerInstallation' - // withSonarQubeEnv('SonarQube-scanner') { - // sh """sonar-scanner""" - // } - sh """${sonar}/sonar-scanner""" - } + // script { + + // def sonar = tool name: 'SonarQube-scanner', type: 'hudson.plugins.sonar.SonarRunnerInstallation' + // // withSonarQubeEnv('SonarQube-scanner') { + // // sh """sonar-scanner""" + // // } + // sh """${sonar}/sonar-scanner""" + // } // Check if it can be at tools tool 'Chrome-stable' From 131d1cc6aa13f090b6e9f8ce84ef0852f0fc0f2e Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 11:57:53 +0100 Subject: [PATCH 03/29] Updated Jenkinsfile --- angular/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/angular/package.json b/angular/package.json index db02f4e48..af60496d5 100644 --- a/angular/package.json +++ b/angular/package.json @@ -3,7 +3,7 @@ "version": "1.12.0", "main": "main.js", "scripts": { - "postinstall": "npm run postinstall:electron && npx electron-builder install-app-deps", + "postinstall": "node postinstall-web", "postinstall:web": "node postinstall-web", "postinstall:electron": "node postinstall", ".": "sh .angular-gui/.runner.sh", From b5396c3bbac9c9aaef134cd4135950eda0d26099 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 12:08:10 +0100 Subject: [PATCH 04/29] Updated Jenkinsfile --- angular/package.json | 2 +- jenkins/angular/cicd/Jenkinsfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/angular/package.json b/angular/package.json index af60496d5..db02f4e48 100644 --- a/angular/package.json +++ b/angular/package.json @@ -3,7 +3,7 @@ "version": "1.12.0", "main": "main.js", "scripts": { - "postinstall": "node postinstall-web", + "postinstall": "npm run postinstall:electron && npx electron-builder install-app-deps", "postinstall:web": "node postinstall-web", "postinstall:electron": "node postinstall", ".": "sh .angular-gui/.runner.sh", diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index cce0187e9..51e6069fd 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -57,7 +57,7 @@ pipeline{ stage ('Execute Angular tests') { steps { dir(angularDir) { - sh """yarn ${testScript}""" + //sh """yarn ${testScript}""" } } } From 124272727052afe47426dd3342086e5667b678f5 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 12:19:37 +0100 Subject: [PATCH 05/29] Updated jenkinsfile & package.json --- angular/package.json | 4 ++-- jenkins/angular/cicd/Jenkinsfile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/angular/package.json b/angular/package.json index db02f4e48..6f79d4dc6 100644 --- a/angular/package.json +++ b/angular/package.json @@ -12,7 +12,7 @@ "start:electron": "npm run postinstall:electron && npm-run-all -p serve electron:serve", "compodoc": "compodoc -p src/tsconfig.app.json -s", "test": "ng test --browsers Chrome", - "test:ci": "ng test --browsers ChromeHeadless --watch=false", + "test:ci": "npm run postinstall:web && ng test --browsers ChromeHeadless --watch=false", "test:firefox": "ng test --browsers Firefox", "test:ci:firefox": "ng test --browsers FirefoxHeadless --watch=false", "test:firefox-dev": "ng test --browsers FirefoxDeveloper", @@ -32,7 +32,7 @@ "build": "ng build", "build:pwa": "npm run postinstall:web && ng build --configuration=pwa --prod --build-optimizer && npm run ngsw-config && npm run ngsw-copy", "build:prod": "npm run postinstall:web && ng build --prod --build-optimizer", - "build:prodcompose": "npm run postinstall:web && ng build --configuration=prodcompose --prod --build-optimizer", + "build:prodcompose": "npm run postinstall:web && ng build --configuration=prodcompose ", "build:electron": "npm run postinstall:electron && npm run electron:serve-tsc && ng build --base-href ./", "build:electron:dev": "npm run build:electron -- -c dev", "build:electron:prod": "npm run build:electron -- -c production", diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index 51e6069fd..cce0187e9 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -57,7 +57,7 @@ pipeline{ stage ('Execute Angular tests') { steps { dir(angularDir) { - //sh """yarn ${testScript}""" + sh """yarn ${testScript}""" } } } From 9e6d71579928d79e2034d56d2dce89776ef56b8e Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 13:46:51 +0100 Subject: [PATCH 06/29] Added sonarqube analysis --- jenkins/angular/cicd/Jenkinsfile | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index cce0187e9..21d066dd6 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -21,18 +21,6 @@ pipeline{ stages { stage ('Loading Custom Tools') { steps { - print "Hello world" - - // script { - - // def sonar = tool name: 'SonarQube-scanner', type: 'hudson.plugins.sonar.SonarRunnerInstallation' - // // withSonarQubeEnv('SonarQube-scanner') { - // // sh """sonar-scanner""" - // // } - // sh """${sonar}/sonar-scanner""" - // } - - // Check if it can be at tools tool 'Chrome-stable' } @@ -57,7 +45,7 @@ pipeline{ stage ('Execute Angular tests') { steps { dir(angularDir) { - sh """yarn ${testScript}""" + // sh """yarn ${testScript}""" } } } @@ -65,7 +53,20 @@ pipeline{ stage ('SonarQube code analysis') { steps { dir(angularDir) { - //sh "yarn test:ci" + script { + def scannerHome = tool 'SonarQube-scanner'; + def package = readJSON file: 'package.json'; + withSonarQubeEnv('SonarQube') { + sh """ + ${scannerHome}/bin/sonar-scanner \ + -Dsonar.projectKey=${package.name} \ + -Dsonar.projectName=${package.name} \ + -Dsonar.projectVersion=${package.version} \ + -Dsonar.sources=src \ + -X + """ + } + } } } } From f7743996370e66d8abb8795ded5dc1fc6b9d5013 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 13:49:01 +0100 Subject: [PATCH 07/29] Added sonarqube analysis --- jenkins/angular/cicd/Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index 21d066dd6..f6b0aa1f1 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -52,8 +52,8 @@ pipeline{ stage ('SonarQube code analysis') { steps { - dir(angularDir) { - script { + script { + dir(angularDir) { def scannerHome = tool 'SonarQube-scanner'; def package = readJSON file: 'package.json'; withSonarQubeEnv('SonarQube') { From 795af3f4b0d771e2a51a5fdb26e286ec49f5c84d Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 13:52:58 +0100 Subject: [PATCH 08/29] Added sonarqube analysis --- jenkins/angular/cicd/Jenkinsfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index f6b0aa1f1..00d0e8a35 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -54,14 +54,14 @@ pipeline{ steps { script { dir(angularDir) { - def scannerHome = tool 'SonarQube-scanner'; - def package = readJSON file: 'package.json'; + def scannerHome = tool 'SonarQube-scanner' + def props = readJSON file: 'package.json' withSonarQubeEnv('SonarQube') { sh """ ${scannerHome}/bin/sonar-scanner \ - -Dsonar.projectKey=${package.name} \ - -Dsonar.projectName=${package.name} \ - -Dsonar.projectVersion=${package.version} \ + -Dsonar.projectKey=${props.name} \ + -Dsonar.projectName=${props.name} \ + -Dsonar.projectVersion=${props.version} \ -Dsonar.sources=src \ -X """ From 03eabe07c9bdd2fee0bc9884503c230466e41d04 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 14:20:10 +0100 Subject: [PATCH 09/29] Added sonarqube analysis --- jenkins/angular/cicd/Jenkinsfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index 00d0e8a35..ab1e9d6ae 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -62,8 +62,7 @@ pipeline{ -Dsonar.projectKey=${props.name} \ -Dsonar.projectName=${props.name} \ -Dsonar.projectVersion=${props.version} \ - -Dsonar.sources=src \ - -X + -Dsonar.sources=src """ } } From d4b6a23f46224be55c7853d56bc1ac9c0a9f615f Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 16:46:22 +0100 Subject: [PATCH 10/29] Updated jenkinsfile --- jenkins/angular/cicd/Jenkinsfile | 36 +++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index ab1e9d6ae..5e6b46ae0 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -16,6 +16,16 @@ pipeline{ lintScript = "lint" testScript = "test:ci" angularDir = "angular" + + // sonarQube + sonarTool = 'SonarQube-scanner' + sonarEnv = "SonarQube" + + // Nexus + artifactId = 'my-thai-star' + groupId = 'com.devonfw.mythaistar' + repositoryId = 'devon.snapshots' + repositoryUrl = 'https://devon.s2-eu.capgemini.com/nexus/content/repositories/snapshots/' } stages { @@ -54,14 +64,14 @@ pipeline{ steps { script { dir(angularDir) { - def scannerHome = tool 'SonarQube-scanner' - def props = readJSON file: 'package.json' - withSonarQubeEnv('SonarQube') { + def scannerHome = tool sonarTool + env.PACK = readJSON file: 'package.json' + withSonarQubeEnv(sonarEnv) { sh """ ${scannerHome}/bin/sonar-scanner \ - -Dsonar.projectKey=${props.name} \ - -Dsonar.projectName=${props.name} \ - -Dsonar.projectVersion=${props.version} \ + -Dsonar.projectKey=${env.PACK.name} \ + -Dsonar.projectName=${env.PACK.name} \ + -Dsonar.projectVersion=${env.PACK.version} \ -Dsonar.sources=src """ } @@ -81,7 +91,19 @@ pipeline{ stage ('Deliver application into Nexus') { steps { dir(angularDir) { - + zip dir: 'dist/', zipFile: """${env.PACK.name}.zip""" + withMaven(globalMavenSettingsConfig: '9d437f6e-46e7-4a11-a8d1-2f0055f14033', jdk: 'Java8', maven: 'Maven3') { + sh """ + mvn deploy:deploy-file \ + -DgroupId=${groupId} \ + -DartifactId=${env.PACK.name} \ + -Dversion=${env.PACK.version}-SNAPSHOT \ + -Dpackaging=zip \ + -Dfile=${env.PACK.name}.zip \ + -DrepositoryId=${repositoryId} \ + -Durl=${repositoryUrl} + """ + } } } } From 534819f1c42d866e89425d135137637e23816233 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 17:03:19 +0100 Subject: [PATCH 11/29] Updated jenkinsfiles --- jenkins/angular/cicd/Jenkinsfile | 37 +++++++++++++++++--------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index 5e6b46ae0..d2a599320 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -65,13 +65,13 @@ pipeline{ script { dir(angularDir) { def scannerHome = tool sonarTool - env.PACK = readJSON file: 'package.json' + def props = readJSON file: 'package.json' withSonarQubeEnv(sonarEnv) { sh """ ${scannerHome}/bin/sonar-scanner \ - -Dsonar.projectKey=${env.PACK.name} \ - -Dsonar.projectName=${env.PACK.name} \ - -Dsonar.projectVersion=${env.PACK.version} \ + -Dsonar.projectKey=${props.name} \ + -Dsonar.projectName=${props.name} \ + -Dsonar.projectVersion=${props.version} \ -Dsonar.sources=src """ } @@ -90,19 +90,22 @@ pipeline{ stage ('Deliver application into Nexus') { steps { - dir(angularDir) { - zip dir: 'dist/', zipFile: """${env.PACK.name}.zip""" - withMaven(globalMavenSettingsConfig: '9d437f6e-46e7-4a11-a8d1-2f0055f14033', jdk: 'Java8', maven: 'Maven3') { - sh """ - mvn deploy:deploy-file \ - -DgroupId=${groupId} \ - -DartifactId=${env.PACK.name} \ - -Dversion=${env.PACK.version}-SNAPSHOT \ - -Dpackaging=zip \ - -Dfile=${env.PACK.name}.zip \ - -DrepositoryId=${repositoryId} \ - -Durl=${repositoryUrl} - """ + script { + dir(angularDir) { + zip dir: 'dist/', zipFile: """${env.PACK.name}.zip""" + def props = readJSON file: 'package.json' + withMaven(globalMavenSettingsConfig: '9d437f6e-46e7-4a11-a8d1-2f0055f14033', jdk: 'Java8', maven: 'Maven3') { + sh """ + mvn deploy:deploy-file \ + -DgroupId=${groupId} \ + -DartifactId=${props.name} \ + -Dversion=${props.version}-SNAPSHOT \ + -Dpackaging=zip \ + -Dfile=${props.name}.zip \ + -DrepositoryId=${repositoryId} \ + -Durl=${repositoryUrl} + """ + } } } } From 1f5d53fbb99ff5a44653b645fff905e051b020f8 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 17:12:12 +0100 Subject: [PATCH 12/29] Updated jenkinsfiles --- jenkins/angular/cicd/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index d2a599320..1d9591876 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -92,8 +92,8 @@ pipeline{ steps { script { dir(angularDir) { - zip dir: 'dist/', zipFile: """${env.PACK.name}.zip""" def props = readJSON file: 'package.json' + zip dir: 'dist/', zipFile: """${props.name}.zip""" withMaven(globalMavenSettingsConfig: '9d437f6e-46e7-4a11-a8d1-2f0055f14033', jdk: 'Java8', maven: 'Maven3') { sh """ mvn deploy:deploy-file \ From f93ce5e964e3a0218e8dca4d741a3202e2ad9fd3 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 17:22:47 +0100 Subject: [PATCH 13/29] Updated jenkinsfile with nexus3 url --- jenkins/angular/cicd/Jenkinsfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index 1d9591876..9a004376e 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -25,7 +25,7 @@ pipeline{ artifactId = 'my-thai-star' groupId = 'com.devonfw.mythaistar' repositoryId = 'devon.snapshots' - repositoryUrl = 'https://devon.s2-eu.capgemini.com/nexus/content/repositories/snapshots/' + repositoryUrl = 'http://nexus3-core:8081/nexus3/repository/snapshots' } stages { @@ -75,6 +75,10 @@ pipeline{ -Dsonar.sources=src """ } + def qg = waitForQualityGate() + if (qg.status != 'OK') { + error "Pipeline aborted due to quality gate failure: ${qg.status}" + } } } } From 980729b47910427628553ee1e602c77fc9bf6004 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 17:48:43 +0100 Subject: [PATCH 14/29] Updated again CICD Jenkinsfile --- jenkins/angular/cicd/Jenkinsfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index 9a004376e..d6abd15d2 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -26,6 +26,9 @@ pipeline{ groupId = 'com.devonfw.mythaistar' repositoryId = 'devon.snapshots' repositoryUrl = 'http://nexus3-core:8081/nexus3/repository/snapshots' + mavenGlobalSettings = '9d437f6e-46e7-4a11-a8d1-2f0055f14033' + javaJdk = 'Java8' + mavenInstallation = 'Maven3' } stages { @@ -98,7 +101,7 @@ pipeline{ dir(angularDir) { def props = readJSON file: 'package.json' zip dir: 'dist/', zipFile: """${props.name}.zip""" - withMaven(globalMavenSettingsConfig: '9d437f6e-46e7-4a11-a8d1-2f0055f14033', jdk: 'Java8', maven: 'Maven3') { + withMaven(globalMavenSettingsConfig: mavenGlobalSettings, jdk: javaJdk, maven: mavenInstallation) { sh """ mvn deploy:deploy-file \ -DgroupId=${groupId} \ From d4da8494c38872c5a170079f4869a3d52687ee33 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 18:16:44 +0100 Subject: [PATCH 15/29] Added new cicd Jenkinsfile pipeline --- java/mtsj/pom.xml | 10 +++--- jenkins/java/README.md | 0 jenkins/java/cicd/Jenkinsfile | 65 +++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 jenkins/java/README.md create mode 100644 jenkins/java/cicd/Jenkinsfile diff --git a/java/mtsj/pom.xml b/java/mtsj/pom.xml index f5f24e094..271a440bf 100644 --- a/java/mtsj/pom.xml +++ b/java/mtsj/pom.xml @@ -1,6 +1,6 @@ - + 4.0.0 mtsj @@ -12,7 +12,7 @@ 2.0.4.RELEASE - 3.0.0 + 3.0.0 1.8 81 ${devon.port.range}81 @@ -220,12 +220,12 @@ devon.releases devon Releases - https://devon.s2-eu.capgemini.com/nexus/content/repositories/releases/ + http://nexus3-core:8081/nexus/content/repositories/releases/ devon.snapshots devon Snapshots - https://devon.s2-eu.capgemini.com/nexus/content/repositories/snapshots/ + http://nexus3-core:8081/nexus3/repository/snapshots \ No newline at end of file diff --git a/jenkins/java/README.md b/jenkins/java/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/jenkins/java/cicd/Jenkinsfile b/jenkins/java/cicd/Jenkinsfile new file mode 100644 index 000000000..9159f0d4a --- /dev/null +++ b/jenkins/java/cicd/Jenkinsfile @@ -0,0 +1,65 @@ +pipeline{ + agent any + + options { + buildDiscarder(logRotator(artifactDaysToKeepStr: '1', artifactNumToKeepStr: '1', daysToKeepStr: '5', numToKeepStr: '50')) + // Disable concurrent builds. It will wait until the pipeline finish before start a new one + // disableConcurrentBuilds() + } + + tools { + maven 'Maven3' + jdk 'Java8' + } + + environment { + javaDir = 'java/mtsj' + mavenGlobalSettings = '9d437f6e-46e7-4a11-a8d1-2f0055f14033' + } + + stages { + stage ('Unit Tests') { + steps { + dir(javaDir) { + withMaven(globalMavenSettingsConfig: mavenGlobalSettings){ + sh "mvn clean test" + } + } + } + } + + stage ('SonarQube code analysis') { + steps { + script { + dir(javaDir) { + withMaven(globalMavenSettingsConfig: mavenGlobalSettings){ + withSonarQubeEnv(sonarEnv) { + sh "mvn sonar:sonar" + def qg = waitForQualityGate() + if (qg.status != 'OK') { + error "Pipeline aborted due to quality gate failure: ${qg.status}" + } + } + } + } + } + } + } + + stage ('Deliver application into Nexus') { + steps { + dir(javaDir) { + withMaven(globalMavenSettingsConfig: mavenGlobalSettings){ + sh "mvn deploy -Dmaven.test.skip=true" + } + } + } + } + } + + post { + always { + cleanWs() + } + } +} \ No newline at end of file From 4083caa2393bac05ad359f0b348b87b148238c12 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 18:24:15 +0100 Subject: [PATCH 16/29] Updated new java jenkinsfile --- jenkins/java/cicd/Jenkinsfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jenkins/java/cicd/Jenkinsfile b/jenkins/java/cicd/Jenkinsfile index 9159f0d4a..93d905d6f 100644 --- a/jenkins/java/cicd/Jenkinsfile +++ b/jenkins/java/cicd/Jenkinsfile @@ -15,6 +15,8 @@ pipeline{ environment { javaDir = 'java/mtsj' mavenGlobalSettings = '9d437f6e-46e7-4a11-a8d1-2f0055f14033' + + sonarEnv = "SonarQube" } stages { From cd4b884722af4711f825ccc0b1c625e6154298d7 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 18:31:33 +0100 Subject: [PATCH 17/29] Updated new java jenkinsfile --- jenkins/java/cicd/Jenkinsfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jenkins/java/cicd/Jenkinsfile b/jenkins/java/cicd/Jenkinsfile index 93d905d6f..a1d76bc36 100644 --- a/jenkins/java/cicd/Jenkinsfile +++ b/jenkins/java/cicd/Jenkinsfile @@ -37,10 +37,10 @@ pipeline{ withMaven(globalMavenSettingsConfig: mavenGlobalSettings){ withSonarQubeEnv(sonarEnv) { sh "mvn sonar:sonar" - def qg = waitForQualityGate() - if (qg.status != 'OK') { - error "Pipeline aborted due to quality gate failure: ${qg.status}" - } + } + def qg = waitForQualityGate() + if (qg.status != 'OK') { + error "Pipeline aborted due to quality gate failure: ${qg.status}" } } } From f085ecaf5eaa02a339b69e61600d2f76c71449ed Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 19:52:39 +0100 Subject: [PATCH 18/29] Added Jenkinsfile for node projects --- jenkins/node/cicd/Jenkinsfile | 121 ++++++++++++++++++++++++++++++++++ node/package.json | 5 +- 2 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 jenkins/node/cicd/Jenkinsfile diff --git a/jenkins/node/cicd/Jenkinsfile b/jenkins/node/cicd/Jenkinsfile new file mode 100644 index 000000000..440787d6a --- /dev/null +++ b/jenkins/node/cicd/Jenkinsfile @@ -0,0 +1,121 @@ +pipeline{ + agent any + + options { + buildDiscarder(logRotator(artifactDaysToKeepStr: '1', artifactNumToKeepStr: '1', daysToKeepStr: '5', numToKeepStr: '50')) + // Disable concurrent builds. It will wait until the pipeline finish before start a new one + // disableConcurrentBuilds() + } + + tools { + nodejs "NodeJS 10.14.0" + } + + environment { + buildScript = "compile" + lintScript = "lint" + testScript = "test" + nodeDir = "node" + + // sonarQube + sonarTool = 'SonarQube-scanner' + sonarEnv = "SonarQube" + + // Nexus + artifactId = 'my-thai-star' + groupId = 'com.devonfw.mythaistar' + repositoryId = 'devon.snapshots' + repositoryUrl = 'http://nexus3-core:8081/nexus3/repository/snapshots' + mavenGlobalSettings = '9d437f6e-46e7-4a11-a8d1-2f0055f14033' + javaJdk = 'Java8' + mavenInstallation = 'Maven3' + } + + stages { + + stage ('Fresh Dependency Installation') { + steps { + dir(nodeDir){ + sh "npm i" + } + } + } + + stage ('Code Linting') { + steps { + dir(nodeDir) { + sh """npm run ${lintScript}""" + } + } + } + + stage ('Execute Angular tests') { + steps { + dir(nodeDir) { + sh """npm run ${testScript}""" + } + } + } + + stage ('SonarQube code analysis') { + steps { + script { + dir(nodeDir) { + def scannerHome = tool sonarTool + def props = readJSON file: 'package.json' + withSonarQubeEnv(sonarEnv) { + sh """ + ${scannerHome}/bin/sonar-scanner \ + -Dsonar.projectKey=${props.name} \ + -Dsonar.projectName=${props.name} \ + -Dsonar.projectVersion=${props.version} \ + -Dsonar.sources=src + """ + } + def qg = waitForQualityGate() + if (qg.status != 'OK') { + error "Pipeline aborted due to quality gate failure: ${qg.status}" + } + } + } + } + } + + stage ('Build Application') { + steps { + dir(nodeDir) { + sh """npm run ${buildScript}""" + } + } + } + + stage ('Deliver application into Nexus') { + steps { + script { + dir(nodeDir) { + def props = readJSON file: 'package.json' + zip dir: 'dist/', zipFile: """${props.name}.zip""" + withMaven(globalMavenSettingsConfig: mavenGlobalSettings, jdk: javaJdk, maven: mavenInstallation) { + sh """ + mvn deploy:deploy-file \ + -DgroupId=${groupId} \ + -DartifactId=${props.name} \ + -Dversion=${props.version}-SNAPSHOT \ + -Dpackaging=zip \ + -Dfile=${props.name}.zip \ + -DrepositoryId=${repositoryId} \ + -Durl=${repositoryUrl} + """ + } + } + } + } + } + } + + post { + always { + cleanWs() + } + } +} \ No newline at end of file diff --git a/node/package.json b/node/package.json index d917c6da4..3d4376369 100644 --- a/node/package.json +++ b/node/package.json @@ -19,7 +19,8 @@ "test:cov": "jest --coverage", "test:e2e": "jest --config ./test/jest-e2e.json", "webpack": "webpack --config webpack.config.js", - "compile": "tsc" + "compile": "tsc", + "lint": "tslint --project ." }, "dependencies": { "@nestjs/common": "^5.4.0", @@ -96,4 +97,4 @@ "src" ] } -} +} \ No newline at end of file From e07b2e45c33c4839f96db96e6dea495be7ce6f74 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 19:58:19 +0100 Subject: [PATCH 19/29] Updated nodemon --- node/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/package.json b/node/package.json index 3d4376369..db39edafa 100644 --- a/node/package.json +++ b/node/package.json @@ -59,7 +59,7 @@ "@types/supertest": "^2.0.4", "husky": "^1.1.4", "jest": "^23.5.0", - "nodemon": "^1.18.6", + "nodemon": "^1.18.7", "prettier": "^1.15.2", "supertest": "^3.0.0", "ts-jest": "^23.1.3", From 2498c8486246ae848bad6cf0d4497944e2d125df Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Thu, 29 Nov 2018 20:00:33 +0100 Subject: [PATCH 20/29] Updated nodemon --- node/package-lock.json | 96 ++++-------------------------------------- node/package.json | 2 +- 2 files changed, 9 insertions(+), 89 deletions(-) diff --git a/node/package-lock.json b/node/package-lock.json index 2c20213dc..b2d40135a 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -3824,12 +3824,6 @@ "resolved": "http://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==" }, - "duplexer": { - "version": "0.1.1", - "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -4214,22 +4208,6 @@ "es5-ext": "~0.10.14" } }, - "event-stream": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.6.tgz", - "integrity": "sha512-dGXNg4F/FgVzlApjzItL+7naHutA3fDqbV/zAZqDDlXTjiMnQmZKu+prImWKszeBM5UQeGvAl3u1wBiKeDh61g==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "flatmap-stream": "^0.1.0", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -5007,12 +4985,6 @@ } } }, - "flatmap-stream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/flatmap-stream/-/flatmap-stream-0.1.2.tgz", - "integrity": "sha512-ucyr6WkLXjyMuHPtOUq4l+nSAxgWi7v4QO508eQ9resnGj+lSup26oIsUI5aH8k4Qfpjsxa8dDf9UCKkS2KHzQ==", - "dev": true - }, "flow-parser": { "version": "0.81.0", "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.81.0.tgz", @@ -5139,12 +5111,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -8258,12 +8224,6 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", - "dev": true - }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -8945,16 +8905,16 @@ } }, "nodemon": { - "version": "1.18.6", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.18.6.tgz", - "integrity": "sha512-4pHQNYEZun+IkIC2jCaXEhkZnfA7rQe73i8RkdRyDJls/K+WxR7IpI5uNUsAvQ0zWvYcCDNGD+XVtw2ZG86/uQ==", + "version": "1.18.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.18.7.tgz", + "integrity": "sha512-xuC1V0F5EcEyKQ1VhHYD13owznQbUw29JKvZ8bVH7TmuvVNHvvbp9pLgE4PjTMRJVe0pJ8fGRvwR2nMiosIsPQ==", "dev": true, "requires": { "chokidar": "^2.0.4", "debug": "^3.1.0", "ignore-by-default": "^1.0.1", "minimatch": "^3.0.4", - "pstree.remy": "^1.1.0", + "pstree.remy": "^1.1.2", "semver": "^5.5.0", "supports-color": "^5.2.0", "touch": "^3.1.0", @@ -12294,15 +12254,6 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" }, - "pause-stream": { - "version": "0.0.11", - "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", @@ -12473,15 +12424,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "ps-tree": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", - "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", - "dev": true, - "requires": { - "event-stream": "~3.3.0" - } - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -12493,13 +12435,10 @@ "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" }, "pstree.remy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.0.tgz", - "integrity": "sha512-q5I5vLRMVtdWa8n/3UEzZX7Lfghzrg9eG2IKk2ENLSofKRCXVqMvMUHxCKgXNaqH/8ebhBxrqftHWnyTFweJ5Q==", - "dev": true, - "requires": { - "ps-tree": "^1.1.0" - } + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.2.tgz", + "integrity": "sha512-vL6NLxNHzkNTjGJUpMm5PLC+94/0tTlC1vkP9bdU0pOHih+EujMjgMTwfZopZvHWRFbqJ5Y73OMoau50PewDDA==", + "dev": true }, "public-encrypt": { "version": "4.0.2", @@ -14217,15 +14156,6 @@ "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", "dev": true }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -14375,16 +14305,6 @@ } } }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", diff --git a/node/package.json b/node/package.json index db39edafa..3ff2b397c 100644 --- a/node/package.json +++ b/node/package.json @@ -97,4 +97,4 @@ "src" ] } -} \ No newline at end of file +} From 65ba1e790f23f745667900a0ed31ce2a08f6af9e Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Fri, 30 Nov 2018 12:32:59 +0100 Subject: [PATCH 21/29] Updated Jenkins readme --- jenkins/README.md | 164 +++++++++++++++++++++++++++++++++- jenkins/node/cicd/Jenkinsfile | 2 +- 2 files changed, 164 insertions(+), 2 deletions(-) diff --git a/jenkins/README.md b/jenkins/README.md index 64401aa5f..9b0766751 100644 --- a/jenkins/README.md +++ b/jenkins/README.md @@ -2,6 +2,168 @@ In this folder 2 Jenkinsfile(s) are provided to execute some CI/CD process for different parts of the **My Thai Star** project. One for the **Angular client** and another one for the **Java server**. Both are intended to be executed in an already configured **Production Line instance**. This configuration is required to be **used by Devonfw projects**, and a guide can be found in the [**Devonfw Shop Floor** incubator's wiki](https://github.com/devonfw/devonfw-shop-floor/wiki/devonfw-shop-floor-4-production-line-environment). +## Installed plugins + +In order to run all pipelines, we have installed the following plugins (maybe not all are required): + +- **Pipeline Utility Steps (pipeline-utility-steps)** +- OWASP Markup Formatter Plugin (antisamy-markup-formatter) +- Office 365 Connector (Office-365-Connector) +- JavaScript GUI Lib: ACE Editor bundle plugin (ace-editor) +- Ant Plugin (ant) +- Apache HttpComponents Client 4.x API Plugin (apache-httpcomponents-client-4-api) +- Authentication Tokens API Plugin (authentication-tokens) +- Autofavorite for Blue Ocean (blueocean-autofavorite) +- Bitbucket Pipeline for Blue Ocean (blueocean-bitbucket-pipeline) +- Common API for Blue Ocean (blueocean-commons) +- Config API for Blue Ocean (blueocean-config) +- Blue Ocean Core JS (blueocean-core-js) +- Display URL for Blue Ocean (blueocean-display-url) +- Events API for Blue Ocean (blueocean-events) +- Git Pipeline for Blue Ocean (blueocean-git-pipeline) +- GitHub Pipeline for Blue Ocean (blueocean-github-pipeline) +- i18n for Blue Ocean (blueocean-i18n) +- JIRA Integration for Blue Ocean (blueocean-jira) +- JWT for Blue Ocean (blueocean-jwt) +- Personalization for Blue Ocean (blueocean-personalization) +- Pipeline implementation for Blue Ocean (blueocean-pipeline-api-impl) +- Blue Ocean Pipeline Editor (blueocean-pipeline-editor) +- Pipeline SCM API for Blue Ocean (blueocean-pipeline-scm-api) +- REST Implementation for Blue Ocean (blueocean-rest-impl) +- REST API for Blue Ocean (blueocean-rest) +- Web for Blue Ocean (blueocean-web) +- Blue Ocean (blueocean) +- bouncycastle API Plugin (bouncycastle-api) +- Branch API Plugin (branch-api) +- build-env-propagator (build-env-propagator) +- Build Timeout (build-timeout) +- Bitbucket Branch Source Plugin (cloudbees-bitbucket-branch-source) +- Folders Plugin (cloudbees-folder) +- Command Agent Launcher Plugin (command-launcher) +- Config File Provider Plugin (config-file-provider) +- Credentials Binding Plugin (credentials-binding) +- Credentials Plugin (credentials) +- **Custom Tools Plugin (custom-tools-plugin)** +- Deploy to container Plugin (deploy) +- disk-usage plugin (disk-usage) +- Display URL API (display-url-api) +- Docker Commons Plugin (docker-commons) +- Docker API Plugin (docker-java-api) +- Docker plugin (docker-plugin) +- Docker Pipeline (docker-workflow) +- Durable Task Plugin (durable-task) +- Email Extension Plugin (email-ext) +- EnvInject API Plugin (envinject-api) +- Environment Injector Plugin (envinject) +- Extended Choice Parameter Plug-In (extended-choice-parameter) +- External Monitor Job Type Plugin (external-monitor-job) +- Favorite (favorite) +- Gerrit Trigger (gerrit-trigger) +- GitHub Pull Request Builder (ghprb) +- Git client plugin (git-client) +- GIT server Plugin (git-server) +- Git plugin (git) +- GitHub API Plugin (github-api) +- GitHub Branch Source Plugin (github-branch-source) +- GitHub Integration Plugin (github-pullrequest) +- GitHub plugin (github) +- Gradle Plugin (gradle) +- JavaScript GUI Lib: Handlebars bundle plugin (handlebars) +- Handy Uri Templates 2.x API Plugin (handy-uri-templates-2-api) +- HTML Publisher plugin (htmlpublisher) +- Icon Shim Plugin (icon-shim) +- Jackson 2 API Plugin (jackson2-api) +- Javadoc Plugin (javadoc) +- Design Language (jenkins-design-language) +- JIRA plugin (jira) +- JavaScript GUI Lib: jQuery bundles (jQuery and jQuery UI) plugin (jquery-detached) +- jQuery UI plugin (jquery-ui) +- jQuery plugin (jquery) +- JSch dependency plugin (jsch) +- JUnit Plugin (junit) +- LDAP Plugin (ldap) +- Lockable Resources plugin (lockable-resources) +- Mailer Plugin (mailer) +- MapDB API Plugin (mapdb-api) +- Matrix Authorization Strategy Plugin (matrix-auth) +- Matrix Project Plugin (matrix-project) +- **Maven Integration plugin (maven-plugin)** +- Mercurial plugin (mercurial) +- JavaScript GUI Lib: Moment.js bundle plugin (momentjs) +- Multiple SCMs plugin (multiple-scms) +- **NodeJS Plugin (nodejs)** +- PAM Authentication plugin (pam-auth) +- Pipeline: Build Step (pipeline-build-step) +- Pipeline: GitHub (pipeline-github) +- Pipeline GitHub Notify Step Plugin (pipeline-githubnotify-step) +- Pipeline Graph Analysis Plugin (pipeline-graph-analysis) +- Pipeline: Input Step (pipeline-input-step) +- Pipeline Maven Integration Plugin (pipeline-maven) +- Pipeline: Milestone Step (pipeline-milestone-step) +- Pipeline: Model API (pipeline-model-api) +- Pipeline: Declarative Agent API (pipeline-model-declarative-agent) +- Pipeline: Declarative (pipeline-model-definition) +- Pipeline: Declarative Extension Points API (pipeline-model-extensions) +- Pipeline: REST API Plugin (pipeline-rest-api) +- Pipeline: Stage Step (pipeline-stage-step) +- Pipeline: Stage Tags Metadata (pipeline-stage-tags-metadata) +- Pipeline: Stage View Plugin (pipeline-stage-view) +- Plain Credentials Plugin (plain-credentials) +- pom2config (pom2config) +- Publish Over SSH (publish-over-ssh) +- Infrastructure plugin for Publish Over X (publish-over) +- Pub-Sub "light" Bus (pubsub-light) +- Purge Job History Plugin (purge-job-history) +- Resource Disposer Plugin (resource-disposer) +- Reverse Proxy Auth Plugin (reverse-proxy-auth-plugin) +- SCM API Plugin (scm-api) +- Selenium Plugin (selenium) +- SeleniumRC plugin (seleniumrc-plugin) +- **SonarQube Scanner for Jenkins (sonar)** +- Server Sent Events (SSE) Gateway Plugin (sse-gateway) +- SSH Agent Plugin (ssh-agent) +- SSH Credentials Plugin (ssh-credentials) +- SSH Slaves plugin (ssh-slaves) +- Structs Plugin (structs) +- Subversion Plug-in (subversion) +- Self-Organizing Swarm Plug-in Modules (swarm) +- Terminal Plugin (terminal) +- Timestamper (timestamper) +- Token Macro Plugin (token-macro) +- Variant Plugin (variant) +- VncRecorder Plugin (vncrecorder) +- Windows Slaves Plugin (windows-slaves) +- Pipeline (workflow-aggregator) +- Pipeline: API (workflow-api) +- Pipeline: Basic Steps (workflow-basic-steps) +- Pipeline: Shared Groovy Libraries (workflow-cps-global-lib) +- Pipeline: Groovy (workflow-cps) +- Pipeline: Nodes and Processes (workflow-durable-task-step) +- Pipeline: Job (workflow-job) +- Pipeline: Multibranch (workflow-multibranch) +- Pipeline: SCM Step (workflow-scm-step) +- Pipeline: Step API (workflow-step-api) +- Pipeline: Supporting APIs (workflow-support) +- Workspace Cleanup Plugin (ws-cleanup) +- Xvnc plugin (xvnc) +- Dashboard for Blue Ocean (blueocean-dashboard) +- Script Security Plugin (script-security) + +Most of them come pre-installed with the production line instance. The ones we need are the ones related to the pipeline and the ones in bold. + +## Tools + +- Java 8u192 JDK \ + ![java8jdk](./java8-jdk.png) +- Google Chrome Stable \ + ![googlechromestable](./google-chrome-stable.png) +- SonarQube Scanner 3.2.0.1227 \ + ![sonarscanner](./sonar-scanner.png) +- Maven 3.6.0 + ![maven](./maven.png) +- NodeJS 10.14.0 + yarn + ![nodejs](./nodejs.png) + **TIP**: All environment variables used on both Jenkinsfiles should be declared in the correspondant Jenkins Pipeline configuration more or less like this: -![](./jenkins-pipelines-params.png) \ No newline at end of file +![](./jenkins-pipelines-params.png) diff --git a/jenkins/node/cicd/Jenkinsfile b/jenkins/node/cicd/Jenkinsfile index 440787d6a..3931107f5 100644 --- a/jenkins/node/cicd/Jenkinsfile +++ b/jenkins/node/cicd/Jenkinsfile @@ -49,7 +49,7 @@ pipeline{ } } - stage ('Execute Angular tests') { + stage ('Execute tests') { steps { dir(nodeDir) { sh """npm run ${testScript}""" From f41ca604fe265f5dc9513d990c97e8aa3f019bd0 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Fri, 30 Nov 2018 14:47:33 +0100 Subject: [PATCH 22/29] Updated angular cicd jenkinsfile --- jenkins/angular/cicd/Jenkinsfile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index d6abd15d2..d16f5eb94 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -22,10 +22,9 @@ pipeline{ sonarEnv = "SonarQube" // Nexus - artifactId = 'my-thai-star' groupId = 'com.devonfw.mythaistar' - repositoryId = 'devon.snapshots' - repositoryUrl = 'http://nexus3-core:8081/nexus3/repository/snapshots' + repositoryId = 'devon.releases' + repositoryUrl = 'http://nexus3-core:8081/nexus3/repository/releases' mavenGlobalSettings = '9d437f6e-46e7-4a11-a8d1-2f0055f14033' javaJdk = 'Java8' mavenInstallation = 'Maven3' @@ -106,7 +105,7 @@ pipeline{ mvn deploy:deploy-file \ -DgroupId=${groupId} \ -DartifactId=${props.name} \ - -Dversion=${props.version}-SNAPSHOT \ + -Dversion=${props.version} \ -Dpackaging=zip \ -Dfile=${props.name}.zip \ -DrepositoryId=${repositoryId} \ From 9200c016e67e88dbf3a5a9f509fdb841243ccf4b Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Fri, 30 Nov 2018 15:14:19 +0100 Subject: [PATCH 23/29] Updated jenkinsfiles --- jenkins/angular/cicd/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index d16f5eb94..fee89fccd 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -57,7 +57,7 @@ pipeline{ stage ('Execute Angular tests') { steps { dir(angularDir) { - // sh """yarn ${testScript}""" + sh """yarn ${testScript}""" } } } From 53982da4e35079843dc0f4023325a8f896b9e042 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Fri, 30 Nov 2018 15:30:52 +0100 Subject: [PATCH 24/29] Added the missing images & updated the README.md --- jenkins/README.md | 5 ++ jenkins/angular/Jenkinsfile | 60 ----------------------- jenkins/angular/deployment/Jenkinsfile | 64 +++++++++++++++++++++++++ jenkins/google-chrome-stable.png | Bin 0 -> 31927 bytes jenkins/java/Jenkinsfile | 56 ---------------------- jenkins/java8-jdk.png | Bin 0 -> 17408 bytes jenkins/maven.png | Bin 0 -> 13313 bytes jenkins/nodejs.png | Bin 0 -> 26404 bytes jenkins/pipeline-config.png | Bin 0 -> 36361 bytes jenkins/sonar-scanner.png | Bin 0 -> 13449 bytes 10 files changed, 69 insertions(+), 116 deletions(-) delete mode 100644 jenkins/angular/Jenkinsfile create mode 100644 jenkins/angular/deployment/Jenkinsfile create mode 100644 jenkins/google-chrome-stable.png delete mode 100644 jenkins/java/Jenkinsfile create mode 100644 jenkins/java8-jdk.png create mode 100644 jenkins/maven.png create mode 100644 jenkins/nodejs.png create mode 100644 jenkins/pipeline-config.png create mode 100644 jenkins/sonar-scanner.png diff --git a/jenkins/README.md b/jenkins/README.md index 9b0766751..ed63ea684 100644 --- a/jenkins/README.md +++ b/jenkins/README.md @@ -164,6 +164,11 @@ Most of them come pre-installed with the production line instance. The ones we n - NodeJS 10.14.0 + yarn ![nodejs](./nodejs.png) +## How to create the pipelines + +You only need to create a new pipeline and modify the configuration following the image: +![](./pipeline-config.png) + **TIP**: All environment variables used on both Jenkinsfiles should be declared in the correspondant Jenkins Pipeline configuration more or less like this: ![](./jenkins-pipelines-params.png) diff --git a/jenkins/angular/Jenkinsfile b/jenkins/angular/Jenkinsfile deleted file mode 100644 index 60da35766..000000000 --- a/jenkins/angular/Jenkinsfile +++ /dev/null @@ -1,60 +0,0 @@ -node { - stage('Checking out MyThaiStar') { - deleteDir() - git branch: 'develop', credentialsId: 'github-devonfw-ci', url: 'https://github.com/oasp/my-thai-star/' - } - - stage('Loading Custom Tools') { - def node = tool name: 'Node 8.9 LTS', type: 'jenkins.plugins.nodejs.tools.NodeJSInstallation' - env.PATH = "${node}/bin:${env.PATH}" - sh "npm i -g yarn" - tool 'Chrome-stable' - } - - stage('Fresh Dependency Installation') { - sh """ - cd angular - #find . -name "node_modules" -exec rm -rf '{}' + - yarn - """ - } - - stage('Code Linting') { - sh """ - cd angular - yarn lint - """ - } - - stage('Execute Angular tests') { - sh """ - cd angular - ng test --browsers ChromeHeadless --single-run - """ - } - - stage('Build Application') { - sh """ - cd angular - ng build --prod --build-optimizer - """ - } - - stage('Deployment') { - sshagent (credentials: ['3d0fa2a4-5cf0-4cf5-a3fd-23655eb33c11']) { - def CONTAINER_PORT = 8090 - sh """ - cd angular - # Copy resulting "dist" folder from workspace to deployment server - scp -o StrictHostKeyChecking=no -r dist root@${params.EXTERNAL_SERVER_IP}:/root/mythaistar/angular/ - - # Launch application in Docker container - ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker rm -f mts-angular - ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker run -itd --name=mts-angular -p ${CONTAINER_PORT}:80 cbelda/nginx-try-files - ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker exec mts-angular bash -c \\"rm /usr/share/nginx/html/*\\" - ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker cp mythaistar/angular/dist/. mts-angular:/usr/share/nginx/html/ - """ - echo "Your app is available in http://${params.EXTERNAL_SERVER_IP}:${CONTAINER_PORT}" - } - } -} \ No newline at end of file diff --git a/jenkins/angular/deployment/Jenkinsfile b/jenkins/angular/deployment/Jenkinsfile new file mode 100644 index 000000000..6dd60f985 --- /dev/null +++ b/jenkins/angular/deployment/Jenkinsfile @@ -0,0 +1,64 @@ +pipeline{ + agent any + + options { + buildDiscarder(logRotator(artifactDaysToKeepStr: '1', artifactNumToKeepStr: '1', daysToKeepStr: '5', numToKeepStr: '50')) + // Disable concurrent builds. It will wait until the pipeline finish before start a new one + // disableConcurrentBuilds() + } + + environment { + containerPort = 8090 + sshAgentCredentials = '3d0fa2a4-5cf0-4cf5-a3fd-23655eb33c11' + artifactId = 'mythaistar-restaurant' + + groupId = 'com/devonfw/mythaistar/mythaistar-restaurant/' + repositoryId = 'devon.snapshots' + repositoryUrl = 'http://nexus3-core:8081/nexus3/repository/releases/' + } + + parameters { + string(name: 'VERSION', defaultValue: '1.12.0', description: 'Version number (without -SNAPSHOT)') + string(name: 'EXTERNAL_SERVER_IP', defaultValue: '10.40.235.244', description: 'Server IP') + } + + stages { + stage ('Download artifact from Nexus') { + steps { + script { + sh """wget ${repositoryUrl}${groupId}${params.VERSION}/${artifactId}-${params.VERSION}.zip --content-disposition""" + sh "mkdir -p dist" + unzip dir: 'dist', zipFile: """${artifactId}-${params.VERSION}.zip""" + } + } + } + + stage ('Deployment') { + steps { + script { + dir('dist'){ + sshagent (credentials: [sshAgentCredentials]) { + sh """ + # Copy resulting "dist" folder from workspace to deployment server + scp -o StrictHostKeyChecking=no -r dist root@${params.EXTERNAL_SERVER_IP}:/root/mythaistar/angular/ + + # Launch application in Docker container + ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker rm -f mts-angular + ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker run -itd --name=mts-angular -p ${containerPort}:80 cbelda/nginx-try-files + ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker exec mts-angular bash -c \\"rm /usr/share/nginx/html/*\\" + ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker cp mythaistar/angular/dist/. mts-angular:/usr/share/nginx/html/ + """ + echo "Your app is available in http://${params.EXTERNAL_SERVER_IP}:${containerPort}" + } + } + } + } + } + } + + post { + always { + cleanWs() + } + } +} \ No newline at end of file diff --git a/jenkins/google-chrome-stable.png b/jenkins/google-chrome-stable.png new file mode 100644 index 0000000000000000000000000000000000000000..f5c0b4c7669f7a992f7370dd60de67810c253f91 GIT binary patch literal 31927 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
x?%& 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

*dWuI_X&q9JETFJ4z-@Q`^-{`>CZ49Z?)4F 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 literal 0 HcmV?d00001 diff --git a/jenkins/java/Jenkinsfile b/jenkins/java/Jenkinsfile deleted file mode 100644 index 5fa9e166a..000000000 --- a/jenkins/java/Jenkinsfile +++ /dev/null @@ -1,56 +0,0 @@ -node { - stage('Checking out MyThaiStar') { - deleteDir() - git branch: 'develop', credentialsId: 'github-devonfw-ci', url: 'https://github.com/devonfw/my-thai-star/' - } - stage('Load tools') { - tool name: 'Maven 3.3.9', type: 'maven' - env.JAVA_HOME="${tool 'OpenJDK 1.8'}" - env.PATH="${env.JAVA_HOME}/bin:${env.PATH}" - } - - // JACOCO and SONAR SCRIPT are REQUIRED. See: - // https://github.com/cbeldacap/my-thai-star/blob/develop/java/mtsj/pom.xml#L21-L61 - // https://github.com/cbeldacap/my-thai-star/blob/develop/java/mtsj/pom.xml#L185-L194 - // https://github.com/cbeldacap/my-thai-star/blob/develop/java/mtsj/pom.xml#L211-L282 - // stage('SonarQube analysis') { - // withMaven(globalMavenSettingsConfig: '9d437f6e-46e7-4a11-a8d1-2f0055f14033', jdk: 'OpenJDK 1.8', maven: 'Maven 3.3.9') { - // sh "cd java/mtsj && mvn sonar:sonar -X -Dsonar.login=${SONARQUBE_USERNAME} -Dsonar.password=${SONARQUBE_PASSWORD}" - // } - // } - - stage('Install dependencies') { - withMaven(globalMavenSettingsConfig: '9d437f6e-46e7-4a11-a8d1-2f0055f14033', jdk: 'OpenJDK 1.8', maven: 'Maven 3.3.9') { - sh "cd java/mtsj && mvn clean install -Dmaven.test.skip=true" - } - } - - stage('Execute tests') { - withMaven(globalMavenSettingsConfig: '9d437f6e-46e7-4a11-a8d1-2f0055f14033', jdk: 'OpenJDK 1.8', maven: 'Maven 3.3.9') { - sh "cd java/mtsj && mvn test" - } - } - - stage('Build and store in Nexus') { - withMaven(globalMavenSettingsConfig: '9d437f6e-46e7-4a11-a8d1-2f0055f14033', jdk: 'OpenJDK 1.8', maven: 'Maven 3.3.9') { - sh "cd java/mtsj && mvn clean deploy -Dmaven.test.skip=true" - } - } - - stage('Deployment') { - sshagent (credentials: ['3d0fa2a4-5cf0-4cf5-a3fd-23655eb33c11']) { - def CONTAINER_PORT = 9090 - sh """ - cd java/mtsj - # Copy resulting ".war" file from workspace to deployment server - scp -o StrictHostKeyChecking=no -r server/target/mythaistar.war root@${params.EXTERNAL_SERVER_IP}:/root/mythaistar/java/ - - # Launch application in Docker container - ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker rm -f mts-java - ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker run -itd --name=mts-java -p ${CONTAINER_PORT}:8080 tomcat:latest - ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker cp mythaistar/java/mythaistar.war mts-java:/usr/local/tomcat/webapps/ - """ - } - sh 'echo \\"Server available at http://de-mucdevondepl01:9090/mythaistar\\"' - } -} \ No newline at end of file diff --git a/jenkins/java8-jdk.png b/jenkins/java8-jdk.png new file mode 100644 index 0000000000000000000000000000000000000000..9fd72a0d146bb1a1dbd9376c68a69a42d8ffa710 GIT binary patch literal 17408 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 literal 0 HcmV?d00001 diff --git a/jenkins/maven.png b/jenkins/maven.png new file mode 100644 index 0000000000000000000000000000000000000000..14d9250e50beee42667fd1c9930b7f65153bf0b7 GIT binary patch literal 13313 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 literal 0 HcmV?d00001 diff --git a/jenkins/nodejs.png b/jenkins/nodejs.png new file mode 100644 index 0000000000000000000000000000000000000000..ef3eacf57bbce1c9eb89f8ee6c75ff05184ff2f3 GIT binary patch literal 26404 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 literal 0 HcmV?d00001 diff --git a/jenkins/pipeline-config.png b/jenkins/pipeline-config.png new file mode 100644 index 0000000000000000000000000000000000000000..ba1e433b7b2643085718d7ce88bc08353584db8d GIT binary patch literal 36361 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 literal 0 HcmV?d00001 diff --git a/jenkins/sonar-scanner.png b/jenkins/sonar-scanner.png new file mode 100644 index 0000000000000000000000000000000000000000..10d4ae15df05c05c9436cacf4035bc8953291ef6 GIT binary patch literal 13449 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 literal 0 HcmV?d00001 From 96ac088c81c5ffb25d9f50369e7db9e539d675a4 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Fri, 30 Nov 2018 15:33:09 +0100 Subject: [PATCH 25/29] Updated pipeline-config image --- jenkins/pipeline-config.png | Bin 36361 -> 39429 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/jenkins/pipeline-config.png b/jenkins/pipeline-config.png index ba1e433b7b2643085718d7ce88bc08353584db8d..41c2e972ccee992660f46537039557156747b080 100644 GIT binary patch literal 39429 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 z zX{TGwE4S%;^pwuDn;_>S1JGWx)>uJ~|EIk3j%zC0`aYxA4x%F<8iBDOy(ofGql2JQ zq&Mlkh9VF^O2z^x2&i2l)>>vza2LNdjtHu=3^BlvMO>t9crd3W?ML|2TKY{ zdNsuK$C3om36Aw{IX%{uHYO^3tdOJJ`9gzb8MGk+8a@cyX z;_`ef20S@rLCHyTm*RCWIAKym6FZ(PR|vaW{U{;7T^`lO7kZRa<$x9AERWBf`weC_~!_3lCut*%Oxpj@owe@w7UoW1QaPAl^yEyu`B%`1u=96jGc zInhH6Mxf)ZJg6(B?Yzq_d~MT+hp#Ks58mKkp7JS^My5)%bZ- z)$MKvgbgJKlBhb4G9#ayDmM%HHdp2^_AhtO29W4j%9awyzKid`{p&JKM$`n)Y=Sl<11{;p>8$&_obrr`EDX2m+qltkf@qz^&o z!FWHu2}H_}IKFaYP=90nDJNHs*HBvZIy^et@Xny}P|0kSXt9(tx%VQP79!bRwE%Cc z^qFr*_Z2J#Zh8%C!3F>A%)7SYD{IN~j-8jNkcN%#GQU!EeaX_kh%?<#x$}Kr%8Ei< z@OaHg(&};FGvNa0Y+RmsBalD#V((1bRYlrGON2@Ybo=ioQ1+ZX%d~Mg|ebJMC8{M5k%e_m9 z$g#k-vgrusp|IdY_eR5UgDP6Z%-TXzNLclkrYaBL5p`4@I~{2&E99EzfNB)1to!cI zQM>mSxQCS5T~A$=61CMY;&ZY4fYH^*?M$e(izh0SrH0&o^%iS|?&6u;GolWE#cxO?{l_*~RG#jo%O~x{enWh^(#U4{v)F)SFhsISLbX4QElw_7@vWqfA7@h8PId6>)nUo(I7YXN#c~Sb+2or zRgB!wkX$9m$<->lp*POhZQWEG((tw>s7!P7y

Gt3RDH&7jo5PBtV-6P7!oCYY!U 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 From 8a85ad478fea95af6d89d40dc2434ef2432f973d Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Mon, 3 Dec 2018 10:01:20 +0100 Subject: [PATCH 26/29] Updated deployment jenkinsfile. concurrent builds disabled --- jenkins/angular/deployment/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jenkins/angular/deployment/Jenkinsfile b/jenkins/angular/deployment/Jenkinsfile index 6dd60f985..8b0a840ce 100644 --- a/jenkins/angular/deployment/Jenkinsfile +++ b/jenkins/angular/deployment/Jenkinsfile @@ -4,7 +4,7 @@ pipeline{ options { buildDiscarder(logRotator(artifactDaysToKeepStr: '1', artifactNumToKeepStr: '1', daysToKeepStr: '5', numToKeepStr: '50')) // Disable concurrent builds. It will wait until the pipeline finish before start a new one - // disableConcurrentBuilds() + disableConcurrentBuilds() } environment { From fe1511c8fa86e8302d7e594eb095cfe64d6a7994 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Mon, 3 Dec 2018 17:15:45 +0100 Subject: [PATCH 27/29] Updated angular jenkinsfile --- jenkins/angular/cicd/Jenkinsfile | 49 ++++++++++++++------------------ 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index fee89fccd..ced5ea4ee 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -5,6 +5,8 @@ pipeline{ buildDiscarder(logRotator(artifactDaysToKeepStr: '1', artifactNumToKeepStr: '1', daysToKeepStr: '5', numToKeepStr: '50')) // Disable concurrent builds. It will wait until the pipeline finish before start a new one // disableConcurrentBuilds() + + checkoutToSubdirectory 'angular' } tools { @@ -16,6 +18,7 @@ pipeline{ lintScript = "lint" testScript = "test:ci" angularDir = "angular" + chrome = 'Chrome-stable' // sonarQube sonarTool = 'SonarQube-scanner' @@ -33,54 +36,46 @@ pipeline{ stages { stage ('Loading Custom Tools') { steps { - tool 'Chrome-stable' + tool chrome } } stage ('Fresh Dependency Installation') { steps { - dir(angularDir){ - sh "yarn" - } + sh "yarn" } } stage ('Code Linting') { steps { - dir(angularDir) { - sh """yarn ${lintScript}""" - } + sh """yarn ${lintScript}""" } } stage ('Execute Angular tests') { steps { - dir(angularDir) { sh """yarn ${testScript}""" - } } } stage ('SonarQube code analysis') { steps { script { - dir(angularDir) { - def scannerHome = tool sonarTool - def props = readJSON file: 'package.json' - withSonarQubeEnv(sonarEnv) { - sh """ - ${scannerHome}/bin/sonar-scanner \ - -Dsonar.projectKey=${props.name} \ - -Dsonar.projectName=${props.name} \ - -Dsonar.projectVersion=${props.version} \ - -Dsonar.sources=src - """ - } - def qg = waitForQualityGate() - if (qg.status != 'OK') { - error "Pipeline aborted due to quality gate failure: ${qg.status}" - } + def scannerHome = tool sonarTool + def props = readJSON file: 'package.json' + withSonarQubeEnv(sonarEnv) { + sh """ + ${scannerHome}/bin/sonar-scanner \ + -Dsonar.projectKey=${props.name} \ + -Dsonar.projectName=${props.name} \ + -Dsonar.projectVersion=${props.version} \ + -Dsonar.sources=src + """ + } + def qg = waitForQualityGate() + if (qg.status != 'OK') { + error "Pipeline aborted due to quality gate failure: ${qg.status}" } } } @@ -88,9 +83,7 @@ pipeline{ stage ('Build Application') { steps { - dir(angularDir) { - sh """yarn ${buildScript}""" - } + sh """yarn ${buildScript}""" } } From 69d008cb467721cf8a1ec3997fd5ffa9e38ffe79 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Mon, 3 Dec 2018 21:28:46 +0100 Subject: [PATCH 28/29] Updated jenkinsfile --- jenkins/angular/cicd/Jenkinsfile | 71 +++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index ced5ea4ee..a6f0e9790 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -4,9 +4,7 @@ pipeline{ options { buildDiscarder(logRotator(artifactDaysToKeepStr: '1', artifactNumToKeepStr: '1', daysToKeepStr: '5', numToKeepStr: '50')) // Disable concurrent builds. It will wait until the pipeline finish before start a new one - // disableConcurrentBuilds() - - checkoutToSubdirectory 'angular' + disableConcurrentBuilds() } tools { @@ -14,22 +12,37 @@ pipeline{ } environment { - buildScript = "build:prodcompose" - lintScript = "lint" - testScript = "test:ci" - angularDir = "angular" + // Script for build the application. Defined at package.json + buildScript = 'build:prodcompose' + // Script for lint the application. Defined at package.json + lintScript = 'lint' + // Script for test the application. Defined at package.json + testScript = 'test:ci' + // Angular directory + angularDir = 'angular' + // SRC folder. It will be angularDir/srcDir + srcDir = 'src' + // Name of the custom tool for chrome stable chrome = 'Chrome-stable' // sonarQube + // Name of the sonarQube tool sonarTool = 'SonarQube-scanner' + // Name of the sonarQube environment sonarEnv = "SonarQube" // Nexus + // Artifact groupId groupId = 'com.devonfw.mythaistar' + // Nexus repository ID repositoryId = 'devon.releases' + // Nexus internal URL repositoryUrl = 'http://nexus3-core:8081/nexus3/repository/releases' + // Maven global settings ID mavenGlobalSettings = '9d437f6e-46e7-4a11-a8d1-2f0055f14033' + // JavaJDK tool id javaJdk = 'Java8' + // Maven tool id mavenInstallation = 'Maven3' } @@ -43,39 +56,47 @@ pipeline{ stage ('Fresh Dependency Installation') { steps { - sh "yarn" + dir(angularDir){ + sh "yarn" + } } } stage ('Code Linting') { steps { - sh """yarn ${lintScript}""" + dir(angularDir) { + sh """yarn ${lintScript}""" + } } } stage ('Execute Angular tests') { steps { + dir(angularDir) { sh """yarn ${testScript}""" + } } } stage ('SonarQube code analysis') { steps { script { - def scannerHome = tool sonarTool - def props = readJSON file: 'package.json' - withSonarQubeEnv(sonarEnv) { - sh """ - ${scannerHome}/bin/sonar-scanner \ - -Dsonar.projectKey=${props.name} \ - -Dsonar.projectName=${props.name} \ - -Dsonar.projectVersion=${props.version} \ - -Dsonar.sources=src - """ - } - def qg = waitForQualityGate() - if (qg.status != 'OK') { - error "Pipeline aborted due to quality gate failure: ${qg.status}" + dir(angularDir) { + def scannerHome = tool sonarTool + def props = readJSON file: 'package.json' + withSonarQubeEnv(sonarEnv) { + sh """ + ${scannerHome}/bin/sonar-scanner \ + -Dsonar.projectKey=${props.name} \ + -Dsonar.projectName=${props.name} \ + -Dsonar.projectVersion=${props.version} \ + -Dsonar.sources=${srcDir} + """ + } + def qg = waitForQualityGate() + if (qg.status != 'OK') { + error "Pipeline aborted due to quality gate failure: ${qg.status}" + } } } } @@ -83,7 +104,9 @@ pipeline{ stage ('Build Application') { steps { - sh """yarn ${buildScript}""" + dir(angularDir) { + sh """yarn ${buildScript}""" + } } } From 9b35d6b03f54d127c926ff3ddb0bfb1aae7d39b4 Mon Sep 17 00:00:00 2001 From: Dario Rodriguez Gonzalez Date: Tue, 4 Dec 2018 10:46:01 +0100 Subject: [PATCH 29/29] Updated files. All ready to relase a new MTS version --- jenkins/angular/README.md | 0 jenkins/angular/cicd/Jenkinsfile | 6 +-- jenkins/angular/deployment/Jenkinsfile | 64 -------------------------- jenkins/java/README.md | 0 jenkins/java/cicd/Jenkinsfile | 4 ++ 5 files changed, 7 insertions(+), 67 deletions(-) delete mode 100644 jenkins/angular/README.md delete mode 100644 jenkins/angular/deployment/Jenkinsfile delete mode 100644 jenkins/java/README.md diff --git a/jenkins/angular/README.md b/jenkins/angular/README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/jenkins/angular/cicd/Jenkinsfile b/jenkins/angular/cicd/Jenkinsfile index a6f0e9790..d2ccc3694 100644 --- a/jenkins/angular/cicd/Jenkinsfile +++ b/jenkins/angular/cicd/Jenkinsfile @@ -35,9 +35,9 @@ pipeline{ // Artifact groupId groupId = 'com.devonfw.mythaistar' // Nexus repository ID - repositoryId = 'devon.releases' + repositoryId = 'devon.snapshots' // Nexus internal URL - repositoryUrl = 'http://nexus3-core:8081/nexus3/repository/releases' + repositoryUrl = 'http://nexus3-core:8081/nexus3/repository/snapshots' // Maven global settings ID mavenGlobalSettings = '9d437f6e-46e7-4a11-a8d1-2f0055f14033' // JavaJDK tool id @@ -121,7 +121,7 @@ pipeline{ mvn deploy:deploy-file \ -DgroupId=${groupId} \ -DartifactId=${props.name} \ - -Dversion=${props.version} \ + -Dversion=${props.version}-SNAPSHOT \ -Dpackaging=zip \ -Dfile=${props.name}.zip \ -DrepositoryId=${repositoryId} \ diff --git a/jenkins/angular/deployment/Jenkinsfile b/jenkins/angular/deployment/Jenkinsfile deleted file mode 100644 index 8b0a840ce..000000000 --- a/jenkins/angular/deployment/Jenkinsfile +++ /dev/null @@ -1,64 +0,0 @@ -pipeline{ - agent any - - options { - buildDiscarder(logRotator(artifactDaysToKeepStr: '1', artifactNumToKeepStr: '1', daysToKeepStr: '5', numToKeepStr: '50')) - // Disable concurrent builds. It will wait until the pipeline finish before start a new one - disableConcurrentBuilds() - } - - environment { - containerPort = 8090 - sshAgentCredentials = '3d0fa2a4-5cf0-4cf5-a3fd-23655eb33c11' - artifactId = 'mythaistar-restaurant' - - groupId = 'com/devonfw/mythaistar/mythaistar-restaurant/' - repositoryId = 'devon.snapshots' - repositoryUrl = 'http://nexus3-core:8081/nexus3/repository/releases/' - } - - parameters { - string(name: 'VERSION', defaultValue: '1.12.0', description: 'Version number (without -SNAPSHOT)') - string(name: 'EXTERNAL_SERVER_IP', defaultValue: '10.40.235.244', description: 'Server IP') - } - - stages { - stage ('Download artifact from Nexus') { - steps { - script { - sh """wget ${repositoryUrl}${groupId}${params.VERSION}/${artifactId}-${params.VERSION}.zip --content-disposition""" - sh "mkdir -p dist" - unzip dir: 'dist', zipFile: """${artifactId}-${params.VERSION}.zip""" - } - } - } - - stage ('Deployment') { - steps { - script { - dir('dist'){ - sshagent (credentials: [sshAgentCredentials]) { - sh """ - # Copy resulting "dist" folder from workspace to deployment server - scp -o StrictHostKeyChecking=no -r dist root@${params.EXTERNAL_SERVER_IP}:/root/mythaistar/angular/ - - # Launch application in Docker container - ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker rm -f mts-angular - ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker run -itd --name=mts-angular -p ${containerPort}:80 cbelda/nginx-try-files - ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker exec mts-angular bash -c \\"rm /usr/share/nginx/html/*\\" - ssh -o StrictHostKeyChecking=no root@${params.EXTERNAL_SERVER_IP} docker cp mythaistar/angular/dist/. mts-angular:/usr/share/nginx/html/ - """ - echo "Your app is available in http://${params.EXTERNAL_SERVER_IP}:${containerPort}" - } - } - } - } - } - } - - post { - always { - cleanWs() - } - } -} \ No newline at end of file diff --git a/jenkins/java/README.md b/jenkins/java/README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/jenkins/java/cicd/Jenkinsfile b/jenkins/java/cicd/Jenkinsfile index a1d76bc36..d6fc226ee 100644 --- a/jenkins/java/cicd/Jenkinsfile +++ b/jenkins/java/cicd/Jenkinsfile @@ -13,9 +13,13 @@ pipeline{ } environment { + // Directory with java project javaDir = 'java/mtsj' + // Maven global settings ID mavenGlobalSettings = '9d437f6e-46e7-4a11-a8d1-2f0055f14033' + // sonarQube + // Name of the sonarQube environment sonarEnv = "SonarQube" }