Created
July 30, 2025 16:44
-
-
Save cremerfc/d1e862266156da1b70b757c2087b6fd6 to your computer and use it in GitHub Desktop.
Jenkinsfile
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pipeline { | |
agent any | |
environment { | |
CORTEX_API_URL = "https://api.getcortexapp.com/api/v1/catalog" | |
} | |
stages { | |
stage('Build') { | |
steps { | |
script { | |
echo "Building application..." | |
} | |
sh ''' | |
node --version | |
npm --version | |
npm ci | |
npm run build | |
''' | |
} | |
post { | |
success { | |
script { | |
env.BUILD_STAGE_RESULT = 'SUCCESS' | |
} | |
} | |
failure { | |
script { | |
env.BUILD_STAGE_RESULT = 'FAILURE' | |
} | |
} | |
} | |
} | |
stage('Test') { | |
steps { | |
script { | |
echo "Running tests..." | |
} | |
sh 'npm test' | |
} | |
post { | |
success { | |
script { | |
env.TEST_STAGE_RESULT = 'SUCCESS' | |
} | |
} | |
failure { | |
script { | |
env.TEST_STAGE_RESULT = 'FAILURE' | |
} | |
} | |
} | |
} | |
stage('Deploy') { | |
steps { | |
script { | |
echo "Deploying to staging..." | |
sh ''' | |
sleep 2 | |
echo "Deployment completed" | |
''' | |
} | |
} | |
post { | |
success { | |
script { | |
env.DEPLOY_STAGE_RESULT = 'SUCCESS' | |
} | |
} | |
failure { | |
script { | |
env.DEPLOY_STAGE_RESULT = 'FAILURE' | |
} | |
} | |
} | |
} | |
} | |
post { | |
always { | |
script { | |
notifyCortex() | |
} | |
} | |
} | |
} | |
def notifyCortex() { | |
try { | |
echo "Build Stage Result: ${env.BUILD_STAGE_RESULT ?: 'SKIPPED'}" | |
echo "Test Stage Result: ${env.TEST_STAGE_RESULT ?: 'SKIPPED'}" | |
echo "Deploy Stage Result: ${env.DEPLOY_STAGE_RESULT ?: 'SKIPPED'}" | |
// Determine overall pipeline status | |
def buildResult = env.BUILD_STAGE_RESULT ?: 'SKIPPED' | |
def testResult = env.TEST_STAGE_RESULT ?: 'SKIPPED' | |
def deployResult = env.DEPLOY_STAGE_RESULT ?: 'SKIPPED' | |
def pipelineStatus | |
def deployType | |
def message | |
if (buildResult == 'SUCCESS' && testResult == 'SUCCESS' && deployResult == 'SUCCESS') { | |
pipelineStatus = 'success' | |
deployType = 'DEPLOY' | |
message = 'Pipeline completed successfully' | |
} else { | |
pipelineStatus = 'failed' | |
deployType = 'ROLLBACK' | |
message = "Pipeline failed - one or more stages failed (Build: ${buildResult}, Test: ${testResult}, Deploy: ${deployResult})" | |
} | |
echo "Pipeline Status: ${pipelineStatus}" | |
echo "Deploy Type: ${deployType}" | |
echo "Message: ${message}" | |
// Convert repo name to lowercase (extract from job name) | |
def repoName = env.JOB_NAME.tokenize('/')[0].toLowerCase() | |
echo "Repository: ${repoName}" | |
// Get Git commit SHA and branch | |
def gitCommit = sh( | |
script: 'git rev-parse HEAD', | |
returnStdout: true | |
).trim() | |
def gitBranch = sh( | |
script: 'git rev-parse --abbrev-ref HEAD', | |
returnStdout: true | |
).trim() | |
// Get current timestamp | |
def timestamp = sh( | |
script: 'date -u +"%Y-%m-%dT%H:%M:%SZ"', | |
returnStdout: true | |
).trim() | |
// Escape JSON special characters in message | |
def escapedMessage = message.replaceAll('"', '\\\\"').replaceAll("'", "\\\\'") | |
// Get deployer information | |
def deployerEmail = env.BUILD_USER_EMAIL ?: '[email protected]' | |
def deployerName = env.BUILD_USER ?: 'Jenkins' | |
// Build JSON payload | |
def jsonPayload = """ | |
{ | |
"customData": { | |
"pipeline": "${env.JOB_NAME}", | |
"build_number": "${env.BUILD_NUMBER}", | |
"branch": "${gitBranch}", | |
"pipeline_status": "${pipelineStatus}", | |
"message": "${escapedMessage}", | |
"build_url": "${env.BUILD_URL}", | |
"jenkins_url": "${env.JENKINS_URL}" | |
}, | |
"deployer": { | |
"email": "${deployerEmail}", | |
"name": "${deployerName}" | |
}, | |
"environment": "staging", | |
"sha": "${gitCommit}", | |
"timestamp": "${timestamp}", | |
"title": "Pipeline ${pipelineStatus} - ${env.JOB_NAME}", | |
"type": "${deployType}", | |
"url": "${env.BUILD_URL}" | |
} | |
""" | |
// Send notification to Cortex | |
withCredentials([string(credentialsId: 'CORTEX_TOKEN', variable: 'CORTEX_TOKEN')]) { | |
def curlResult = sh( | |
script: """ | |
curl -L \\ | |
--request POST \\ | |
--max-time 30 \\ | |
--retry 2 \\ | |
--url "${env.CORTEX_API_URL}/${repoName}/deploys" \\ | |
--header "Authorization: Bearer \${CORTEX_TOKEN}" \\ | |
--header "Content-Type: application/json" \\ | |
--data '${jsonPayload}' \\ | |
--write-out "%{http_code}" \\ | |
--silent \\ | |
--output /dev/null | |
""", | |
returnStdout: true | |
).trim() | |
if (curlResult == '200' || curlResult == '201') { | |
echo "Successfully notified Cortex (HTTP ${curlResult})" | |
} else { | |
echo "Failed to notify Cortex (HTTP ${curlResult}), but continuing..." | |
} | |
} | |
} catch (Exception e) { | |
echo "Failed to send Cortex notification: ${e.getMessage()}" | |
// Don't fail the build if notification fails | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment