Skip to content

Commit 211ec70

Browse files
authored
Merge pull request #103 from bsospace/develop
🔧 chore[Jenkinsfile]: streamline environment setup and improve branch…
2 parents 695b658 + 827a352 commit 211ec70

1 file changed

Lines changed: 92 additions & 100 deletions

File tree

Jenkinsfile

Lines changed: 92 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,100 @@
11
pipeline {
22
agent any
3+
34
environment {
45
GIT_URL = 'https://github.com/bsospace/BSOSpace-Blog-Frontend'
5-
DOCKER_COMPOSE_FILE = ''
6-
DOCKER_IMAGE_TAG = ''
6+
SLACK_CHANNEL = '#jenkins-notifications'
77
APP_PORT = ''
8+
DOCKER_IMAGE_TAG = ''
9+
DOCKER_COMPOSE_FILE = ''
810
STACK_NAME = ''
9-
SLACK_CHANNEL = '#jenkins-notifications'
1011
}
12+
1113
stages {
12-
stage('Setup Environment') {
14+
15+
stage('Determine Environment') {
1316
steps {
1417
script {
15-
def branchName = env.GIT_BRANCH?.replaceFirst('origin/', '')
16-
17-
if (branchName ==~ /^pre-.*/) {
18-
APP_PORT = '3002'
19-
DOCKER_IMAGE_TAG = "pre-production-${branchName}-${BUILD_NUMBER}"
20-
DOCKER_COMPOSE_FILE = 'docker-compose.pre.yml'
21-
STACK_NAME = "bso-blog-pre"
22-
echo "Setting up Pre-Production Environment: ${branchName}"
23-
} else if (branchName == 'develop') {
24-
APP_PORT = '3000'
25-
DOCKER_IMAGE_TAG = "develop-${BUILD_NUMBER}"
26-
DOCKER_COMPOSE_FILE = 'docker-compose.develop.yml'
27-
STACK_NAME = "bso-blog-develop"
28-
echo "Setting up Development Environment: ${branchName}"
29-
} else if (branchName == 'main') {
30-
APP_PORT = '9009'
31-
DOCKER_IMAGE_TAG = "production-${BUILD_NUMBER}"
32-
DOCKER_COMPOSE_FILE = 'docker-compose.prod.yml'
33-
STACK_NAME = "bso-blog-production"
34-
echo "Setting up Production Environment: ${branchName}"
35-
} else {
36-
error("This pipeline only supports main, develop, or pre-* branches. Current branch: ${branchName}")
18+
switch (env.BRANCH_NAME) {
19+
case 'develop':
20+
env.ENVIRONMENT = 'development'
21+
env.ENV_FILE_CREDENTIAL = 'blog-dev-env-file'
22+
break
23+
case ~(/release\/.*/):
24+
env.ENVIRONMENT = 'staging'
25+
env.ENV_FILE_CREDENTIAL = 'blog-staging-env-file'
26+
break
27+
case 'main':
28+
env.ENVIRONMENT = 'production'
29+
env.ENV_FILE_CREDENTIAL = 'blog-prod-env-file'
30+
break
31+
default:
32+
env.ENVIRONMENT = 'other'
33+
echo "Branch ${env.BRANCH_NAME} is not for deployment. Running Build and Test stages only."
3734
}
38-
39-
echo "APP_PORT is set to ${APP_PORT}"
40-
echo "DOCKER_IMAGE_TAG is set to ${DOCKER_IMAGE_TAG}"
41-
echo "Using Docker Compose file: ${DOCKER_COMPOSE_FILE}"
42-
echo "STACK_NAME is set to ${STACK_NAME}"
4335
}
4436
}
4537
}
4638

47-
stage('Checkout & Pulling') {
39+
stage('Setup .env') {
40+
when {
41+
expression { env.ENVIRONMENT != 'other' }
42+
}
4843
steps {
4944
script {
50-
sh 'git config --global user.name "bso.jenkins"'
51-
sh 'git config --global user.email "bso.jenkins@bsospace.com"'
52-
checkout([$class: 'GitSCM', branches: [[name: "${env.GIT_BRANCH}"]], userRemoteConfigs: [[url: "${GIT_URL}"]]])
53-
sh "git checkout ${env.GIT_BRANCH?.replaceFirst('origin/', '')}"
54-
sh "git pull origin ${env.GIT_BRANCH?.replaceFirst('origin/', '')}"
55-
def lastCommitAuthor = sh(script: "git log -1 --pretty=format:'%an'", returnStdout: true).trim()
56-
def lastCommitMessage = sh(script: "git log -1 --pretty=format:'%s'", returnStdout: true).trim()
57-
env.LAST_COMMIT_AUTHOR = lastCommitAuthor
58-
env.LAST_COMMIT_MESSAGE = lastCommitMessage
45+
withCredentials([file(credentialsId: env.ENV_FILE_CREDENTIAL, variable: 'SECRET_ENV_FILE')]) {
46+
sh "cp $SECRET_ENV_FILE .env"
47+
echo "Loaded environment file for ${env.ENVIRONMENT}."
48+
}
5949
}
6050
}
61-
post {
62-
success {
63-
publishChecks name: 'Checkout & Pulling', title: 'Checkout & Pulling', summary: 'Code checkout and pulling completed successfully.'
51+
}
52+
53+
stage('Setup Environment Variables') {
54+
steps {
55+
script {
56+
def branchName = env.BRANCH_NAME?.replaceFirst('origin/', '')
57+
58+
switch (branchName) {
59+
case ~/^pre-.*/:
60+
APP_PORT = '3002'
61+
DOCKER_IMAGE_TAG = "pre-production-${branchName}-${BUILD_NUMBER}"
62+
DOCKER_COMPOSE_FILE = 'docker-compose.pre.yml'
63+
STACK_NAME = "bso-blog-pre"
64+
break
65+
case 'develop':
66+
APP_PORT = '3000'
67+
DOCKER_IMAGE_TAG = "develop-${BUILD_NUMBER}"
68+
DOCKER_COMPOSE_FILE = 'docker-compose.develop.yml'
69+
STACK_NAME = "bso-blog-develop"
70+
break
71+
case 'main':
72+
APP_PORT = '9009'
73+
DOCKER_IMAGE_TAG = "production-${BUILD_NUMBER}"
74+
DOCKER_COMPOSE_FILE = 'docker-compose.prod.yml'
75+
STACK_NAME = "bso-blog-production"
76+
break
77+
default:
78+
error("Unsupported branch: ${branchName}")
79+
}
80+
81+
echo "APP_PORT=${APP_PORT}, DOCKER_IMAGE_TAG=${DOCKER_IMAGE_TAG}, STACK_NAME=${STACK_NAME}, DOCKER_COMPOSE_FILE=${DOCKER_COMPOSE_FILE}"
6482
}
65-
failure {
66-
publishChecks name: 'Checkout & Pulling', title: 'Checkout & Pulling', summary: 'Code checkout and pulling failed.'
83+
}
84+
}
85+
86+
stage('Checkout & Pull') {
87+
steps {
88+
script {
89+
checkout scm: [$class: 'GitSCM',
90+
branches: [[name: env.BRANCH_NAME]],
91+
userRemoteConfigs: [[url: GIT_URL]]]
92+
93+
def branch = env.BRANCH_NAME.replaceFirst('origin/', '')
94+
sh "git checkout ${branch} && git pull origin ${branch}"
95+
96+
env.LAST_COMMIT_AUTHOR = sh(script: "git log -1 --pretty=format:'%an'", returnStdout: true).trim()
97+
env.LAST_COMMIT_MESSAGE = sh(script: "git log -1 --pretty=format:'%s'", returnStdout: true).trim()
6798
}
6899
}
69100
}
@@ -74,82 +105,43 @@ pipeline {
74105
sh 'npm install'
75106
}
76107
}
77-
post {
78-
success {
79-
publishChecks name: 'Install Dependencies', title: 'Install Dependencies', summary: 'Dependencies installed successfully.'
80-
}
81-
failure {
82-
publishChecks name: 'Install Dependencies', title: 'Install Dependencies', summary: 'Dependency installation failed.'
83-
}
84-
}
85108
}
86109

87-
stage('Testing with Jest') {
110+
stage('Run Tests') {
88111
steps {
89112
script {
90113
sh 'npm test'
91114
}
92115
}
93-
post {
94-
success {
95-
publishChecks name: 'Testing with Jest', title: 'Testing with Jest', summary: 'Jest tests passed.'
96-
}
97-
failure {
98-
publishChecks name: 'Testing with Jest', title: 'Testing with Jest', summary: 'Jest tests failed.'
99-
}
100-
}
101116
}
102117

103-
stage('Docker Build & Deploy') {
118+
stage('Build & Deploy Docker') {
104119
when {
105-
expression {
106-
return currentBuild.result == null || currentBuild.result == 'SUCCESS'
107-
}
120+
expression { env.ENVIRONMENT != 'other' }
108121
}
109122
steps {
110123
script {
111124
sh """
112-
docker-compose -p ${STACK_NAME} -f ${DOCKER_COMPOSE_FILE} build --no-cache --build-arg DOCKER_IMAGE_TAG=${DOCKER_IMAGE_TAG}
113-
docker-compose -p ${STACK_NAME} -f ${DOCKER_COMPOSE_FILE} up -d
125+
docker-compose -p ${STACK_NAME} -f ${DOCKER_COMPOSE_FILE} build --no-cache --build-arg DOCKER_IMAGE_TAG=${DOCKER_IMAGE_TAG}
126+
docker-compose -p ${STACK_NAME} -f ${DOCKER_COMPOSE_FILE} up -d
114127
"""
115128
}
116129
}
117-
post {
118-
success {
119-
publishChecks name: 'Docker Build & Deploy', title: 'Docker Build & Deploy', summary: 'Docker build and deployment completed successfully.'
120-
}
121-
failure {
122-
publishChecks name: 'Docker Build & Deploy', title: 'Docker Build & Deploy', summary: 'Docker build and deployment failed.'
123-
}
124-
}
125130
}
126131
}
132+
127133
post {
128134
always {
129135
script {
130-
def color = currentBuild.currentResult == 'SUCCESS' ? '#36A64F' : '#FF0000'
131-
132-
def qualityGateSummary = env.QUALITY_GATE_STATUS == 'OK' ? "*Quality Gate*: ✅ *Passed*" : "*Quality Gate*: ❌ *Failed*"
133-
if (env.QUALITY_SUMMARY) {
134-
qualityGateSummary += "\n" + env.QUALITY_SUMMARY.split("\n").collect { line ->
135-
line.startsWith("Metric:") ? "🔹 ${line}" : line
136-
}.join("\n")
137-
} else {
138-
qualityGateSummary += "\n_No detailed Quality Gate Summary available_"
139-
}
140-
141-
slackSend channel: "${SLACK_CHANNEL}", color: color, message: """
142-
*📈 Pipeline Report for ${env.JOB_NAME}* [#${env.BUILD_NUMBER}]
143-
*😎 Status*: ${currentBuild.currentResult == 'SUCCESS' ? "✅ *Success*" : "❌ *Failed*"}
144-
*🌿 Branch*: ${env.GIT_BRANCH}
145-
*💪 Last Commit By*: ${env.LAST_COMMIT_AUTHOR}
146-
*📄 Commit Message*: _${env.LAST_COMMIT_MESSAGE}_
147-
148-
*🔍 Quality Gate Summary:*
149-
```
150-
${qualityGateSummary}
151-
```
152-
"""
136+
def color = (currentBuild.result == 'SUCCESS') ? '#36A64F' : '#FF0000'
137+
slackSend(channel: SLACK_CHANNEL, color: color, message: """
138+
*Pipeline Report*
139+
*Job*: ${env.JOB_NAME} [#${env.BUILD_NUMBER}]
140+
*Status*: ${currentBuild.result}
141+
*Branch*: ${env.BRANCH_NAME}
142+
*Author*: ${env.LAST_COMMIT_AUTHOR}
143+
*Commit Message*: ${env.LAST_COMMIT_MESSAGE}
144+
""")
153145
}
154146
}
155147
}

0 commit comments

Comments
 (0)