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 ========= 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/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..' + } + } +} 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; 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 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"] diff --git a/worker/Jenkinsfile.groovy b/worker/Jenkinsfile.groovy new file mode 100644 index 00000000..47a7e1a3 --- /dev/null +++ b/worker/Jenkinsfile.groovy @@ -0,0 +1,89 @@ +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 Tets 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{ + 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