Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
FROM node:18-alpine AS builder

# Add metadata for authorship and app identification
LABEL maintainer="Amitabh Soni <amitabhdevops2024@gmail.com>" \
LABEL maintainer="Shubham Tayde <devshubh2204@gmail.com>" \
app="gemini" \
stage="build"

Expand All @@ -27,7 +27,7 @@ RUN rm -rf node_modules && npm cache clean --force
FROM node:18-alpine AS production

# Add metadata for the final image
LABEL maintainer="Amitabh Soni <amitabhdevops2024@gmail.com>" \
LABEL maintainer="Shubham Tayde <devshubh2204@gmail.com>" \
app="gemini" \
stage="production"

Expand All @@ -47,4 +47,4 @@ ENV NODE_ENV=production

EXPOSE 3000

CMD ["npm", "start"]
CMD ["npm", "start"]
14 changes: 7 additions & 7 deletions GitOps/Jenkinsfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
@Library('Shared')_

pipeline {
agent { label 'dev-server' }
agent any

parameters {
string(name: 'GEMINI_DOCKER_TAG', defaultValue: 'v1', description: 'Docker tag for gemini image')
Expand All @@ -16,7 +16,7 @@ pipeline {

stage("Git: Code Checkout") {
steps {
clone("https://github.com/Amitabh-DevOps/dev-gemini-clone.git", "DevOps")
clone("https://github.com/AWS-DevOps-shubh/dev-gemini-clone.git", "dev-shubh")
}
}

Expand All @@ -29,7 +29,7 @@ pipeline {
stage("Update: Kubernetes Manifest") {
steps {
dir('kubernetes') {
sh "sed -i 's|amitabhdevops/geminiamit.*|amitabhdevops/geminiamit:${params.GEMINI_DOCKER_TAG}|' gemini-deployment.yml"
sh "sed -i 's|devshubh2204/geminishubham.*|devshubh2204/geminishubham:${params.GEMINI_DOCKER_TAG}|' gemini-deployment.yml"
}
}
}
Expand All @@ -48,7 +48,7 @@ pipeline {
git commit -m "Update gemini image to ${GEMINI_DOCKER_TAG}"

echo "Pushing changes to github: "
git push https://github.com/Amitabh-DevOps/dev-gemini-clone.git DevOps
git push https://github.com/AWS-DevOps-shubh/dev-gemini-clone.git dev-shubh
'''
}
}
Expand Down Expand Up @@ -106,7 +106,7 @@ pipeline {
</p>
</div>
""",
to: "amitabhdevops2024@gmail.com",
to: "shubhamtayde2409@gmail.com",
from: "[email protected]",
mimeType: 'text/html'
)
Expand Down Expand Up @@ -158,7 +158,7 @@ pipeline {
</p>
</div>
""",
to: "amitabhdevops2024@gmail.com",
to: "shubhamtayde2409@gmail.com",
from: "[email protected]",
mimeType: 'text/html'
)
Expand All @@ -167,4 +167,4 @@ pipeline {
cleanWs()
}
}
}
}
221 changes: 59 additions & 162 deletions Jenkinsfile
Original file line number Diff line number Diff line change
@@ -1,184 +1,81 @@
@Library('Shared')_
@Library('shared') _

pipeline {
agent { label 'dev-server' }
agent any

environment {
SONAR_HOME = tool "Sonar"
DOCKER_IMAGE = "geminiamit"
GIT_REPO = "https://github.com/Amitabh-DevOps/dev-gemini-clone.git"
GIT_BRANCH = "DevOps"
DOCKERHUB_USERNAME = "amitabhdevops"
DOCKER_IMAGE_NAME = "${DOCKERHUB_USERNAME}/${DOCKER_IMAGE}"
}
parameters {
string(name: 'GEMINI_DOCKER_TAG', defaultValue: 'v1', description: 'Setting docker image for latest push')
DOCKER_IMAGE_NAME = 'devshubh2204/geminiclonenip'
DOCKER_IMAGE_TAG = "${BUILD_NUMBER}"
GITHUB_CREDENTIALS = credentials('git-hub-cred')
GIT_BRANCH = "dev-shubh"
}

stages {
stage("Clean Workspace") {
steps {
cleanWs()
}
}
stage("Code") {
steps {
// Use GIT_REPO and GIT_BRANCH from environment variables
clone("${GIT_REPO}", "${GIT_BRANCH}")
echo "Code cloning done from ${GIT_REPO} branch ${GIT_BRANCH}."
}
}
stage("Prepare Environment File") {
steps {
prepareEnvFile('.env.local', '.env.local')
}
}
stage("Build") {
steps {
dockerbuild("${DOCKER_IMAGE}", "${params.GEMINI_DOCKER_TAG}")
echo "Docker image ${DOCKER_IMAGE}:${params.GEMINI_DOCKER_TAG} built successfully."
}
}
stage("SonarQube Quality Analysis") {
steps {
sonarqube_analysis('Sonar', "${DOCKER_IMAGE}", "${DOCKER_IMAGE}")
}
}
stage("OWASP : Dependency Check") {
stage('Cleanup Workspace') {
steps {
owasp_dependency()
script {
clean_ws()
}
}
}
stage("Sonar Quality Gate Scan") {

stage('Clone Repository') {
steps {
sonarqube_code_quality()
script {
clone("https://github.com/AWS-DevOps-shubh/dev-gemini-clone.git", "dev-shubh")
}
}
}
stage("Docker Image Security Scan (Trivy)") {
steps {
dockerScanTrivy("${DOCKER_IMAGE}", "${params.GEMINI_DOCKER_TAG}")
echo "Trivy scan completed for ${DOCKER_IMAGE}:${params.GEMINI_DOCKER_TAG}."

stage('Build and Scan Docker Image') {
parallel {
stage('Build Main App Image') {
steps {
script {
docker_build(
imageName: env.DOCKER_IMAGE_NAME,
imageTag: env.DOCKER_IMAGE_TAG,
dockerfile: 'Dockerfile',
context: '.'
)
}
}
}

stage('Security Scan with Trivy') {
steps {
script {
trivy()
}
}
}
}
}
stage("Push to DockerHub") {

stage('Push Docker Images') {
steps {
dockerpush("dockerHub", "${DOCKER_IMAGE}", "${params.GEMINI_DOCKER_TAG}")
echo "Pushed ${DOCKERHUB_USERNAME}/${DOCKER_IMAGE}:${params.GEMINI_DOCKER_TAG} to DockerHub."
script {
docker_push(
imageName: env.DOCKER_IMAGE_NAME,
imageTag: env.DOCKER_IMAGE_TAG,
credentials: 'docker-hub-cred'
)
}
}
}
// Uncommented and updated the "Run Container" stage to use environment variables
// stage("Run Container") {
// steps {
// dockerRunApp("${DOCKER_IMAGE}", "${params.GEMINI_DOCKER_TAG}", "env_local", "${DOCKER_IMAGE}", "--env-file .env.local -p 3000:3000")
// echo "Container started using ${DOCKER_IMAGE}:${DOCKER_TAG} with container name '${DOCKER_IMAGE}'."
// }
// }
stage("Cleanup Docker Images") {

stage('Update Kubernetes Manifests') {
steps {
script {
sh "docker rmi ${DOCKER_IMAGE}:${params.GEMINI_DOCKER_TAG} || true"
sh "docker rmi ${DOCKERHUB_USERNAME}/${DOCKER_IMAGE}:${params.GEMINI_DOCKER_TAG} || true"
sh "docker image prune -f"
updatek8s(
imageTag: env.DOCKER_IMAGE_TAG,
manifestsPath: 'kubernetes',
gitCredentials: 'git-hub-cred',
gitUserName: 'AWS-DevOps-shubh',
gitUserEmail: '[email protected]',
)
}
echo "Cleaned up Docker image: ${DOCKERHUB_USERNAME}/${DOCKER_IMAGE}:${params.GEMINI_DOCKER_TAG}."
}
}
}
post {
success {
archiveArtifacts artifacts: 'kubernetes/gemini-deployment.yml', followSymlinks: false
build job: "Gemini-CD", parameters: [
string(name: 'GEMINI_DOCKER_TAG', value: "${params.GEMINI_DOCKER_TAG}")
]
echo "Pipeline completed successfully!"
emailext (
subject: "SUCCESS: Jenkins Pipeline for ${DOCKER_IMAGE}",
body: """
<div style="font-family: Arial, sans-serif; padding: 20px; border: 2px solid #4CAF50; border-radius: 10px;">
<h2 style="color: #4CAF50;">🎉 Pipeline Execution: SUCCESS 🎉</h2>
<p style="font-size: 16px; color: #333;">
Hello Team,
</p>
<p style="font-size: 16px; color: #333;">
The Jenkins CI pipeline for <strong style="color: #4CAF50;">${DOCKER_IMAGE}</strong> completed <strong style="color: #4CAF50;">successfully</strong>!
</p>
<table style="width: 100%; border-collapse: collapse; margin-top: 20px;">
<tr style="background-color: #f2f2f2;">
<th style="text-align: left; padding: 8px; border: 1px solid #ddd;">Details</th>
<th style="text-align: left; padding: 8px; border: 1px solid #ddd;">Values</th>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">Git Repository</td>
<td style="padding: 8px; border: 1px solid #ddd;">${GIT_REPO}</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">Branch</td>
<td style="padding: 8px; border: 1px solid #ddd;">${GIT_BRANCH}</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">Docker Image</td>
<td style="padding: 8px; border: 1px solid #ddd;">${DOCKERHUB_USERNAME}/${DOCKER_IMAGE}:${params.GEMINI_DOCKER_TAG}</td>
</tr>
</table>
<p style="font-size: 16px; color: #333; margin-top: 20px;">
Visit <a href="${BUILD_URL}" style="color: #4CAF50;">Pipeline Logs</a> for more details.
</p>
<p style="font-size: 16px; color: #333; margin-top: 20px;">
Thanks,<br>
<strong>Jenkins</strong>
</p>
</div>
""",
to: "[email protected]",
from: "[email protected]",
mimeType: 'text/html',
attachmentsPattern: '**/table-report.html'
)
}
failure {
echo "Pipeline failed. Please check the logs."
emailext (
subject: "FAILURE: Jenkins Pipeline for ${DOCKER_IMAGE}",
body: """
<div style="font-family: Arial, sans-serif; padding: 20px; border: 2px solid #F44336; border-radius: 10px;">
<h2 style="color: #F44336;">🚨 Pipeline Execution: FAILURE 🚨</h2>
<p style="font-size: 16px; color: #333;">
Hello Team,
</p>
<p style="font-size: 16px; color: #333;">
Unfortunately, the Jenkins CI pipeline for <strong style="color: #F44336;">${DOCKER_IMAGE}</strong> has <strong style="color: #F44336;">failed</strong>.
</p>
<table style="width: 100%; border-collapse: collapse; margin-top: 20px;">
<tr style="background-color: #f2f2f2;">
<th style="text-align: left; padding: 8px; border: 1px solid #ddd;">Details</th>
<th style="text-align: left; padding: 8px; border: 1px solid #ddd;">Values</th>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">Git Repository</td>
<td style="padding: 8px; border: 1px solid #ddd;">${GIT_REPO}</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">Branch</td>
<td style="padding: 8px; border: 1px solid #ddd;">${GIT_BRANCH}</td>
</tr>
<tr>
<td style="padding: 8px; border: 1px solid #ddd;">Docker Image</td>
<td style="padding: 8px; border: 1px solid #ddd;">${DOCKERHUB_USERNAME}/${DOCKER_IMAGE}:${params.GEMINI_DOCKER_TAG}</td>
</tr>
</table>
<p style="font-size: 16px; color: #333; margin-top: 20px;">
Visit <a href="${BUILD_URL}" style="color: #F44336;">Pipeline Logs</a> for more details.
</p>
<p style="font-size: 16px; color: #333; margin-top: 20px;">
Thanks,<br>
<strong>Jenkins</strong>
</p>
</div>
""",
to: "[email protected]",
from: "[email protected]",
mimeType: 'text/html',
attachmentsPattern: '**/table-report.html'
)
}
}
}
}
4 changes: 2 additions & 2 deletions kubernetes/cert-issuer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ spec:
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: <your-email-address> # Replace with your email address
email: [email protected] # Replace with your email address
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-prod-key
Expand All @@ -18,4 +18,4 @@ spec:
ingress:
class: nginx



5 changes: 4 additions & 1 deletion kubernetes/configmap.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,7 @@ metadata:
name: gemini-config
namespace: gemini-namespace
data:
NEXTAUTH_URL: <enter-your-domain-url> # Enter your NextAuth URL here(Domain name/URL)
GOOGLE_ID: 103384355930-outj5vptfg6lf5jc4kcfklhfa1sljuum.apps.googleusercontent.com
MONGODB_URI: mongodb://mongodb-service:27017/gemini
NEXTAUTH_URL: https://34.251.105.234.nip.io
MONGO_INITDB_ROOT_USERNAME: YWRtaW4=
4 changes: 2 additions & 2 deletions kubernetes/gemini-deployment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ spec:
spec:
containers:
- name: gemini
image: amitabhdevops/geminiprod:v1
image: devshubh2204/geminiclonenip:20
ports:
- containerPort: 3000
resources:
Expand Down Expand Up @@ -57,4 +57,4 @@ spec:
valueFrom:
secretKeyRef:
name: gemini-secret
key: NEXT_PUBLIC_API_KEY
key: NEXT_PUBLIC_API_KEY
6 changes: 3 additions & 3 deletions kubernetes/gemini-ingress.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ metadata:
spec:
tls:
- hosts:
- geminiamitabh.letsdeployit.com
- geminishubh.34.251.105.234.nip.io
secretName: gemini-tls-secret
ingressClassName: nginx
rules:
- host: "geminiamitabh.letsdeployit.com"
- host: geminishubh.34.251.105.234.nip.io
http:
paths:
- path: /
Expand All @@ -31,4 +31,4 @@ spec:
service:
name: nginx-service
port:
number: 80
number: 80
Loading