mirror of
https://github.com/coder/coder.git
synced 2025-07-09 11:45:56 +00:00
110 lines
3.2 KiB
Bash
Executable File
110 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
[[ $VERBOSE == 1 ]] && set -x
|
|
|
|
status=$1
|
|
shift
|
|
|
|
case "${status}" in
|
|
started) ;;
|
|
completed) ;;
|
|
failed) ;;
|
|
*)
|
|
echo "Unknown status: ${status}" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# shellcheck disable=SC2153 source=scaletest/templates/scaletest-runner/scripts/lib.sh
|
|
. "${SCRIPTS_DIR}/lib.sh"
|
|
|
|
# NOTE(mafredri): API returns HTML if we accidentally use `...//api` vs `.../api`.
|
|
# https://github.com/coder/coder/issues/9877
|
|
CODER_URL="${CODER_URL%/}"
|
|
buildinfo="$(curl -sSL "${CODER_URL}/api/v2/buildinfo")"
|
|
server_version="$(jq -r '.version' <<<"${buildinfo}")"
|
|
server_version_commit="$(jq -r '.external_url' <<<"${buildinfo}")"
|
|
|
|
# Since `coder show` doesn't support JSON output, we list the workspaces instead.
|
|
# Use `command` here to bypass dry run.
|
|
workspace_json="$(
|
|
command coder list --all --output json |
|
|
jq --arg workspace "${CODER_WORKSPACE}" --arg user "${CODER_USER}" 'map(select(.name == $workspace) | select(.owner_name == $user)) | .[0]'
|
|
)"
|
|
owner_name="$(jq -r '.latest_build.workspace_owner_name' <<<"${workspace_json}")"
|
|
workspace_name="$(jq -r '.latest_build.workspace_name' <<<"${workspace_json}")"
|
|
initiator_name="$(jq -r '.latest_build.initiator_name' <<<"${workspace_json}")"
|
|
|
|
bullet='•'
|
|
app_urls_raw="$(jq -r '.latest_build.resources[].agents[]?.apps | map(select(.external == true)) | .[] | .display_name, .url' <<<"${workspace_json}")"
|
|
app_urls=()
|
|
while read -r app_name; do
|
|
read -r app_url
|
|
bold=
|
|
if [[ ${status} != started ]] && [[ ${app_url} = *to=now* ]]; then
|
|
# Update Grafana URL with end stamp and make bold.
|
|
app_url="${app_url//to=now/to=$(($(date +%s) * 1000))}"
|
|
bold='*'
|
|
fi
|
|
app_urls+=("${bullet} ${bold}${app_name}${bold}: ${app_url}")
|
|
done <<<"${app_urls_raw}"
|
|
|
|
params=()
|
|
header=
|
|
|
|
case "${status}" in
|
|
started)
|
|
created_at="$(jq -r '.latest_build.created_at' <<<"${workspace_json}")"
|
|
params=("${bullet} Options:")
|
|
while read -r param; do
|
|
params+=(" ${bullet} ${param}")
|
|
done <<<"$(jq -r '.latest_build.resources[].agents[]?.environment_variables | to_entries | map(select(.key | startswith("SCALETEST_PARAM_"))) | .[] | "`\(.key)`: `\(.value)`"' <<<"${workspace_json}")"
|
|
|
|
header="New scaletest started at \`${created_at}\` by \`${initiator_name}\` on ${CODER_URL} (<${server_version_commit}|\`${server_version}\`>)."
|
|
;;
|
|
completed)
|
|
completed_at=$(date -Iseconds)
|
|
header="Scaletest completed at \`${completed_at}\` (started by \`${initiator_name}\`) on ${CODER_URL} (<${server_version_commit}|\`${server_version}\`>)."
|
|
;;
|
|
failed)
|
|
failed_at=$(date -Iseconds)
|
|
header="Scaletest failed at \`${failed_at}\` (started by \`${initiator_name}\`) on ${CODER_URL} (<${server_version_commit}|\`${server_version}\`>)."
|
|
;;
|
|
*)
|
|
echo "Unknown status: ${status}" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
text_arr=(
|
|
"${header}"
|
|
""
|
|
"${bullet} *Comment:* ${SCALETEST_COMMENT}"
|
|
"${bullet} Workspace (runner): ${CODER_URL}/@${owner_name}/${workspace_name}"
|
|
"${bullet} Run ID: ${SCALETEST_RUN_ID}"
|
|
"${app_urls[@]}"
|
|
"${params[@]}"
|
|
)
|
|
|
|
text=
|
|
for field in "${text_arr[@]}"; do
|
|
text+="${field}"$'\n'
|
|
done
|
|
|
|
json=$(
|
|
jq -n --arg text "${text}" '{
|
|
blocks: [
|
|
{
|
|
"type": "section",
|
|
"text": {
|
|
"type": "mrkdwn",
|
|
"text": $text
|
|
}
|
|
}
|
|
]
|
|
}'
|
|
)
|
|
|
|
maybedryrun "${DRY_RUN}" curl -X POST -H 'Content-type: application/json' --data "${json}" "${SLACK_WEBHOOK_URL}"
|