Last active
February 27, 2024 22:58
-
-
Save jowharshamshiri/0275dbd2f4c5723956ed68f9e28a6d05 to your computer and use it in GitHub Desktop.
jen
This file contains 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
#!/bin/bash | |
# Credentials and Host | |
USERNAME="********" | |
JENKINS_TOKEN="********" | |
JENKINS_HOST="********" | |
JENKINS_PORT="8080" | |
API_TOKEN="********" | |
JENKINS_STATUS="" | |
# Base URL for Jenkins | |
JENKINS_URL="http://${USERNAME}:${JENKINS_TOKEN}@${JENKINS_HOST}:${JENKINS_PORT}" | |
# Job name and command (status or log) | |
COMMAND=$1 | |
JOB_NAME=$2 | |
JOBS=("job_2", "job_3", "job_4") | |
# Function to get job status | |
get_job_status() { | |
JENKINS_STATUS=$(curl -X POST --silent "${JENKINS_URL}/job/${JOB_NAME}/lastBuild/api/json?token=${API_TOKEN}") | |
parse_jenkins_status | |
} | |
get_all_jobs_statuses() { | |
for job in "${JOBS[@]}" | |
do | |
JOB_NAME=$job | |
echo "$job: =====================================================================================================" | |
echo "$(get_job_status)" | |
done | |
} | |
# Function to get job console log | |
get_job_log() { | |
curl -X POST "${JENKINS_URL}/job/${JOB_NAME}/lastBuild/consoleText?token=${API_TOKEN}" | |
} | |
get_all_jobs_logs() { | |
for job in "${JOBS[@]}" | |
do | |
JOB_NAME=$job | |
echo "$job: =====================================================================================================" | |
echo "$(get_job_log)" | |
done | |
} | |
run_job() { | |
curl -X POST "${JENKINS_URL}/job/${JOB_NAME}/build?token=${API_TOKEN}" | |
} | |
run_all_jobs() { | |
for job in "${JOBS[@]}" | |
do | |
JOB_NAME=$job | |
echo "$job: $(run_job)" | |
done | |
} | |
function parse_jenkins_status() { | |
# Extract fields using jq | |
local build_number=$(echo "$JENKINS_STATUS" | jq -r '.number') | |
local build_status=$(echo "$JENKINS_STATUS" | jq -r '.building') | |
local timestamp=$(echo "$JENKINS_STATUS" | jq -r '.timestamp') | |
local estimated_duration=$(echo "$JENKINS_STATUS" | jq -r '.estimatedDuration') | |
local current_time_millis=$(($(date +%s%N) / 1000000)) | |
local project_name=$(echo "$JENKINS_STATUS" | jq -r '.fullDisplayName') | |
local jenkins_build_url=$(echo "$JENKINS_STATUS" | jq -r '.url') | |
local scm_branch=$(echo "$JENKINS_STATUS" | jq -r '.actions[] | select(._class == "hudson.plugins.git.util.BuildData") | .lastBuiltRevision.branch[].name') | |
local scm_commit=$(echo "$JENKINS_STATUS" | jq -r '.actions[] | select(._class == "hudson.plugins.git.util.BuildData") | .lastBuiltRevision.SHA1') | |
local commit_message=$(echo "$JENKINS_STATUS" | jq -r '.changeSet.items[0].msg') | |
# Calculate elapsed and remaining time | |
local elapsed_time_millis=$((current_time_millis - timestamp)) | |
local elapsed_time_seconds=$(echo "$elapsed_time_millis / 1000" | bc -l) | |
local remaining_time_millis=$((estimated_duration - elapsed_time_millis)) | |
local remaining_time_seconds=$(echo "$remaining_time_millis / 1000" | bc -l) | |
if [[ "$build_status" == "true" ]]; then | |
if (( $(echo "$remaining_time_seconds < 0" | bc -l) )); then | |
remaining_time_seconds="N/A - Exceeding estimate" | |
else | |
# Round to two decimal places for display | |
remaining_time_seconds=$(printf "%.2f" "$remaining_time_seconds") | |
fi | |
else | |
remaining_time_seconds="0 (Build Completed)" | |
fi | |
# Calculate elapsed time in seconds | |
local elapsed_time_seconds=$(echo "$elapsed_time_millis / 1000" | bc -l) | |
local estimated_duration_seconds=$(echo "$estimated_duration / 1000" | bc -l) | |
# Adjust for job completion or overrunning estimated duration | |
if [[ "$build_status" != "true" ]] || (( $(echo "$elapsed_time_seconds >= $estimated_duration_seconds" | bc -l) )); then | |
elapsed_time_seconds=$estimated_duration_seconds | |
remaining_time_seconds="0 (Build Completed)" | |
fi | |
# Calculate percentage of completion | |
local percentage_complete=$(echo "scale=2; $elapsed_time_seconds / $estimated_duration_seconds * 100" | bc) | |
# Ensure percentage does not exceed 100% | |
if (( $(echo "$percentage_complete > 100" | bc -l) )); then | |
percentage_complete=100 | |
fi | |
# Convert to integer for generating the progress bar | |
local percentage_complete_int=$(echo "$percentage_complete" | cut -d'.' -f1) | |
# Generate the progress bar | |
local progress_bar="[" | |
local filled=$((percentage_complete_int / 2)) | |
local unfilled=$((50 - filled)) | |
progress_bar+=$(printf '=%.0s' $(seq 1 $filled)) | |
progress_bar+=$(printf ' %.0s' $(seq 1 $unfilled)) | |
progress_bar+="]" | |
echo "Progress: $progress_bar $percentage_complete%" | |
echo "Build Summary:" | |
echo "- Project: $project_name" | |
echo "- Build Number: #$build_number" | |
echo "- Status: $(if [[ "$build_status" == "true" ]]; then echo "Building"; else echo "Completed"; fi)" | |
echo "" | |
echo "SCM Info:" | |
echo "- Branch: $scm_branch" | |
echo "- Commit: $scm_commit" | |
echo "- Commit Message: $commit_message" | |
echo "" | |
echo "Estimated Duration: $(printf "%.3f" $(echo "$estimated_duration / 1000" | bc -l)) seconds" | |
echo "Elapsed Time: $(printf "%.3f" "$elapsed_time_seconds") seconds" | |
echo "Time Remaining: $remaining_time_seconds seconds" | |
echo "" | |
echo "Jenkins Build URL: $jenkins_build_url" | |
} | |
get_failed_and_in_progress_jobs_statuses() { | |
for job in "${JOBS[@]}" | |
do | |
JOB_NAME=$job | |
JENKINS_STATUS=$(curl -X POST --silent "${JENKINS_URL}/job/${JOB_NAME}/lastBuild/api/json?token=${API_TOKEN}") | |
local build_status=$(echo "$JENKINS_STATUS" | jq -r '.building') | |
local failed_status=$(echo "$JENKINS_STATUS" | jq -r '.result') | |
if [[ "$build_status" == "true" ]] || [[ "$failed_status" != "SUCCESS" ]]; then | |
echo "$job: =====================================================================================================" | |
echo "$(parse_jenkins_status)" | |
fi | |
done | |
} | |
# Check if no args at all | |
if [ -z "$COMMAND" ]; then | |
get_failed_and_in_progress_jobs_statuses | |
exit 0 | |
fi | |
# Check if the job name is 'all' | |
if [ "$JOB_NAME" == "all" ]; then | |
if [ "$COMMAND" == "status" ] || [ -z "$COMMAND" ]; then | |
get_all_jobs_statuses | |
elif [ "$COMMAND" == "log" ]; then | |
get_all_jobs_logs | |
elif [ "$COMMAND" == "run" ]; then | |
run_all_jobs | |
else | |
echo "Invalid command. USAGE: jen <status|log|run> <job_name|all>" | |
fi | |
exit 0 | |
fi | |
# Check command and call the appropriate function | |
case $COMMAND in | |
status) | |
get_job_status | |
;; | |
log) | |
get_job_log | |
;; | |
run) | |
run_job | |
;; | |
*) | |
echo "Invalid command. USAGE: jen <status|log|run> <job_name|all>" | |
;; | |
esac |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment