From 0214070942a1e82d34304859c3bcf9f9b856e448 Mon Sep 17 00:00:00 2001 From: Himanshu Pal Date: Wed, 11 Sep 2024 11:25:33 +0530 Subject: [PATCH 1/8] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 30e2bae..0a77773 100644 --- a/README.md +++ b/README.md @@ -7,4 +7,4 @@ Easily capture analytics from your CircleCI jobs in your Sumologic dashboard! Add this command to your job with environment, team or service custom-data values as parameters. This command will run with the rest of the commands of the job for sending job log. This command has been introduced so as to send environment, team and service information at job level. If this command is not included at job level in one of it's steps, then the workflow-collector job will send the job log. Using it without the parameters will result in empty custom-data values being sent to Sumo. ## workflow-collector -Add this job to your workflow with no require statements. This job will run in parallel with the rest of your workflow for monitoring and will exit when all other jobs have completed. Custom data can be supplied via the custom-data parameter in the form of valid JSON. Keys and values can be supplied literally or as environment variables, though supplying values as additional, nested JSON is not supported. +Add this job to your workflow with no require statements. This job will run in parallel with the rest of your workflow for monitoring the health of all jobs in the Workflow. It exits when all other jobs have completed. Custom data can be supplied via the custom-data parameter in the form of valid JSON. Keys and values can be supplied literally or as environment variables, though supplying values as additional, nested JSON is not supported. Use `timeout-seconds` parameter (defaults to 180s/3mins) to end the workflow-collector early when required. From f32de28bb24503f53cd98dd231d2a08d3555ec73 Mon Sep 17 00:00:00 2001 From: Himanshu Pal Date: Fri, 13 Sep 2024 16:52:14 +0530 Subject: [PATCH 2/8] added support for github app/gitlab integration type --- src/scripts/job-collector.sh | 12 +++++++++--- src/scripts/workflow-collector.sh | 7 +++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/scripts/job-collector.sh b/src/scripts/job-collector.sh index a1405b6..a1b12da 100644 --- a/src/scripts/job-collector.sh +++ b/src/scripts/job-collector.sh @@ -1,13 +1,19 @@ #!/bin/bash VCS_SHORT=$(echo "$CIRCLE_BUILD_URL" | cut -d"/" -f4) case "$VCS_SHORT" in -gh) + gh) + # For GitHub OAuth App integration type VCS=github ;; -bb) + bb) + # For GitHub OAuth App integration type VCS=bitbucket ;; -*) + circleci) + # For GitHub App and Gitlab integration type + VCS=circleci + ;; + *) echo "No VCS found. Error" && exit 1 ;; esac diff --git a/src/scripts/workflow-collector.sh b/src/scripts/workflow-collector.sh index 1206092..de01a97 100644 --- a/src/scripts/workflow-collector.sh +++ b/src/scripts/workflow-collector.sh @@ -15,11 +15,17 @@ fi VCS_SHORT=$(echo "$CIRCLE_BUILD_URL" | cut -d"/" -f4) case "$VCS_SHORT" in gh) + # For GitHub OAuth App integration type VCS=github ;; bb) + # For GitHub OAuth App integration type VCS=bitbucket ;; + circleci) + # For GitHub App and Gitlab integration type + VCS=circleci + ;; *) echo "No VCS found. Error" && exit 1 ;; @@ -89,6 +95,7 @@ do echo "'$JOB_NAME' has a job number of 'null' and status of '$JOB_STATUS'. What's gone wrong?" elif [[ "$JOB_NUMBER" != "null" ]]; then + # Todo migrate to v2 api currently uses older api version https://circleci.com/docs/api/v1/index.html#jobs JOB_DATA_RAW=$(curl -s "https://circleci.com/api/v1.1/project/$VCS/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$JOB_NUMBER?circle-token=${CIRCLE_TOKEN}") JOB_STATUS=$(echo "$JOB_DATA_RAW" | jq -r '.status') # Manually set job name as it is currently null From 6752fb7401288c9890b2714cbde98b9f78f667f4 Mon Sep 17 00:00:00 2001 From: Himanshu Pal Date: Fri, 13 Sep 2024 17:05:17 +0530 Subject: [PATCH 3/8] updated version --- README.md | 24 ++++++++++++++++++++++-- src/examples/workflow-collector.yml | 2 +- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0a77773..b8873a6 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,30 @@ # Sumologic Orb -https://circleci.com/developer/orbs/orb/sumologic/sumologic?version=2.2.1 - Easily capture analytics from your CircleCI jobs in your Sumologic dashboard! + +## Setup + +To configure the orb follow the instructions in [Circle CI for build and deploy](https://help.sumologic.com/docs/observability/sdo/set-up-sdo/sdo-manual-configuration/#circleci-for-build-and-deploy) docs. + +To know more about the parameters and example configuration refer [Sumologic Orb documentation](https://circleci.com/developer/en/orbs/orb/sumologic/sumologic). + ## job-collector Add this command to your job with environment, team or service custom-data values as parameters. This command will run with the rest of the commands of the job for sending job log. This command has been introduced so as to send environment, team and service information at job level. If this command is not included at job level in one of it's steps, then the workflow-collector job will send the job log. Using it without the parameters will result in empty custom-data values being sent to Sumo. ## workflow-collector Add this job to your workflow with no require statements. This job will run in parallel with the rest of your workflow for monitoring the health of all jobs in the Workflow. It exits when all other jobs have completed. Custom data can be supplied via the custom-data parameter in the form of valid JSON. Keys and values can be supplied literally or as environment variables, though supplying values as additional, nested JSON is not supported. Use `timeout-seconds` parameter (defaults to 180s/3mins) to end the workflow-collector early when required. + +## Testing + +* [Install](https://circleci.com/docs/local-cli/#installation) and [configure](https://circleci.com/docs/local-cli/#configure-the-cli) the CircleCI CLI Tool. +* brew install yamllint shellcheck +* Run the [validation](https://circleci.com/docs/testing-orbs/#validation) commands + + `yamllint ./src` + `circleci orb validate orb.yml` + `shellcheck src/scripts/*.sh` + + + + +## Releasing diff --git a/src/examples/workflow-collector.yml b/src/examples/workflow-collector.yml index be7996e..2071c9c 100644 --- a/src/examples/workflow-collector.yml +++ b/src/examples/workflow-collector.yml @@ -3,7 +3,7 @@ description: | usage: version: "2.1" orbs: - sumologic: sumologic/sumologic@2.2.1 + sumologic: sumologic/sumologic@2.2.2 jobs: build: docker: From 1161a346be1cd355950ec39f9733e66f74d0c3d4 Mon Sep 17 00:00:00 2001 From: Himanshu Pal Date: Fri, 20 Sep 2024 20:36:32 +0530 Subject: [PATCH 4/8] added project slug and error handling --- src/scripts/workflow-collector.sh | 69 +++++++++++++++++-------------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/src/scripts/workflow-collector.sh b/src/scripts/workflow-collector.sh index de01a97..47ac0a9 100644 --- a/src/scripts/workflow-collector.sh +++ b/src/scripts/workflow-collector.sh @@ -1,38 +1,25 @@ #!/bin/bash -WF_DATA=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job?circle-token=${CIRCLE_TOKEN}") -WF_ITEMS=$(echo "$WF_DATA" | jq '.items') -WF_LENGTH=$(echo "$WF_ITEMS" | jq length) -WF_MESSAGE=$(echo "$WF_DATA" | jq '.message') +WF_DATA=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job?circle-token=${CIRCLE_TOKEN}" 2>&1) # Exit if no Workflow. +if [ $? -ne 0 ] ; then + echo "Error in fetching workflow jobs: $CIRCLE_WORKFLOW_ID/job error: $WF_DATA" && exit 1 +fi +WF_MESSAGE=$(echo "$WF_DATA" | jq '.message') if [ "$WF_MESSAGE" = "\"Workflow not found\"" ]; then echo "No Workflow was found." echo "Your circle-token parameter may be wrong or you do not have access to this Workflow." exit 1 fi - -VCS_SHORT=$(echo "$CIRCLE_BUILD_URL" | cut -d"/" -f4) -case "$VCS_SHORT" in - gh) - # For GitHub OAuth App integration type - VCS=github - ;; - bb) - # For GitHub OAuth App integration type - VCS=bitbucket - ;; - circleci) - # For GitHub App and Gitlab integration type - VCS=circleci - ;; - *) - echo "No VCS found. Error" && exit 1 - ;; -esac +WF_ITEMS=$(echo "$WF_DATA" | jq '.items') # Get the current state of all jobs. -WF_SL_PAYLOAD=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}" | jq '.') +WF_SL_PAYLOAD_RAW=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}" 2>&1) +if [ $? -ne 0 ] ; then + echo "Error in fetching workflow: $CIRCLE_WORKFLOW_ID error: $WF_SL_PAYLOAD_RAW" && exit 1 +fi +WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD_RAW" | jq '.') # Append any custom data to the workflow data ESCAPED_JSON=$(echo "${PARAM_CUSTOMDATA}" | sed -E 's/([^\]|^)"/\1\\"/g') @@ -53,6 +40,7 @@ declare -A job_status_array FIRST_RUN=true # While we still have jobs which are runnung. TIMEOUT=$(date -d "${PARAM_TIMEOUT_SECONDS} seconds") +counter=0 while true do if [[ $(date) > $TIMEOUT ]]; @@ -60,8 +48,13 @@ do echo "Monitoring loop exceeded timeout of $PARAM_TIMEOUT_SECONDS seconds. Breaking loop and ending the job." break fi - - WF_SL_PAYLOAD=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}" | jq '.') + counter=$((counter+1)) + WF_SL_PAYLOAD_RAW=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}" 2>&1) + if [ $? -ne 0 ] ; then + echo "Error in fetching workflow: $CIRCLE_WORKFLOW_ID error: $WF_SL_PAYLOAD_RAW counter: $counter" + continue + fi + WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD_RAW" | jq '.') WF_STATUS=$(echo "$WF_SL_PAYLOAD" | jq -r ".status") if [[ "$WF_STATUS" != "running" ]]; @@ -70,7 +63,11 @@ do break fi - WF_DATA=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job?circle-token=${CIRCLE_TOKEN}") + WF_DATA=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job?circle-token=${CIRCLE_TOKEN}" 2>&1) + if [ $? -ne 0 ] ; then + echo "Error in fetching workflow jobs: $CIRCLE_WORKFLOW_ID/job error: $WF_DATA counter: $counter" + continue + fi WF_ITEMS=$(echo "$WF_DATA" | jq '.items') WF_LENGTH=$(echo "$WF_ITEMS" | jq length) @@ -82,6 +79,8 @@ do JOB_NUMBER=$(echo "$JOB_DATA" | jq -r ".job_number") JOB_STATUS=$(echo "$JOB_DATA" | jq -r '.status') JOB_NAME=$(echo "$JOB_DATA" | jq -r ".name") + PROJECT_SLUG=$(echo "$JOB_DATA" | jq -r ".project_slug") + if [[ "${JOB_NAME}" != "workflow-collector" ]]; then if ! [ "${job_status_array["${JOB_NAME}"]}" ]; @@ -96,7 +95,12 @@ do elif [[ "$JOB_NUMBER" != "null" ]]; then # Todo migrate to v2 api currently uses older api version https://circleci.com/docs/api/v1/index.html#jobs - JOB_DATA_RAW=$(curl -s "https://circleci.com/api/v1.1/project/$VCS/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$JOB_NUMBER?circle-token=${CIRCLE_TOKEN}") + # Currently v2 api does not contain step details https://discuss.circleci.com/t/circleci-v2-api-job-step/50937 + JOB_DATA_RAW=$(curl -s "https://circleci.com/api/v1.1/project/$PROJECT_SLUG/$JOB_NUMBER?circle-token=${CIRCLE_TOKEN}" 2>&1) + if [ $? -ne 0 ] ; then + echo "Error in fetching single job: $PROJECT_SLUG/$JOB_NUMBER error: $JOB_DATA_RAW counter: $counter" + continue + fi JOB_STATUS=$(echo "$JOB_DATA_RAW" | jq -r '.status') # Manually set job name as it is currently null JOB_DATA_RAW=$(echo "$JOB_DATA_RAW" | jq --arg JOBNAME "$JOB_NAME" '.job_name = $JOBNAME') @@ -154,7 +158,12 @@ do echo "All jobs are in non running state other than the workflow-collector." # Get the final state of all jobs. - WF_SL_PAYLOAD=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}" | jq '.') + WF_SL_PAYLOAD_RAW=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}" 2>&1) + if [ $? -ne 0 ] ; then + echo "Error in fetching workflow: $CIRCLE_WORKFLOW_ID error: $WF_SL_PAYLOAD_RAW counter: $counter" + continue + fi + WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD_RAW" | jq '.') # Append any custom data to the workflow data ESCAPED_JSON=$(echo "${PARAM_CUSTOMDATA}" | sed -E 's/([^\]|^)"/\1\\"/g') @@ -194,4 +203,4 @@ do else echo "Some jobs are still queued or in progress. Continuing..." fi -done \ No newline at end of file +done From b0af4c35bb2e36f379e3d38762b5394142acc9db Mon Sep 17 00:00:00 2001 From: Himanshu Pal Date: Tue, 24 Sep 2024 18:56:16 +0530 Subject: [PATCH 5/8] added http endpoint status code and first run fix --- src/scripts/job-collector.sh | 10 +++++++--- src/scripts/workflow-collector.sh | 10 +++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/scripts/job-collector.sh b/src/scripts/job-collector.sh index a1b12da..727e6d5 100644 --- a/src/scripts/job-collector.sh +++ b/src/scripts/job-collector.sh @@ -17,7 +17,11 @@ case "$VCS_SHORT" in echo "No VCS found. Error" && exit 1 ;; esac -JOB_DATA_RAW=$(curl -s "https://circleci.com/api/v1.1/project/$VCS/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$CIRCLE_BUILD_NUM?circle-token=${CIRCLE_TOKEN}") +JOB_DATA_RAW=$(curl -s "https://circleci.com/api/v1.1/project/$VCS/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$CIRCLE_BUILD_NUM?circle-token=${CIRCLE_TOKEN}" 2>&1) +if [ $? -ne 0 ] ; then + echo "Error in fetching single job: $VCS/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$CIRCLE_BUILD_NUM error: $JOB_DATA_RAW" + exit 1 +fi # removing steps and circle_yml keys from object JOB_DATA_RAW=$(echo "$JOB_DATA_RAW" | jq 'del(.circle_yml)' | jq 'del(.steps)') JOB_NAME=$(echo "$JOB_DATA_RAW" | jq .workflows | jq .job_name) @@ -45,5 +49,5 @@ else echo "No valid custom data found to append to the job data" fi echo "$JOB_DATA_RAW" > /tmp/sumologic-logs/job-collector.json -curl -s -X POST -T /tmp/sumologic-logs/job-collector.json "${JOB_HTTP_SOURCE}" -echo "Job details sent to Sumo." \ No newline at end of file +curl -s -w "SumoHTTPSendStatus: %{http_code}" -X POST -T /tmp/sumologic-logs/job-collector.json "${JOB_HTTP_SOURCE}" +echo "Job details sent to Sumo." diff --git a/src/scripts/workflow-collector.sh b/src/scripts/workflow-collector.sh index 47ac0a9..7d49136 100644 --- a/src/scripts/workflow-collector.sh +++ b/src/scripts/workflow-collector.sh @@ -33,7 +33,7 @@ else fi echo "Sending current Workflow state to Sumo" -curl -i -H "Accept: application/json" -H "Content-Type:application/json" -X POST --data "$WF_SL_PAYLOAD" "${WORKFLOW_HTTP_SOURCE}" +curl -s -w "SumoHTTPSendStatus: %{http_code}\n" -H "Accept: application/json" -H "Content-Type:application/json" -X POST --data "$WF_SL_PAYLOAD" "${WORKFLOW_HTTP_SOURCE}" declare -A job_status_array # Set FIRST_RUN to true to ensure all initial updates are sent. @@ -57,7 +57,7 @@ do WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD_RAW" | jq '.') WF_STATUS=$(echo "$WF_SL_PAYLOAD" | jq -r ".status") - if [[ "$WF_STATUS" != "running" ]]; + if [[ "$WF_STATUS" != "running" ]] && [[ "$FIRST_RUN" == false ]]; then echo "Workflow status no longer running. Now: ${WF_STATUS}. Breaking loop." break @@ -115,7 +115,7 @@ do # Handle changes in state. if [[ "${job_status_array["${JOB_NAME}"]}" != "$JOB_STATUS" ]] || $FIRST_RUN; then # Send update in status to SumoLogic - echo "Job '$JOB_NAME' status has changed '${job_status_array["${JOB_NAME}"]}' -> '$JOB_STATUS'. Sending update to SumoLogic." + echo "Job '$JOB_NAME' status has changed '${job_status_array["${JOB_NAME}"]}' -> '$JOB_STATUS' FirstTimeRunning: '$FIRST_RUN'. Sending update to SumoLogic." JOB_DATA_RAW=$(echo "$JOB_DATA_RAW" | jq -c '.') if [[ -n "${PARAM_CUSTOMDATA}" ]] && echo "$CUSTOM_DATA" | jq -e; then @@ -123,7 +123,7 @@ do else echo "No valid custom data found to append to the job data." fi - curl -i -H "Accept: application/json" -H "Content-Type:application/json" -X POST --data "$JOB_DATA_RAW" "${JOB_HTTP_SOURCE}" + curl -s -w "SumoHTTPSendStatus: %{http_code}\n" -H "Accept: application/json" -H "Content-Type:application/json" -X POST --data "$JOB_DATA_RAW" "${JOB_HTTP_SOURCE}" fi job_status_array["${JOB_NAME}"]="$JOB_STATUS" fi @@ -197,7 +197,7 @@ do fi echo "Sending final Workflow state to Sumo" - curl -i -H "Accept: application/json" -H "Content-Type:application/json" -X POST --data "$WF_SL_PAYLOAD" -s "${WORKFLOW_HTTP_SOURCE}" + curl -s -w "SumoHTTPSendStatus: %{http_code}\n" -H "Accept: application/json" -H "Content-Type:application/json" -X POST --data "$WF_SL_PAYLOAD" -s "${WORKFLOW_HTTP_SOURCE}" echo "Finishing up." break else From e8176ce08df390b8fc99738b11bcf3c0af6bf7ea Mon Sep 17 00:00:00 2001 From: Himanshu Pal Date: Tue, 24 Sep 2024 19:57:06 +0530 Subject: [PATCH 6/8] bug fixed for jobstep and workflow name matching --- src/scripts/job-collector.sh | 2 +- src/scripts/workflow-collector.sh | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/scripts/job-collector.sh b/src/scripts/job-collector.sh index 727e6d5..2a9ad92 100644 --- a/src/scripts/job-collector.sh +++ b/src/scripts/job-collector.sh @@ -49,5 +49,5 @@ else echo "No valid custom data found to append to the job data" fi echo "$JOB_DATA_RAW" > /tmp/sumologic-logs/job-collector.json -curl -s -w "SumoHTTPSendStatus: %{http_code}" -X POST -T /tmp/sumologic-logs/job-collector.json "${JOB_HTTP_SOURCE}" +curl -s -w "SumoHTTPSendStatus: %{http_code}\n" -X POST -T /tmp/sumologic-logs/job-collector.json "${JOB_HTTP_SOURCE}" echo "Job details sent to Sumo." diff --git a/src/scripts/workflow-collector.sh b/src/scripts/workflow-collector.sh index 7d49136..386c214 100644 --- a/src/scripts/workflow-collector.sh +++ b/src/scripts/workflow-collector.sh @@ -32,7 +32,7 @@ else echo "No valid custom data found to append to the workflow data" fi -echo "Sending current Workflow state to Sumo" +echo "Sending current Workflow state logs to SumoLogic" curl -s -w "SumoHTTPSendStatus: %{http_code}\n" -H "Accept: application/json" -H "Content-Type:application/json" -X POST --data "$WF_SL_PAYLOAD" "${WORKFLOW_HTTP_SOURCE}" declare -A job_status_array @@ -71,6 +71,8 @@ do WF_ITEMS=$(echo "$WF_DATA" | jq '.items') WF_LENGTH=$(echo "$WF_ITEMS" | jq length) + echo "Found $WF_LENGTH Jobs for workflow: $CIRCLE_WORKFLOW_ID." + # Check all jobs. i="0" while [ $i -lt "$WF_LENGTH" ] @@ -81,11 +83,11 @@ do JOB_NAME=$(echo "$JOB_DATA" | jq -r ".name") PROJECT_SLUG=$(echo "$JOB_DATA" | jq -r ".project_slug") - if [[ "${JOB_NAME}" != "workflow-collector" ]]; + if [[ ! "${JOB_NAME}" =~ "workflow-collector" ]]; then if ! [ "${job_status_array["${JOB_NAME}"]}" ]; then - echo "Job '$JOB_NAME' (job number: '$JOB_NUMBER') not tracked, adding to array with status of '$JOB_STATUS'." + echo "Job '$JOB_NAME' of project '$PROJECT_SLUG' (job number: '$JOB_NUMBER') not tracked, adding to array with status of '$JOB_STATUS'." job_status_array["${JOB_NAME}"]=$JOB_STATUS fi @@ -115,7 +117,7 @@ do # Handle changes in state. if [[ "${job_status_array["${JOB_NAME}"]}" != "$JOB_STATUS" ]] || $FIRST_RUN; then # Send update in status to SumoLogic - echo "Job '$JOB_NAME' status has changed '${job_status_array["${JOB_NAME}"]}' -> '$JOB_STATUS' FirstTimeRunning: '$FIRST_RUN'. Sending update to SumoLogic." + echo "Job '$JOB_NAME' status has changed '${job_status_array["${JOB_NAME}"]}' -> '$JOB_STATUS' FirstTimeRunning: '$FIRST_RUN'. Sending Job state logs to SumoLogic." JOB_DATA_RAW=$(echo "$JOB_DATA_RAW" | jq -c '.') if [[ -n "${PARAM_CUSTOMDATA}" ]] && echo "$CUSTOM_DATA" | jq -e; then @@ -128,6 +130,8 @@ do job_status_array["${JOB_NAME}"]="$JOB_STATUS" fi fi + else + echo "Ignoring ${JOB_NAME} job - skipping sending an update to SumoLogic" fi i="$((i+1))" # echo "Incremented loop to $i. Continuing..." @@ -147,7 +151,7 @@ do break fi if [[ "${job_status_array[$k]}" == "running" ]]; then - if [[ "$k" != "workflow-collector" ]]; then + if [[ ! "$k" =~ "workflow-collector" ]]; then FINISHED=false break fi @@ -196,7 +200,7 @@ do WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD" | jq -c --arg STOPPED_AT "$STOPPED_AT" '.stopped_at = $STOPPED_AT') fi - echo "Sending final Workflow state to Sumo" + echo "Sending final Workflow state logs to SumoLogic" curl -s -w "SumoHTTPSendStatus: %{http_code}\n" -H "Accept: application/json" -H "Content-Type:application/json" -X POST --data "$WF_SL_PAYLOAD" -s "${WORKFLOW_HTTP_SOURCE}" echo "Finishing up." break From 0f90bbc65929f8b4ef34092b759071db945b6b8f Mon Sep 17 00:00:00 2001 From: Himanshu Pal Date: Tue, 24 Sep 2024 21:29:00 +0530 Subject: [PATCH 7/8] tested with all the test cases --- src/scripts/job-collector.sh | 27 ++++++++++++++++--- src/scripts/workflow-collector.sh | 45 +++++++++++++++++-------------- 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/scripts/job-collector.sh b/src/scripts/job-collector.sh index 2a9ad92..4dd0fdd 100644 --- a/src/scripts/job-collector.sh +++ b/src/scripts/job-collector.sh @@ -17,18 +17,37 @@ case "$VCS_SHORT" in echo "No VCS found. Error" && exit 1 ;; esac -JOB_DATA_RAW=$(curl -s "https://circleci.com/api/v1.1/project/$VCS/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$CIRCLE_BUILD_NUM?circle-token=${CIRCLE_TOKEN}" 2>&1) -if [ $? -ne 0 ] ; then - echo "Error in fetching single job: $VCS/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$CIRCLE_BUILD_NUM error: $JOB_DATA_RAW" - exit 1 +JOB_DATA_RAW=$(curl -s "https://circleci.com/api/v1.1/project/$VCS/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$CIRCLE_BUILD_NUM?circle-token=${CIRCLE_TOKEN}") + +if [[ "$JOB_DATA_RAW" =~ "Invalid token" ]]; +then + echo "Your circle-token parameter may be wrong Error: $JOB_DATA_RAW" + exit 1 +fi + +if [[ -z "${JOB_DATA_RAW#"${JOB_DATA_RAW%%[! ]*}"}" ]]; +then + echo "No Job Found for $VCS/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$CIRCLE_BUILD_NUM" + exit 1 fi + # removing steps and circle_yml keys from object JOB_DATA_RAW=$(echo "$JOB_DATA_RAW" | jq 'del(.circle_yml)' | jq 'del(.steps)') JOB_NAME=$(echo "$JOB_DATA_RAW" | jq .workflows | jq .job_name) + +if [ $? -ne 0 ] ; then + echo "Error in parsing payload: $VCS/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$CIRCLE_BUILD_NUM error: $JOB_DATA_RAW" + exit 1 +fi + JOB_STATUS=$(echo "$JOB_DATA_RAW" | jq .status) + echo "JOB: $JOB_NAME" echo "JOB NUM: $CIRCLE_BUILD_NUM" echo "STATUS: $JOB_STATUS" + + + ##### # Send Job Data to SumoLogic ##### diff --git a/src/scripts/workflow-collector.sh b/src/scripts/workflow-collector.sh index 386c214..7ff44bd 100644 --- a/src/scripts/workflow-collector.sh +++ b/src/scripts/workflow-collector.sh @@ -1,11 +1,15 @@ #!/bin/bash -WF_DATA=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job?circle-token=${CIRCLE_TOKEN}" 2>&1) - +WF_DATA=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job?circle-token=${CIRCLE_TOKEN}") # Exit if no Workflow. +if [[ "$WF_DATA" =~ "Invalid token" ]]; +then + echo "Your circle-token parameter may be wrong Error: $WF_DATA" + exit 1 +fi +WF_MESSAGE=$(echo "$WF_DATA" | jq '.message' 2>&1) if [ $? -ne 0 ] ; then - echo "Error in fetching workflow jobs: $CIRCLE_WORKFLOW_ID/job error: $WF_DATA" && exit 1 + echo "Error in parsing payload of workflow jobs: $CIRCLE_WORKFLOW_ID/job error: $WF_DATA" && exit 1 fi -WF_MESSAGE=$(echo "$WF_DATA" | jq '.message') if [ "$WF_MESSAGE" = "\"Workflow not found\"" ]; then echo "No Workflow was found." @@ -15,11 +19,12 @@ fi WF_ITEMS=$(echo "$WF_DATA" | jq '.items') # Get the current state of all jobs. -WF_SL_PAYLOAD_RAW=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}" 2>&1) +WF_SL_PAYLOAD_RAW=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}") +WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD_RAW" | jq '.' 2>&1) + if [ $? -ne 0 ] ; then - echo "Error in fetching workflow: $CIRCLE_WORKFLOW_ID error: $WF_SL_PAYLOAD_RAW" && exit 1 + echo "Error in parsing payload of workflow: $CIRCLE_WORKFLOW_ID error: $WF_SL_PAYLOAD_RAW" && exit 1 fi -WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD_RAW" | jq '.') # Append any custom data to the workflow data ESCAPED_JSON=$(echo "${PARAM_CUSTOMDATA}" | sed -E 's/([^\]|^)"/\1\\"/g') @@ -49,12 +54,12 @@ do break fi counter=$((counter+1)) - WF_SL_PAYLOAD_RAW=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}" 2>&1) + WF_SL_PAYLOAD_RAW=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}") + WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD_RAW" | jq '.' 2>&1) if [ $? -ne 0 ] ; then - echo "Error in fetching workflow: $CIRCLE_WORKFLOW_ID error: $WF_SL_PAYLOAD_RAW counter: $counter" - continue + echo "Error in parsing payload of workflow: $CIRCLE_WORKFLOW_ID error: $WF_SL_PAYLOAD_RAW counter: $counter" + continue fi - WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD_RAW" | jq '.') WF_STATUS=$(echo "$WF_SL_PAYLOAD" | jq -r ".status") if [[ "$WF_STATUS" != "running" ]] && [[ "$FIRST_RUN" == false ]]; @@ -63,12 +68,12 @@ do break fi - WF_DATA=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job?circle-token=${CIRCLE_TOKEN}" 2>&1) + WF_DATA=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job?circle-token=${CIRCLE_TOKEN}") + WF_ITEMS=$(echo "$WF_DATA" | jq '.items' 2>&1) if [ $? -ne 0 ] ; then - echo "Error in fetching workflow jobs: $CIRCLE_WORKFLOW_ID/job error: $WF_DATA counter: $counter" + echo "Error in parsing payload of workflow jobs: $CIRCLE_WORKFLOW_ID/job error: $WF_DATA counter: $counter" continue fi - WF_ITEMS=$(echo "$WF_DATA" | jq '.items') WF_LENGTH=$(echo "$WF_ITEMS" | jq length) echo "Found $WF_LENGTH Jobs for workflow: $CIRCLE_WORKFLOW_ID." @@ -98,12 +103,12 @@ do then # Todo migrate to v2 api currently uses older api version https://circleci.com/docs/api/v1/index.html#jobs # Currently v2 api does not contain step details https://discuss.circleci.com/t/circleci-v2-api-job-step/50937 - JOB_DATA_RAW=$(curl -s "https://circleci.com/api/v1.1/project/$PROJECT_SLUG/$JOB_NUMBER?circle-token=${CIRCLE_TOKEN}" 2>&1) + JOB_DATA_RAW=$(curl -s "https://circleci.com/api/v1.1/project/$PROJECT_SLUG/$JOB_NUMBER?circle-token=${CIRCLE_TOKEN}") + JOB_STATUS=$(echo "$JOB_DATA_RAW" | jq -r '.status' 2>&1) if [ $? -ne 0 ] ; then - echo "Error in fetching single job: $PROJECT_SLUG/$JOB_NUMBER error: $JOB_DATA_RAW counter: $counter" + echo "Error in parsing payload of single job: $PROJECT_SLUG/$JOB_NUMBER error: $JOB_DATA_RAW counter: $counter" continue fi - JOB_STATUS=$(echo "$JOB_DATA_RAW" | jq -r '.status') # Manually set job name as it is currently null JOB_DATA_RAW=$(echo "$JOB_DATA_RAW" | jq --arg JOBNAME "$JOB_NAME" '.job_name = $JOBNAME') JOB_STEP_NAMES=$(echo "$JOB_DATA_RAW" | jq '.steps' | jq .[] | jq '.name') @@ -162,12 +167,12 @@ do echo "All jobs are in non running state other than the workflow-collector." # Get the final state of all jobs. - WF_SL_PAYLOAD_RAW=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}" 2>&1) + WF_SL_PAYLOAD_RAW=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}") + WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD_RAW" | jq '.' 2>&1) if [ $? -ne 0 ] ; then - echo "Error in fetching workflow: $CIRCLE_WORKFLOW_ID error: $WF_SL_PAYLOAD_RAW counter: $counter" + echo "Error in parsing payload of workflow: $CIRCLE_WORKFLOW_ID error: $WF_SL_PAYLOAD_RAW counter: $counter" continue fi - WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD_RAW" | jq '.') # Append any custom data to the workflow data ESCAPED_JSON=$(echo "${PARAM_CUSTOMDATA}" | sed -E 's/([^\]|^)"/\1\\"/g') From 106dec94a6ba2052044e506675b1f905a9c44c20 Mon Sep 17 00:00:00 2001 From: Himanshu Pal Date: Tue, 24 Sep 2024 23:20:12 +0530 Subject: [PATCH 8/8] fix for shellcheck rule SC2181 --- src/scripts/job-collector.sh | 4 ++-- src/scripts/workflow-collector.sh | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/scripts/job-collector.sh b/src/scripts/job-collector.sh index 4dd0fdd..b684682 100644 --- a/src/scripts/job-collector.sh +++ b/src/scripts/job-collector.sh @@ -34,8 +34,8 @@ fi # removing steps and circle_yml keys from object JOB_DATA_RAW=$(echo "$JOB_DATA_RAW" | jq 'del(.circle_yml)' | jq 'del(.steps)') JOB_NAME=$(echo "$JOB_DATA_RAW" | jq .workflows | jq .job_name) - -if [ $? -ne 0 ] ; then +CMD_STATUS=$? +if [ "$CMD_STATUS" -ne 0 ] ; then echo "Error in parsing payload: $VCS/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/$CIRCLE_BUILD_NUM error: $JOB_DATA_RAW" exit 1 fi diff --git a/src/scripts/workflow-collector.sh b/src/scripts/workflow-collector.sh index 7ff44bd..1e73693 100644 --- a/src/scripts/workflow-collector.sh +++ b/src/scripts/workflow-collector.sh @@ -7,7 +7,8 @@ then exit 1 fi WF_MESSAGE=$(echo "$WF_DATA" | jq '.message' 2>&1) -if [ $? -ne 0 ] ; then +CMD_STATUS=$? +if [ "$CMD_STATUS" -ne 0 ] ; then echo "Error in parsing payload of workflow jobs: $CIRCLE_WORKFLOW_ID/job error: $WF_DATA" && exit 1 fi if [ "$WF_MESSAGE" = "\"Workflow not found\"" ]; @@ -21,8 +22,8 @@ WF_ITEMS=$(echo "$WF_DATA" | jq '.items') # Get the current state of all jobs. WF_SL_PAYLOAD_RAW=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}") WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD_RAW" | jq '.' 2>&1) - -if [ $? -ne 0 ] ; then +CMD_STATUS=$? +if [ "$CMD_STATUS" -ne 0 ] ; then echo "Error in parsing payload of workflow: $CIRCLE_WORKFLOW_ID error: $WF_SL_PAYLOAD_RAW" && exit 1 fi @@ -56,7 +57,8 @@ do counter=$((counter+1)) WF_SL_PAYLOAD_RAW=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}") WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD_RAW" | jq '.' 2>&1) - if [ $? -ne 0 ] ; then + CMD_STATUS=$? + if [ "$CMD_STATUS" -ne 0 ] ; then echo "Error in parsing payload of workflow: $CIRCLE_WORKFLOW_ID error: $WF_SL_PAYLOAD_RAW counter: $counter" continue fi @@ -70,7 +72,8 @@ do WF_DATA=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job?circle-token=${CIRCLE_TOKEN}") WF_ITEMS=$(echo "$WF_DATA" | jq '.items' 2>&1) - if [ $? -ne 0 ] ; then + CMD_STATUS=$? + if [ "$CMD_STATUS" -ne 0 ] ; then echo "Error in parsing payload of workflow jobs: $CIRCLE_WORKFLOW_ID/job error: $WF_DATA counter: $counter" continue fi @@ -105,7 +108,8 @@ do # Currently v2 api does not contain step details https://discuss.circleci.com/t/circleci-v2-api-job-step/50937 JOB_DATA_RAW=$(curl -s "https://circleci.com/api/v1.1/project/$PROJECT_SLUG/$JOB_NUMBER?circle-token=${CIRCLE_TOKEN}") JOB_STATUS=$(echo "$JOB_DATA_RAW" | jq -r '.status' 2>&1) - if [ $? -ne 0 ] ; then + CMD_STATUS=$? + if [ "$CMD_STATUS" -ne 0 ] ; then echo "Error in parsing payload of single job: $PROJECT_SLUG/$JOB_NUMBER error: $JOB_DATA_RAW counter: $counter" continue fi @@ -169,7 +173,8 @@ do # Get the final state of all jobs. WF_SL_PAYLOAD_RAW=$(curl -s "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID?circle-token=${CIRCLE_TOKEN}") WF_SL_PAYLOAD=$(echo "$WF_SL_PAYLOAD_RAW" | jq '.' 2>&1) - if [ $? -ne 0 ] ; then + CMD_STATUS=$? + if [ "$CMD_STATUS" -ne 0 ] ; then echo "Error in parsing payload of workflow: $CIRCLE_WORKFLOW_ID error: $WF_SL_PAYLOAD_RAW counter: $counter" continue fi