From 24e281c9a53c25b3672bc60e6b764bf3efb2c30d Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Sun, 2 Mar 2025 13:07:52 +0200 Subject: [PATCH 01/35] ci: add a job to send release notes based on changelog to slack --- .circleci/config.yml | 41 ++++++++++++++++++- .../releases/changelog_to_slack_formatter.sh | 24 +++++++++++ scripts/releases/get_job_approver.sh | 14 +++++++ scripts/releases/get_release_notes.sh | 23 +++++++++++ scripts/releases/get_sdk_version.sh | 5 +++ .../releases/get_slack_id_from_username.sh | 21 ++++++++++ 6 files changed, 127 insertions(+), 1 deletion(-) create mode 100755 scripts/releases/changelog_to_slack_formatter.sh create mode 100644 scripts/releases/get_job_approver.sh create mode 100755 scripts/releases/get_release_notes.sh create mode 100755 scripts/releases/get_sdk_version.sh create mode 100644 scripts/releases/get_slack_id_from_username.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 67e56d8fa..e8eb38caa 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -103,6 +103,30 @@ commands: - run: name: Build Pigeons command: dart run build_runner build --delete-conflicting-outputs + notify-slack-with-release: + steps: + - slack/notify: + channel: C08F3Q30U7Q + event: pass + custom: | + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": ":flutter: Flutter `v$(./scripts/releases/get_sdk_version.swift)` is released by <@$(./Scripts/releases/get_job_approver.sh)> 🚀" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "<@$(./scripts/releases/get_release_notes.sh)>" + } + } + ] + } jobs: danger: @@ -278,6 +302,13 @@ jobs: working_directory: project command: Escape flutter publish + release_slack_notification: + macos: + xcode: 15.2.0 + resource_class: macos.m1.medium.gen1 + steps: + - notify-slack-with-release + workflows: version: 2 build-test-and-approval-deploy: @@ -324,4 +355,12 @@ workflows: - hold_release filters: branches: - only: master \ No newline at end of file + only: master + - release_slack_notification: + requires: + - release + event: pass + context: slack-app + filters: + branches: + only: master diff --git a/scripts/releases/changelog_to_slack_formatter.sh b/scripts/releases/changelog_to_slack_formatter.sh new file mode 100755 index 000000000..3a57c3509 --- /dev/null +++ b/scripts/releases/changelog_to_slack_formatter.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# changelog_to_slack_formatter.sh: Convert Markdown changelog to Slack mrkdwn format +# Supports input from a file or STDIN. + +# If an input file is provided as an argument, read from it. +# Otherwise, read from STDIN. +if [ $# -eq 1 ]; then + if [ ! -f "$1" ]; then + echo "Error: File '$1' not found!" >&2 + exit 1 + fi + input=$(cat "$1") +else + input=$(cat) +fi + +# Process the input using sed: +# 1. Convert Markdown links: [text](url) -> +# 2. Convert header lines (e.g., '## Title') to bold by removing '#' and wrapping text in asterisks. +# 3. Convert bullet lists: '- ' -> '• ' +echo "$input" | sed -E \ + -e 's/\[([^]]+)\]\(([^)]+)\)/<\2|\1>/g' \ + -e 's/^#{1,6}[[:space:]]*([^[:space:]].*)$/\*\1\*/' \ + -e 's/^- /• /' \ No newline at end of file diff --git a/scripts/releases/get_job_approver.sh b/scripts/releases/get_job_approver.sh new file mode 100644 index 000000000..96882a0ee --- /dev/null +++ b/scripts/releases/get_job_approver.sh @@ -0,0 +1,14 @@ +jobsJson=$(curl -s -f -X GET "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job" -u "$CIRCLECI_TOKEN":) +job=$(jq '.items[] | select(.name == "hold")' <<< "$jobsJson") + +approver_id=$(jq '.approved_by' <<< "$job") +approver_id=$(echo "$approver_id" | tr -d '"') + +user=$(curl -s -f -X GET "https://circleci.com/api/v2/user/$approver_id" -u "$CIRCLE_TOKEN":) + +username=$(jq '.login' <<< "$user") +username=$(echo "$username" | tr -d '"') + +slack_id=$(./scripts/releases/get_slack_id_from_username.sh "$username") + +echo "$slack_id" \ No newline at end of file diff --git a/scripts/releases/get_release_notes.sh b/scripts/releases/get_release_notes.sh new file mode 100755 index 000000000..dbf743e0f --- /dev/null +++ b/scripts/releases/get_release_notes.sh @@ -0,0 +1,23 @@ +latest_release="" +capturing=false + +while IFS= read -r line; do + if [[ "$line" == "## ["* ]]; then + # If we are already capturing, this means we have reached the next release section. + if $capturing; then + break # stop reading further + fi + # Otherwise, this is the start of the latest release section. + capturing=true + fi + + # If capturing is enabled, append the current line to our release notes variable. + if $capturing; then + latest_release+="$line"$'\n' + fi +done < CHANGELOG.md + +latest_release=$(echo "$latest_release" | tail -n +3) +latest_release=$(./scripts/releases/changelog_to_slack_formatter.sh <<< "$latest_release") + +echo "$latest_release" \ No newline at end of file diff --git a/scripts/releases/get_sdk_version.sh b/scripts/releases/get_sdk_version.sh new file mode 100755 index 000000000..e8a1e9d3c --- /dev/null +++ b/scripts/releases/get_sdk_version.sh @@ -0,0 +1,5 @@ +sdk_version=$(grep -i 'version' pubspec.yaml) #version: xx.x.x+x +sdk_version=$(cut -f2 -d' ' <<< "$sdk_version") #xx.x.x+x +sdk_version=$(cut -f1 -d'+' <<< "$sdk_version") #xx.x.x + +echo "$sdk_version" \ No newline at end of file diff --git a/scripts/releases/get_slack_id_from_username.sh b/scripts/releases/get_slack_id_from_username.sh new file mode 100644 index 000000000..16ca1da5b --- /dev/null +++ b/scripts/releases/get_slack_id_from_username.sh @@ -0,0 +1,21 @@ +github_username=$1 + +case $github_username in + 'AndrewAminInstabug') + sid='U06JVRNMKE1' + ;; + 'ahmedAlaaInstabug') + sid='U06AE2G1161' + ;; + 'kholood-ea') + sid='U06SU2QR280' + ;; + 'AyaMahmoud148') + sid='U07GZSURC8K' + ;; + 'MoKamall') + sid='U06JHDS3JJK' + ;; + *) +esac +echo "$sid" \ No newline at end of file From f8ebddd26ed2e8ff96dc9c8a75a44e8b3699a8f6 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Sun, 2 Mar 2025 13:09:21 +0200 Subject: [PATCH 02/35] ci: add a workflow to test the slack message job on test slack channel --- .circleci/config.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index e8eb38caa..06be9d6f5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -364,3 +364,27 @@ workflows: filters: branches: only: master + + send-release-notes: + jobs: + - format_flutter + - lint_flutter: + requires: + - format_flutter + - verify_pub: + requires: + - lint_flutter + - hold_slack_notification: + type: approval + requires: + - format_flutter + - lint_flutter + - verify_pub + - send_slack_notification: + requires: + - hold_slack_notification + event: pass + context: slack-app + filters: + branches: + only: ci/automate-release-notes-for-slack \ No newline at end of file From 77484d8b6f4bc11f8694d84bf5727f75e6293f23 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Tue, 4 Mar 2025 10:44:59 +0200 Subject: [PATCH 03/35] ci: change job image from macos to base --- .circleci/config.yml | 40 +++---------------- .../releases/get_slack_id_from_username.sh | 3 ++ 2 files changed, 8 insertions(+), 35 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 06be9d6f5..39e8ecbb7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -103,7 +103,7 @@ commands: - run: name: Build Pigeons command: dart run build_runner build --delete-conflicting-outputs - notify-slack-with-release: + notify_slack_with_release: steps: - slack/notify: channel: C08F3Q30U7Q @@ -303,11 +303,10 @@ jobs: command: Escape flutter publish release_slack_notification: - macos: - xcode: 15.2.0 - resource_class: macos.m1.medium.gen1 + docker: + - image: cimg/base:current steps: - - notify-slack-with-release + - notify_slack_with_release workflows: version: 2 @@ -357,34 +356,5 @@ workflows: branches: only: master - release_slack_notification: - requires: - - release - event: pass - context: slack-app - filters: - branches: - only: master - - send-release-notes: - jobs: - - format_flutter - - lint_flutter: - requires: - - format_flutter - - verify_pub: - requires: - - lint_flutter - - hold_slack_notification: type: approval - requires: - - format_flutter - - lint_flutter - - verify_pub - - send_slack_notification: - requires: - - hold_slack_notification - event: pass - context: slack-app - filters: - branches: - only: ci/automate-release-notes-for-slack \ No newline at end of file + context: slack-app \ No newline at end of file diff --git a/scripts/releases/get_slack_id_from_username.sh b/scripts/releases/get_slack_id_from_username.sh index 16ca1da5b..e1eafaee7 100644 --- a/scripts/releases/get_slack_id_from_username.sh +++ b/scripts/releases/get_slack_id_from_username.sh @@ -1,6 +1,9 @@ github_username=$1 case $github_username in + 'mzelzoghbi') + sid='U5697F4EL' + ;; 'AndrewAminInstabug') sid='U06JVRNMKE1' ;; From 9fd33125d572a088f55167bcea33bc587eced9ac Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Wed, 5 Mar 2025 02:33:23 +0200 Subject: [PATCH 04/35] fix: correctly indented brackets in config.yml file --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 39e8ecbb7..64874575b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -125,8 +125,8 @@ commands: "text": "<@$(./scripts/releases/get_release_notes.sh)>" } } - ] - } + ] + } jobs: danger: From 2d7ed136d5a357181c2840b243fb4c83739d1a49 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Wed, 5 Mar 2025 02:46:45 +0200 Subject: [PATCH 05/35] fix: split notification job into two jobs; approval, and notification --- .circleci/config.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 64874575b..8606273a7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -355,6 +355,9 @@ workflows: filters: branches: only: master - - release_slack_notification: + - hold_release_slack_notification: type: approval + - release_slack_notification: + requires: + - hold_release_slack_notification context: slack-app \ No newline at end of file From 4e2b72dc389b563b9bf94e55670ba05abefb14de Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Wed, 5 Mar 2025 02:48:50 +0200 Subject: [PATCH 06/35] fix: add missing slack orb --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8606273a7..e39abab00 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,6 +5,7 @@ orbs: flutter: circleci/flutter@2.0.2 node: circleci/node@5.2.0 advanced-checkout: vsco/advanced-checkout@1.1.0 + slack: circleci/slack@5.1.1 commands: setup_flutter: From 6560e320901cba06f8c5660f63aeff4bdea8d439 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Wed, 5 Mar 2025 03:12:12 +0200 Subject: [PATCH 07/35] fix: add checkout step before notification command --- .circleci/config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e39abab00..030b28b9b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -116,7 +116,7 @@ commands: "type": "section", "text": { "type": "mrkdwn", - "text": ":flutter: Flutter `v$(./scripts/releases/get_sdk_version.swift)` is released by <@$(./Scripts/releases/get_job_approver.sh)> 🚀" + "text": ":flutter: Flutter `v$(./scripts/releases/get_sdk_version.sh)` is released by <@$(./Scripts/releases/get_job_approver.sh)> 🚀" } }, { @@ -307,6 +307,7 @@ jobs: docker: - image: cimg/base:current steps: + - advanced-checkout/shallow-checkout - notify_slack_with_release workflows: From 0fdeb5d92c10a01f940eb9d23e2db5319ee96a23 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Wed, 5 Mar 2025 03:26:35 +0200 Subject: [PATCH 08/35] fix: correct case-sensitive naming for .sh script --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 030b28b9b..44c73649b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -116,7 +116,7 @@ commands: "type": "section", "text": { "type": "mrkdwn", - "text": ":flutter: Flutter `v$(./scripts/releases/get_sdk_version.sh)` is released by <@$(./Scripts/releases/get_job_approver.sh)> 🚀" + "text": ":flutter: Flutter `v$(./scripts/releases/get_sdk_version.sh)` is released by <@$(./scripts/releases/get_job_approver.sh)> 🚀" } }, { From 0c74b84ec08e0c218049b7988d2d6d4431303d6b Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Wed, 5 Mar 2025 13:16:06 +0200 Subject: [PATCH 09/35] fix: grant correct run permissions to all scripts in .scripts/* --- scripts/pigeon.sh | 0 scripts/releases/get_job_approver.sh | 0 scripts/releases/get_slack_id_from_username.sh | 0 3 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 scripts/pigeon.sh mode change 100644 => 100755 scripts/releases/get_job_approver.sh mode change 100644 => 100755 scripts/releases/get_slack_id_from_username.sh diff --git a/scripts/pigeon.sh b/scripts/pigeon.sh old mode 100644 new mode 100755 diff --git a/scripts/releases/get_job_approver.sh b/scripts/releases/get_job_approver.sh old mode 100644 new mode 100755 diff --git a/scripts/releases/get_slack_id_from_username.sh b/scripts/releases/get_slack_id_from_username.sh old mode 100644 new mode 100755 From 1ec3dcdcb1dfa1373b7795eafcf659ccf5aea455 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Wed, 5 Mar 2025 13:38:34 +0200 Subject: [PATCH 10/35] fix: change curl command format, change jq selector name to match current job --- scripts/releases/get_job_approver.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/releases/get_job_approver.sh b/scripts/releases/get_job_approver.sh index 96882a0ee..2ba2703ab 100755 --- a/scripts/releases/get_job_approver.sh +++ b/scripts/releases/get_job_approver.sh @@ -1,5 +1,5 @@ -jobsJson=$(curl -s -f -X GET "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job" -u "$CIRCLECI_TOKEN":) -job=$(jq '.items[] | select(.name == "hold")' <<< "$jobsJson") +jobsJson=$(curl -X GET "https://circleci.com/api/v2/workflow/ea620bb8-4219-4815-a5b2-21d11357418c/job" --header "Circle-Token: $CIRCLE_TOKEN") +job=$(jq '.items[] | select(.name == "hold_release_slack_notification")' <<< "$jobsJson") approver_id=$(jq '.approved_by' <<< "$job") approver_id=$(echo "$approver_id" | tr -d '"') From 628b019c9ba78fcbdb4a88e2b269f9b07306d275 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Wed, 5 Mar 2025 13:40:16 +0200 Subject: [PATCH 11/35] fix: retrieve workflow ID dynamically from circleci --- scripts/releases/get_job_approver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/releases/get_job_approver.sh b/scripts/releases/get_job_approver.sh index 2ba2703ab..317a966e6 100755 --- a/scripts/releases/get_job_approver.sh +++ b/scripts/releases/get_job_approver.sh @@ -1,4 +1,4 @@ -jobsJson=$(curl -X GET "https://circleci.com/api/v2/workflow/ea620bb8-4219-4815-a5b2-21d11357418c/job" --header "Circle-Token: $CIRCLE_TOKEN") +jobsJson=$(curl -X GET "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job" --header "Circle-Token: $CIRCLE_TOKEN") job=$(jq '.items[] | select(.name == "hold_release_slack_notification")' <<< "$jobsJson") approver_id=$(jq '.approved_by' <<< "$job") From c305b35ac74a385e9216ff9d958ec77137c19c60 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Wed, 5 Mar 2025 17:02:12 +0200 Subject: [PATCH 12/35] ci: add debugging prints in get_job_approver.sh --- scripts/releases/get_job_approver.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/scripts/releases/get_job_approver.sh b/scripts/releases/get_job_approver.sh index 317a966e6..61a2c49b7 100755 --- a/scripts/releases/get_job_approver.sh +++ b/scripts/releases/get_job_approver.sh @@ -1,12 +1,30 @@ jobsJson=$(curl -X GET "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job" --header "Circle-Token: $CIRCLE_TOKEN") + +echo "jobsJson response:" +echo "$jobsJson" + job=$(jq '.items[] | select(.name == "hold_release_slack_notification")' <<< "$jobsJson") +echo "job:" +echo "$job" + approver_id=$(jq '.approved_by' <<< "$job") + +echo "approver_id:" +echo "$approver_id" + approver_id=$(echo "$approver_id" | tr -d '"') user=$(curl -s -f -X GET "https://circleci.com/api/v2/user/$approver_id" -u "$CIRCLE_TOKEN":) +echo "user:" +echo "$user" + username=$(jq '.login' <<< "$user") + +echo "username:" +echo "$username" + username=$(echo "$username" | tr -d '"') slack_id=$(./scripts/releases/get_slack_id_from_username.sh "$username") From 8a3a5839175df6ed19d998467a9629edc281594b Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Wed, 5 Mar 2025 17:23:03 +0200 Subject: [PATCH 13/35] ci: add more debugging statements --- scripts/releases/get_job_approver.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/releases/get_job_approver.sh b/scripts/releases/get_job_approver.sh index 61a2c49b7..0c752be51 100755 --- a/scripts/releases/get_job_approver.sh +++ b/scripts/releases/get_job_approver.sh @@ -1,4 +1,7 @@ -jobsJson=$(curl -X GET "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job" --header "Circle-Token: $CIRCLE_TOKEN") +echo "CIRCLE_WORKFLOW_ID: $CIRCLE_WORKFLOW_ID" +echo "CIRCLE_TOKEN: ${CIRCLE_TOKEN: -4}" # (or at least echo if it's empty or not) + +jobsJson=$(curl -v -X GET "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job" --header "Circle-Token: $CIRCLE_TOKEN") echo "jobsJson response:" echo "$jobsJson" From 21e9de3ebd7b3d2261dc4c214760ef09a1e713e4 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 13:13:09 +0200 Subject: [PATCH 14/35] ci: change curl command format for retrieving user --- scripts/releases/get_job_approver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/releases/get_job_approver.sh b/scripts/releases/get_job_approver.sh index 0c752be51..32df5a499 100755 --- a/scripts/releases/get_job_approver.sh +++ b/scripts/releases/get_job_approver.sh @@ -18,7 +18,7 @@ echo "$approver_id" approver_id=$(echo "$approver_id" | tr -d '"') -user=$(curl -s -f -X GET "https://circleci.com/api/v2/user/$approver_id" -u "$CIRCLE_TOKEN":) +user=$(curl -v -X GET "https://circleci.com/api/v2/user/$approver_id" --header "Circle-Token: $CIRCLE_TOKEN") echo "user:" echo "$user" From 174c0d2f4beee0ff79b48f3a2a1629592b584db4 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 14:09:35 +0200 Subject: [PATCH 15/35] chore: test get_release_notes script alone --- .circleci/config.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 44c73649b..941b14ea5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -112,13 +112,13 @@ commands: custom: | { "blocks": [ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": ":flutter: Flutter `v$(./scripts/releases/get_sdk_version.sh)` is released by <@$(./scripts/releases/get_job_approver.sh)> 🚀" - } - }, +# { +# "type": "section", +# "text": { +# "type": "mrkdwn", +# "text": ":flutter: Flutter `v$(./scripts/releases/get_sdk_version.sh)` is released by <@$(./scripts/releases/get_job_approver.sh)> 🚀" +# } +# }, { "type": "section", "text": { From 18a0bcf9f1de3029b72151de539e30a06178d787 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 14:13:02 +0200 Subject: [PATCH 16/35] chore: remove comments from message block --- .circleci/config.yml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 941b14ea5..78865e855 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -112,20 +112,13 @@ commands: custom: | { "blocks": [ -# { -# "type": "section", -# "text": { -# "type": "mrkdwn", -# "text": ":flutter: Flutter `v$(./scripts/releases/get_sdk_version.sh)` is released by <@$(./scripts/releases/get_job_approver.sh)> 🚀" -# } -# }, { "type": "section", "text": { - "type": "mrkdwn", - "text": "<@$(./scripts/releases/get_release_notes.sh)>" + "type": "mrkdwn", + "text": "<@$(./scripts/releases/get_release_notes.sh)>" } - } + }, ] } From 16d38eb6261692392368b47221e6c033c5640131 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 14:32:49 +0200 Subject: [PATCH 17/35] chore: test get_sdk_version script alone --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 78865e855..aed8a3c1a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -116,7 +116,7 @@ commands: "type": "section", "text": { "type": "mrkdwn", - "text": "<@$(./scripts/releases/get_release_notes.sh)>" + "text": ":flutter: Flutter `v$(./scripts/releases/get_sdk_version.sh)` is released! 🚀" } }, ] From 80f7ee2b47ed6966030a27a836b15aa1e9e734ae Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 14:35:45 +0200 Subject: [PATCH 18/35] fix: add another block to the message body --- .circleci/config.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index aed8a3c1a..91b9410b2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -119,6 +119,13 @@ commands: "text": ":flutter: Flutter `v$(./scripts/releases/get_sdk_version.sh)` is released! 🚀" } }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Release notes should be here.>" + } + } ] } From 5c7c935067861d1979c304dc5226a0eb8b6d38de Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 14:41:45 +0200 Subject: [PATCH 19/35] chore: test get_job_approver script alone --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 91b9410b2..798ebfda1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -116,7 +116,7 @@ commands: "type": "section", "text": { "type": "mrkdwn", - "text": ":flutter: Flutter `v$(./scripts/releases/get_sdk_version.sh)` is released! 🚀" + "text": ":flutter: New Flutter Version is released by <@$(./scripts/releases/get_job_approver.sh)> 🚀" } }, { From fa720ff9ff5cd19ad2d0b6ff51991a3d9095626d Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 14:53:27 +0200 Subject: [PATCH 20/35] ci: disable verbose logging for curl commands --- scripts/releases/get_job_approver.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/releases/get_job_approver.sh b/scripts/releases/get_job_approver.sh index 32df5a499..0740d0c37 100755 --- a/scripts/releases/get_job_approver.sh +++ b/scripts/releases/get_job_approver.sh @@ -1,7 +1,7 @@ echo "CIRCLE_WORKFLOW_ID: $CIRCLE_WORKFLOW_ID" echo "CIRCLE_TOKEN: ${CIRCLE_TOKEN: -4}" # (or at least echo if it's empty or not) -jobsJson=$(curl -v -X GET "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job" --header "Circle-Token: $CIRCLE_TOKEN") +jobsJson=$(curl -s -X GET "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job" --header "Circle-Token: $CIRCLE_TOKEN") echo "jobsJson response:" echo "$jobsJson" @@ -18,7 +18,7 @@ echo "$approver_id" approver_id=$(echo "$approver_id" | tr -d '"') -user=$(curl -v -X GET "https://circleci.com/api/v2/user/$approver_id" --header "Circle-Token: $CIRCLE_TOKEN") +user=$(curl -s -X GET "https://circleci.com/api/v2/user/$approver_id" --header "Circle-Token: $CIRCLE_TOKEN") echo "user:" echo "$user" From 571759f5a3c6cf9c7468b306b6a87c64f5d8a87c Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 15:07:21 +0200 Subject: [PATCH 21/35] chore: add some clean-up logic to json outputs --- scripts/releases/get_job_approver.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/releases/get_job_approver.sh b/scripts/releases/get_job_approver.sh index 0740d0c37..ae8abcf95 100755 --- a/scripts/releases/get_job_approver.sh +++ b/scripts/releases/get_job_approver.sh @@ -6,11 +6,13 @@ jobsJson=$(curl -s -X GET "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW echo "jobsJson response:" echo "$jobsJson" +jobsJson=$(echo "$jobsJson" | jq -R '.' | jq -s '.' | jq -r 'join("")') job=$(jq '.items[] | select(.name == "hold_release_slack_notification")' <<< "$jobsJson") echo "job:" echo "$job" +job=$(echo "$job" | jq -R '.' | jq -s '.' | jq -r 'join("")') approver_id=$(jq '.approved_by' <<< "$job") echo "approver_id:" @@ -23,6 +25,7 @@ user=$(curl -s -X GET "https://circleci.com/api/v2/user/$approver_id" --header " echo "user:" echo "$user" +user=$(echo "$user" | jq -R '.' | jq -s '.' | jq -r 'join("")') username=$(jq '.login' <<< "$user") echo "username:" From 6fc314c78e365c5afbc5755a06f8b61d7271dfe1 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 15:14:27 +0200 Subject: [PATCH 22/35] ci: change slack job environment to macos --- .circleci/config.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 798ebfda1..0a7f223c7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -304,10 +304,12 @@ jobs: command: Escape flutter publish release_slack_notification: - docker: - - image: cimg/base:current + macos: + xcode: 15.2.0 + resource_class: macos.m1.medium.gen1 steps: - - advanced-checkout/shallow-checkout + - advanced-checkout/shallow-checkout: + path: ~/project - notify_slack_with_release workflows: From 0e4581b1808f5ffa2dc8722263472207b2b80425 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 15:17:48 +0200 Subject: [PATCH 23/35] ci: add install jq to job --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0a7f223c7..303daa07f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -310,6 +310,9 @@ jobs: steps: - advanced-checkout/shallow-checkout: path: ~/project + - run: + name: Install jq + command: brew install jq - notify_slack_with_release workflows: From 62ec22807a8e71b000e4eed622a347e3750e8879 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 15:47:18 +0200 Subject: [PATCH 24/35] chore: enable debug mode for slack job --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 303daa07f..8ebd1283d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -128,6 +128,7 @@ commands: } ] } + debug: true jobs: danger: From a58b0a11ebcbb95cffd2ef32bb5d41a398d1c2a9 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 16:37:37 +0200 Subject: [PATCH 25/35] chore: remove all inner echo statements and switch to here-string (<<<) operator --- .../releases/changelog_to_slack_formatter.sh | 28 ++++--------------- scripts/releases/get_job_approver.sh | 28 ++++--------------- scripts/releases/get_release_notes.sh | 2 +- 3 files changed, 12 insertions(+), 46 deletions(-) diff --git a/scripts/releases/changelog_to_slack_formatter.sh b/scripts/releases/changelog_to_slack_formatter.sh index 3a57c3509..39cedf07c 100755 --- a/scripts/releases/changelog_to_slack_formatter.sh +++ b/scripts/releases/changelog_to_slack_formatter.sh @@ -1,24 +1,8 @@ -#!/bin/bash -# changelog_to_slack_formatter.sh: Convert Markdown changelog to Slack mrkdwn format -# Supports input from a file or STDIN. +input=$(cat) -# If an input file is provided as an argument, read from it. -# Otherwise, read from STDIN. -if [ $# -eq 1 ]; then - if [ ! -f "$1" ]; then - echo "Error: File '$1' not found!" >&2 - exit 1 - fi - input=$(cat "$1") -else - input=$(cat) -fi +input=$(sed -E \ + -e 's/\[([^]]+)\]\(([^)]+)\)/<\2|\1>/g' \ + -e 's/^#{1,6}[[:space:]]*([^[:space:]].*)$/\*\1\*/' \ + -e 's/^- /• /' <<< "$input") -# Process the input using sed: -# 1. Convert Markdown links: [text](url) -> -# 2. Convert header lines (e.g., '## Title') to bold by removing '#' and wrapping text in asterisks. -# 3. Convert bullet lists: '- ' -> '• ' -echo "$input" | sed -E \ - -e 's/\[([^]]+)\]\(([^)]+)\)/<\2|\1>/g' \ - -e 's/^#{1,6}[[:space:]]*([^[:space:]].*)$/\*\1\*/' \ - -e 's/^- /• /' \ No newline at end of file +echo "$input" \ No newline at end of file diff --git a/scripts/releases/get_job_approver.sh b/scripts/releases/get_job_approver.sh index ae8abcf95..c7dd762f4 100755 --- a/scripts/releases/get_job_approver.sh +++ b/scripts/releases/get_job_approver.sh @@ -1,37 +1,19 @@ -echo "CIRCLE_WORKFLOW_ID: $CIRCLE_WORKFLOW_ID" -echo "CIRCLE_TOKEN: ${CIRCLE_TOKEN: -4}" # (or at least echo if it's empty or not) - jobsJson=$(curl -s -X GET "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job" --header "Circle-Token: $CIRCLE_TOKEN") -echo "jobsJson response:" -echo "$jobsJson" - -jobsJson=$(echo "$jobsJson" | jq -R '.' | jq -s '.' | jq -r 'join("")') +#jobsJson=$(echo "$jobsJson" | jq -R '.' | jq -s '.' | jq -r 'join("")') job=$(jq '.items[] | select(.name == "hold_release_slack_notification")' <<< "$jobsJson") -echo "job:" -echo "$job" - -job=$(echo "$job" | jq -R '.' | jq -s '.' | jq -r 'join("")') +#job=$(echo "$job" | jq -R '.' | jq -s '.' | jq -r 'join("")') approver_id=$(jq '.approved_by' <<< "$job") -echo "approver_id:" -echo "$approver_id" - -approver_id=$(echo "$approver_id" | tr -d '"') +approver_id=$(tr -d '"' <<< "$approver_id") user=$(curl -s -X GET "https://circleci.com/api/v2/user/$approver_id" --header "Circle-Token: $CIRCLE_TOKEN") -echo "user:" -echo "$user" - -user=$(echo "$user" | jq -R '.' | jq -s '.' | jq -r 'join("")') +#user=$(echo "$user" | jq -R '.' | jq -s '.' | jq -r 'join("")') username=$(jq '.login' <<< "$user") -echo "username:" -echo "$username" - -username=$(echo "$username" | tr -d '"') +username=$(tr -d '"' <<< "$username") slack_id=$(./scripts/releases/get_slack_id_from_username.sh "$username") diff --git a/scripts/releases/get_release_notes.sh b/scripts/releases/get_release_notes.sh index dbf743e0f..3c7931483 100755 --- a/scripts/releases/get_release_notes.sh +++ b/scripts/releases/get_release_notes.sh @@ -17,7 +17,7 @@ while IFS= read -r line; do fi done < CHANGELOG.md -latest_release=$(echo "$latest_release" | tail -n +3) +latest_release=$(tail -n +3 <<< "$latest_release") latest_release=$(./scripts/releases/changelog_to_slack_formatter.sh <<< "$latest_release") echo "$latest_release" \ No newline at end of file From 5cf8b877f04e371b4c59939c1e09d7394f70b3e1 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 16:44:01 +0200 Subject: [PATCH 26/35] chore: change slack job environment back to default, test get_release_notes --- .circleci/config.yml | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8ebd1283d..44c73649b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -116,19 +116,18 @@ commands: "type": "section", "text": { "type": "mrkdwn", - "text": ":flutter: New Flutter Version is released by <@$(./scripts/releases/get_job_approver.sh)> 🚀" + "text": ":flutter: Flutter `v$(./scripts/releases/get_sdk_version.sh)` is released by <@$(./scripts/releases/get_job_approver.sh)> 🚀" } }, { "type": "section", "text": { "type": "mrkdwn", - "text": "Release notes should be here.>" + "text": "<@$(./scripts/releases/get_release_notes.sh)>" } } ] } - debug: true jobs: danger: @@ -305,15 +304,10 @@ jobs: command: Escape flutter publish release_slack_notification: - macos: - xcode: 15.2.0 - resource_class: macos.m1.medium.gen1 + docker: + - image: cimg/base:current steps: - - advanced-checkout/shallow-checkout: - path: ~/project - - run: - name: Install jq - command: brew install jq + - advanced-checkout/shallow-checkout - notify_slack_with_release workflows: From 5149eae3fa293a35fccae565d4260e08979867ec Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 16:58:13 +0200 Subject: [PATCH 27/35] fix: add a shebang on top of the changelog_to_slack_formatter script --- scripts/releases/changelog_to_slack_formatter.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/releases/changelog_to_slack_formatter.sh b/scripts/releases/changelog_to_slack_formatter.sh index 39cedf07c..ef34843e0 100755 --- a/scripts/releases/changelog_to_slack_formatter.sh +++ b/scripts/releases/changelog_to_slack_formatter.sh @@ -1,3 +1,4 @@ +#!/usr/bin/env bash input=$(cat) input=$(sed -E \ From 587ca72f0b1ae607e1e921c5505af248a3eb246a Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 17:07:36 +0200 Subject: [PATCH 28/35] chore: enable debug mode for slack/notify, add shebang on top of get_release_notes --- .circleci/config.yml | 1 + scripts/releases/get_release_notes.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 44c73649b..0bd60d023 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -128,6 +128,7 @@ commands: } ] } + debug: true jobs: danger: diff --git a/scripts/releases/get_release_notes.sh b/scripts/releases/get_release_notes.sh index 3c7931483..e9c869b16 100755 --- a/scripts/releases/get_release_notes.sh +++ b/scripts/releases/get_release_notes.sh @@ -1,3 +1,4 @@ +#!/usr/bin/env bash latest_release="" capturing=false From db5e6507d7fd794e192bf527c50e5e63270510e8 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 17:15:39 +0200 Subject: [PATCH 29/35] chore: directly format message inside get_release_notes --- scripts/releases/get_release_notes.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/releases/get_release_notes.sh b/scripts/releases/get_release_notes.sh index e9c869b16..9ad3b6266 100755 --- a/scripts/releases/get_release_notes.sh +++ b/scripts/releases/get_release_notes.sh @@ -19,6 +19,10 @@ while IFS= read -r line; do done < CHANGELOG.md latest_release=$(tail -n +3 <<< "$latest_release") -latest_release=$(./scripts/releases/changelog_to_slack_formatter.sh <<< "$latest_release") +#latest_release=$(./scripts/releases/changelog_to_slack_formatter.sh <<< "$latest_release") +latest_release=$(sed -E \ + -e 's/\[([^]]+)\]\(([^)]+)\)/<\2|\1>/g' \ + -e 's/^#{1,6}[[:space:]]*([^[:space:]].*)$/\*\1\*/' \ + -e 's/^- /• /' <<< "$latest_release") echo "$latest_release" \ No newline at end of file From d91110a7315d5bc502995cfbb833756c5333cc2e Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 19:08:34 +0200 Subject: [PATCH 30/35] fix: format message in seperate script again, and output correct slack Block Kit Builder --- .circleci/config.yml | 2 +- scripts/releases/get_release_notes.sh | 20 +++++++------------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0bd60d023..d51488308 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -123,7 +123,7 @@ commands: "type": "section", "text": { "type": "mrkdwn", - "text": "<@$(./scripts/releases/get_release_notes.sh)>" + "text": "<$(./scripts/releases/get_release_notes.sh)>" } } ] diff --git a/scripts/releases/get_release_notes.sh b/scripts/releases/get_release_notes.sh index 9ad3b6266..d81a0b8df 100755 --- a/scripts/releases/get_release_notes.sh +++ b/scripts/releases/get_release_notes.sh @@ -4,25 +4,19 @@ capturing=false while IFS= read -r line; do if [[ "$line" == "## ["* ]]; then - # If we are already capturing, this means we have reached the next release section. if $capturing; then - break # stop reading further + break fi - # Otherwise, this is the start of the latest release section. - capturing=true fi - # If capturing is enabled, append the current line to our release notes variable. + if [[ "$line" == "### "* ]]; then + capturing=true + fi + if $capturing; then - latest_release+="$line"$'\n' + line=$(./scripts/releases/changelog_to_slack_formatter.sh <<< "$line") + latest_release+="$line\n" fi done < CHANGELOG.md -latest_release=$(tail -n +3 <<< "$latest_release") -#latest_release=$(./scripts/releases/changelog_to_slack_formatter.sh <<< "$latest_release") -latest_release=$(sed -E \ - -e 's/\[([^]]+)\]\(([^)]+)\)/<\2|\1>/g' \ - -e 's/^#{1,6}[[:space:]]*([^[:space:]].*)$/\*\1\*/' \ - -e 's/^- /• /' <<< "$latest_release") - echo "$latest_release" \ No newline at end of file From 5dd7637cdd0d51dbfcc689407689ce1f1a02d39c Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Thu, 6 Mar 2025 19:12:05 +0200 Subject: [PATCH 31/35] fix: remove angular brackets from release notes body --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d51488308..a0a2460cd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -123,7 +123,7 @@ commands: "type": "section", "text": { "type": "mrkdwn", - "text": "<$(./scripts/releases/get_release_notes.sh)>" + "text": "$(./scripts/releases/get_release_notes.sh)" } } ] From 0b7f3aa63b06ef139acf9aa76ca38af20eedfbb2 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Sun, 9 Mar 2025 04:26:41 +0200 Subject: [PATCH 32/35] fix: show correct sdk version --- scripts/releases/get_sdk_version.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/releases/get_sdk_version.sh b/scripts/releases/get_sdk_version.sh index e8a1e9d3c..5b1a4533b 100755 --- a/scripts/releases/get_sdk_version.sh +++ b/scripts/releases/get_sdk_version.sh @@ -1,5 +1,5 @@ sdk_version=$(grep -i 'version' pubspec.yaml) #version: xx.x.x+x -sdk_version=$(cut -f2 -d' ' <<< "$sdk_version") #xx.x.x+x -sdk_version=$(cut -f1 -d'+' <<< "$sdk_version") #xx.x.x +sdk_version=$(cut -f2 -d' ' <<< $sdk_version) #xx.x.x+x +sdk_version=$(cut -f1 -d'+' <<< $sdk_version) #xx.x.x echo "$sdk_version" \ No newline at end of file From 2bde50631955db713e3f8902b9d9ebb44a61b07c Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Sun, 9 Mar 2025 04:27:01 +0200 Subject: [PATCH 33/35] chore: add mentions section --- .circleci/config.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a0a2460cd..78cdaa2c1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -125,10 +125,16 @@ commands: "type": "mrkdwn", "text": "$(./scripts/releases/get_release_notes.sh)" } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "cc: <@U5697F4EL> @support_team <@ULDFCC09J>" + } } ] } - debug: true jobs: danger: From 74d358bdca8e6e2a2c2664b4ddea9ced4660fc07 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Sun, 9 Mar 2025 04:31:22 +0200 Subject: [PATCH 34/35] ci: change channel id to planning_releases, send message on successful releases now --- .circleci/config.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 78cdaa2c1..ed837207b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -107,7 +107,7 @@ commands: notify_slack_with_release: steps: - slack/notify: - channel: C08F3Q30U7Q + channel: C8PDY2Q8H event: pass custom: | { @@ -364,9 +364,7 @@ workflows: filters: branches: only: master - - hold_release_slack_notification: - type: approval - release_slack_notification: requires: - - hold_release_slack_notification + - release context: slack-app \ No newline at end of file From f690c32d1f0a55385823865c1070c3c194ea9e38 Mon Sep 17 00:00:00 2001 From: Mohamed Kamal Date: Mon, 10 Mar 2025 14:25:16 +0200 Subject: [PATCH 35/35] chore: remove commented code from shell scripts --- scripts/releases/get_job_approver.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/scripts/releases/get_job_approver.sh b/scripts/releases/get_job_approver.sh index c7dd762f4..8b479d385 100755 --- a/scripts/releases/get_job_approver.sh +++ b/scripts/releases/get_job_approver.sh @@ -1,16 +1,13 @@ jobsJson=$(curl -s -X GET "https://circleci.com/api/v2/workflow/$CIRCLE_WORKFLOW_ID/job" --header "Circle-Token: $CIRCLE_TOKEN") -#jobsJson=$(echo "$jobsJson" | jq -R '.' | jq -s '.' | jq -r 'join("")') job=$(jq '.items[] | select(.name == "hold_release_slack_notification")' <<< "$jobsJson") -#job=$(echo "$job" | jq -R '.' | jq -s '.' | jq -r 'join("")') approver_id=$(jq '.approved_by' <<< "$job") approver_id=$(tr -d '"' <<< "$approver_id") user=$(curl -s -X GET "https://circleci.com/api/v2/user/$approver_id" --header "Circle-Token: $CIRCLE_TOKEN") -#user=$(echo "$user" | jq -R '.' | jq -s '.' | jq -r 'join("")') username=$(jq '.login' <<< "$user") username=$(tr -d '"' <<< "$username")