From 4ed887726ac2103aa9940675dc1345ea3954756c Mon Sep 17 00:00:00 2001 From: norahalr Date: Sun, 20 Jul 2025 14:41:32 +0300 Subject: [PATCH 01/11] added application info --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a8ee7312..584e3917 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +2 TRY + Example Voting App ========= From 990ffa762f6e46f97f88174eaec40d7c67fba3d8 Mon Sep 17 00:00:00 2001 From: norahalr Date: Sun, 20 Jul 2025 15:02:36 +0300 Subject: [PATCH 02/11] added Jenkinsfile for worker with build job --- worker/Jenkinsfile.groovy | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 worker/Jenkinsfile.groovy diff --git a/worker/Jenkinsfile.groovy b/worker/Jenkinsfile.groovy new file mode 100644 index 00000000..e94d7c5a --- /dev/null +++ b/worker/Jenkinsfile.groovy @@ -0,0 +1,31 @@ +pipeline { + agent any + tools { + maven 'maven 3.9.8' + } + stages { + stage("build") { + steps { + echo 'Compiling worker app' + dir('worker') { + sh 'mvn compile' + } + } + } + stage("test") { + steps { + echo 'Running Unit Tests on worker app' + } + } + stage("package") { + steps { + echo 'Packaging worker app' + } + } + } + post { + always { + echo 'Building multibranch pipeline for worker is completed..' + } + } +} From 5da7700627e5eeefa71cfe713a242de47b7d723a Mon Sep 17 00:00:00 2001 From: norahalr Date: Sun, 20 Jul 2025 15:16:31 +0300 Subject: [PATCH 03/11] added Test and package job for worker pipeline --- worker/Jenkinsfile.groovy | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/worker/Jenkinsfile.groovy b/worker/Jenkinsfile.groovy index e94d7c5a..5773c20c 100644 --- a/worker/Jenkinsfile.groovy +++ b/worker/Jenkinsfile.groovy @@ -6,7 +6,7 @@ pipeline { stages { stage("build") { steps { - echo 'Compiling worker app' + echo 'Compiling worker app..' dir('worker') { sh 'mvn compile' } @@ -14,12 +14,18 @@ pipeline { } stage("test") { steps { - echo 'Running Unit Tests on worker app' + echo 'Running Unit Tests on worker app..' + dir('worker') { + sh 'mvn clean test' + } } } stage("package") { steps { echo 'Packaging worker app' + dir('worker') { + sh 'mvn package' + } } } } From a1fe8db689edfb492ab1cc34a601e95b1813cdbe Mon Sep 17 00:00:00 2001 From: norahalr Date: Sun, 20 Jul 2025 15:20:08 +0300 Subject: [PATCH 04/11] added Test and package job for worker pipeline --- worker/Jenkinsfile.groovy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worker/Jenkinsfile.groovy b/worker/Jenkinsfile.groovy index 5773c20c..d1a28890 100644 --- a/worker/Jenkinsfile.groovy +++ b/worker/Jenkinsfile.groovy @@ -24,13 +24,14 @@ pipeline { steps { echo 'Packaging worker app' dir('worker') { - sh 'mvn package' + sh 'mvn package -DskipTests' } } } } post { always { + archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true echo 'Building multibranch pipeline for worker is completed..' } } From 93702d886f3baec4a31880784e386558d2956eb5 Mon Sep 17 00:00:00 2001 From: norahalr Date: Mon, 21 Jul 2025 09:09:47 +0300 Subject: [PATCH 05/11] adding Jenkinsfile for result app --- result/Jenkinsfile.groovy | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 result/Jenkinsfile.groovy diff --git a/result/Jenkinsfile.groovy b/result/Jenkinsfile.groovy new file mode 100644 index 00000000..d1a28890 --- /dev/null +++ b/result/Jenkinsfile.groovy @@ -0,0 +1,38 @@ +pipeline { + agent any + tools { + maven 'maven 3.9.8' + } + stages { + stage("build") { + steps { + echo 'Compiling worker app..' + dir('worker') { + sh 'mvn compile' + } + } + } + stage("test") { + steps { + echo 'Running Unit Tests on worker app..' + dir('worker') { + sh 'mvn clean test' + } + } + } + stage("package") { + steps { + echo 'Packaging worker app' + dir('worker') { + sh 'mvn package -DskipTests' + } + } + } + } + post { + always { + archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true + echo 'Building multibranch pipeline for worker is completed..' + } + } +} From 344171a3f7532ce13a588cb7edc8412b9764c603 Mon Sep 17 00:00:00 2001 From: norahalr Date: Mon, 21 Jul 2025 09:14:17 +0300 Subject: [PATCH 06/11] adding mock test --- result/test/mock.test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/result/test/mock.test.js b/result/test/mock.test.js index aac87156..716f6f5a 100644 --- a/result/test/mock.test.js +++ b/result/test/mock.test.js @@ -32,6 +32,7 @@ describe('mock test 5', () => { }); }); + describe('mock test 6', () => { it('unit test 6', () => { expect(true).to.be.true; From 7eb39e8a3164a311a5c71e72a2b1cfef8338bff1 Mon Sep 17 00:00:00 2001 From: norahalr Date: Mon, 21 Jul 2025 10:06:49 +0300 Subject: [PATCH 07/11] add docker based agent --- worker/Jenkinsfile.groovy | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/worker/Jenkinsfile.groovy b/worker/Jenkinsfile.groovy index d1a28890..05c16990 100644 --- a/worker/Jenkinsfile.groovy +++ b/worker/Jenkinsfile.groovy @@ -1,38 +1,40 @@ pipeline { - agent any - tools { - maven 'maven 3.9.8' + agent { + docker { + image 'maven:3.9.8-sapmachine-21' + args '-v $HOME/.m2:/root/.m2' + } } stages { - stage("build") { + stage('build') { steps { - echo 'Compiling worker app..' + echo 'building worker app' dir('worker') { sh 'mvn compile' } } } - stage("test") { + stage('test') { steps { - echo 'Running Unit Tests on worker app..' + echo 'running unit tests on worker app' dir('worker') { sh 'mvn clean test' } } } - stage("package") { + stage('package') { steps { - echo 'Packaging worker app' + echo 'packaging worker app into a jarfile' dir('worker') { sh 'mvn package -DskipTests' + archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true } } } } post { always { - archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true - echo 'Building multibranch pipeline for worker is completed..' + echo 'the job is complete' } } } From a5e811d4f8973c18dfbb1176ec555b96a9524e0c Mon Sep 17 00:00:00 2001 From: norahalr Date: Mon, 21 Jul 2025 14:56:43 +0300 Subject: [PATCH 08/11] adding Dockerfile for worker --- worker/Dockerfile | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 worker/Dockerfile diff --git a/worker/Dockerfile b/worker/Dockerfile new file mode 100644 index 00000000..fb0b0cbc --- /dev/null +++ b/worker/Dockerfile @@ -0,0 +1,6 @@ +FROM maven:3.9.8-sapmachine-21 +WORKDIR /app +COPY . . +RUN mvn package && \ + mv target/worker-jar-with-dependencies.jar /run/worker.jar && rm -rf /app/* +CMD ["java", "-jar", "/run/worker.jar"] From bed2ac7972232c38d65cf7afd1c089d7183a4e9b Mon Sep 17 00:00:00 2001 From: norahalr Date: Mon, 21 Jul 2025 15:41:01 +0300 Subject: [PATCH 09/11] Added Docker build stage to Jenkinsfile --- worker/Jenkinsfile.groovy | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/worker/Jenkinsfile.groovy b/worker/Jenkinsfile.groovy index 05c16990..f7c2b5cd 100644 --- a/worker/Jenkinsfile.groovy +++ b/worker/Jenkinsfile.groovy @@ -24,13 +24,26 @@ pipeline { } stage('package') { steps { - echo 'packaging worker app into a jarfile' + echo 'packaging worker app into a jar file' dir('worker') { sh 'mvn package -DskipTests' archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true } } } + stage('docker-package') { + agent any + steps { + echo 'Packaging worker app with docker' + script { + docker.withRegistry('https://index.docker.io/v1/', 'dockerlogin') { + def workerImage = docker.build("norahns/worker:${env.BUILD_ID}", "./worker") + workerImage.push() + workerImage.push("latest") + } + } + } + } } post { always { From 7f5babcb192b8a28830dbb666c6ae4965a7a4970 Mon Sep 17 00:00:00 2001 From: norahalr Date: Mon, 21 Jul 2025 16:03:15 +0300 Subject: [PATCH 10/11] per stage agents, conditional execution --- worker/Jenkinsfile.groovy | 122 ++++++++++++++++++++++++-------------- 1 file changed, 79 insertions(+), 43 deletions(-) diff --git a/worker/Jenkinsfile.groovy b/worker/Jenkinsfile.groovy index f7c2b5cd..47a7e1a3 100644 --- a/worker/Jenkinsfile.groovy +++ b/worker/Jenkinsfile.groovy @@ -1,53 +1,89 @@ pipeline { - agent { - docker { + + agent none + + stages{ + stage("build"){ + when{ + changeset "**/worker/**" + } + + agent{ + docker{ image 'maven:3.9.8-sapmachine-21' args '-v $HOME/.m2:/root/.m2' + } } - } - stages { - stage('build') { - steps { - echo 'building worker app' - dir('worker') { - sh 'mvn compile' - } - } + + steps{ + echo 'Compiling worker app..' + dir('worker'){ + sh 'mvn compile' + } } - stage('test') { - steps { - echo 'running unit tests on worker app' - dir('worker') { - sh 'mvn clean test' - } - } + } + stage("test"){ + when{ + changeset "**/worker/**" } - stage('package') { - steps { - echo 'packaging worker app into a jar file' - dir('worker') { - sh 'mvn package -DskipTests' - archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true - } - } + agent{ + docker{ + image 'maven:3.9.8-sapmachine-21' + args '-v $HOME/.m2:/root/.m2' + } } - stage('docker-package') { - agent any - steps { - echo 'Packaging worker app with docker' - script { - docker.withRegistry('https://index.docker.io/v1/', 'dockerlogin') { - def workerImage = docker.build("norahns/worker:${env.BUILD_ID}", "./worker") - workerImage.push() - workerImage.push("latest") - } - } - } + steps{ + echo 'Running Unit Tets on worker app..' + dir('worker'){ + sh 'mvn clean test' + } + + } + } + stage("package"){ + when{ + branch 'master' + changeset "**/worker/**" } - } - post { - always { - echo 'the job is complete' + agent{ + docker{ + image 'maven:3.9.8-sapmachine-21' + args '-v $HOME/.m2:/root/.m2' + } + } + steps{ + echo 'Packaging worker app' + dir('worker'){ + sh 'mvn package -DskipTests' + archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true + } + } + } + + stage('docker-package'){ + agent any + when{ + changeset "**/worker/**" + branch 'master' + } + steps{ + echo 'Packaging worker app with docker' + script{ + docker.withRegistry('https://index.docker.io/v1/', 'dockerlogin') { + def workerImage = docker.build("norahns/worker:v${env.BUILD_ID}", "./worker") + workerImage.push() + workerImage.push("${env.BRANCH_NAME}") + workerImage.push("latest") + } + } + } + } + } + + post{ + always{ + echo 'Building multibranch pipeline for worker is completed..' } -} + } +} \ No newline at end of file From ff57944d1d34037626a57d301ca5ba9de75b9e46 Mon Sep 17 00:00:00 2001 From: norahalr Date: Mon, 21 Jul 2025 16:36:11 +0300 Subject: [PATCH 11/11] Added Dockerfiles and Jenkinsfiles for vote/result --- result/Dockerfile | 23 +++++++++++++ result/Jenkinsfile | 84 ++++++++++++++++++++++++++++++++++++++++++++++ vote/Dockerfile | 22 ++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 result/Dockerfile create mode 100644 result/Jenkinsfile create mode 100644 vote/Dockerfile diff --git a/result/Dockerfile b/result/Dockerfile new file mode 100644 index 00000000..a3dc9802 --- /dev/null +++ b/result/Dockerfile @@ -0,0 +1,23 @@ +FROM node:22.4.0-slim + +# Install curl for health checks and tini for process management +RUN apt-get update && \ + apt-get install -y --no-install-recommends curl tini && \ + rm -rf /var/lib/apt/lists/* + +WORKDIR /usr/local/app + +# Install nodemon for development (optional) +RUN npm install -g nodemon + +COPY package*.json ./ +RUN npm ci && \ + npm cache clean --force && \ + mv /usr/local/app/node_modules /node_modules + +COPY . . +ENV PORT 80 +EXPOSE 80 + +ENTRYPOINT ["/usr/bin/tini", "--"] +CMD ["node", "server.js"] \ No newline at end of file diff --git a/result/Jenkinsfile b/result/Jenkinsfile new file mode 100644 index 00000000..1af2dd2a --- /dev/null +++ b/result/Jenkinsfile @@ -0,0 +1,84 @@ +pipeline { + agent none + + stages { + stage("build") { + when { + changeset "**/worker/**" + } + agent { + docker { + image 'maven:3.9.8-sapmachine-21' + args '-v $HOME/.m2:/root/.m2' + } + } + steps { + echo 'Compiling worker app..' + dir('worker') { + sh 'mvn compile' + } + } + } + + stage("test") { + when { + changeset "**/worker/**" + } + agent { + docker { + image 'maven:3.9.8-sapmachine-21' + args '-v $HOME/.m2:/root/.m2' + } + } + steps { + echo 'Running Unit Tests on worker app..' + dir('worker') { + sh 'mvn clean test' + } + } + } + + stage("package") { + when { + branch 'master' + changeset "**/worker/**" + } + agent { + docker { + image 'maven:3.9.8-sapmachine-21' + args '-v $HOME/.m2:/root/.m2' + } + } + steps { + echo 'Packaging worker app' + dir('worker') { + sh 'mvn package -DskipTests' + archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true + } + } + } + + stage('docker-package') { + agent any + when { + branch 'master' + changeset "**/result/**" + } + steps { + script { + docker.withRegistry('https://index.docker.io/v1/', 'dockerlogin') { + def resultImage = docker.build("norahns/result:v${env.BUILD_ID}", "./result") + resultImage.push() + resultImage.push("latest") + } + } + } + } + } + + post { + always { + echo 'Building multibranch pipeline for worker is completed..' + } + } +} diff --git a/vote/Dockerfile b/vote/Dockerfile new file mode 100644 index 00000000..7df264c4 --- /dev/null +++ b/vote/Dockerfile @@ -0,0 +1,22 @@ +FROM python:3.11-slim AS base + +# Install curl for health checks +RUN apt-get update && \ + apt-get install -y --no-install-recommends curl && \ + rm -rf /var/lib/apt/lists/* + +WORKDIR /usr/local/app +COPY requirements.txt ./ +RUN pip install --no-cache-dir -r requirements.txt + +# Development stage (optional) +FROM base AS dev +RUN pip install watchdog +ENV FLASK_ENV=development +CMD ["python", "app.py"] + +# Production stage +FROM base AS final +COPY . . +EXPOSE 80 +CMD ["gunicorn", "app:app", "-b", "0.0.0.0:80", "--log-file", "-", "--access-logfile", "-", "--workers", "4", "--keep-alive", "0"] \ No newline at end of file