Skip to content

Instantly share code, notes, and snippets.

@jowharshamshiri
Last active February 27, 2024 22:58
Show Gist options
  • Save jowharshamshiri/0275dbd2f4c5723956ed68f9e28a6d05 to your computer and use it in GitHub Desktop.
Save jowharshamshiri/0275dbd2f4c5723956ed68f9e28a6d05 to your computer and use it in GitHub Desktop.
jen
#!/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