11pipeline {
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