mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			87 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| set -euo pipefail
 | |
| 
 | |
| SCRIPT_DIR="$(dirname "$0")"
 | |
| 
 | |
| function fail() {
 | |
|     printf '%s\n' "$1" >&2
 | |
|     exit 1
 | |
| }
 | |
| 
 | |
| function notify() {
 | |
|     [[ -z "$1" ]] && fail "Event type not provided."
 | |
|     [[ "$1" != "failure" && "$1" != "success" && "$1" != "release" ]] && fail "Wrong event type."
 | |
|     local event="$1"
 | |
|     local formatted_message
 | |
| 
 | |
|     # FIXME: Checking $CIRCLE_PULL_REQUEST would be better than hard-coding branch names
 | |
|     # but it's broken. CircleCI associates runs on develop/breaking with random old PRs.
 | |
|     [[ "$BRANCH" == "develop" || "$BRANCH" == "breaking" ]] || { echo "Running on a PR or a feature branch - notification skipped."; exit 0; }
 | |
| 
 | |
|     # The release notification only makes sense on tagged commits. If the commit is untagged, just bail out.
 | |
|     [[ "$event" == "release" ]] && { [[ $TAG != "" ]] || { echo "Not a tagged commit - notification skipped."; exit 0; } }
 | |
| 
 | |
|     formatted_message="$(format_predefined_message "$event")"
 | |
| 
 | |
|     curl "https://${MATRIX_SERVER}/_matrix/client/v3/rooms/${MATRIX_NOTIFY_ROOM_ID}/send/m.room.message" \
 | |
|         --request POST \
 | |
|         --include \
 | |
|         --fail \
 | |
|         --header "Content-Type: application/json" \
 | |
|         --header "Accept: application/json" \
 | |
|         --header "Authorization: Bearer ${MATRIX_ACCESS_TOKEN}" \
 | |
|         --data "$formatted_message"
 | |
| }
 | |
| 
 | |
| function circleci_workflow_name() {
 | |
|     # Workflow name is not exposed as an env variable. Has to be queried from the API.
 | |
|     # The name is not critical so if anything fails, use the raw workflow ID as a fallback.
 | |
|     local workflow_info
 | |
|     workflow_info=$(curl --silent "https://circleci.com/api/v2/workflow/${CIRCLE_WORKFLOW_ID}") || true
 | |
|     echo "$workflow_info" | grep -E '"\s*name"\s*:\s*".*"' | cut -d \" -f 4 || echo "$CIRCLE_WORKFLOW_ID"
 | |
| }
 | |
| 
 | |
| function circleci_job_name() {
 | |
|     (( CIRCLE_NODE_TOTAL == 1 )) && echo "${CIRCLE_JOB}" && return
 | |
|     (( CIRCLE_NODE_TOTAL != 1 )) && echo "${CIRCLE_JOB} (run $((CIRCLE_NODE_INDEX + 1))/${CIRCLE_NODE_TOTAL})"
 | |
| }
 | |
| 
 | |
| # Currently matrix only supports html formatted body,
 | |
| # see: https://spec.matrix.org/v1.6/client-server-api/#mtext
 | |
| #
 | |
| # Eventually, the matrix api will have support for better format options and `formatted_body` may not be necessary anymore:
 | |
| # https://github.com/matrix-org/matrix-spec-proposals/pull/1767
 | |
| function format_predefined_message() {
 | |
|     [[ -z "$1" ]] && fail "Event type not provided."
 | |
|     local event="$1"
 | |
|     local template
 | |
| 
 | |
|     [[ "$event" == "failure" ]] && template="${SCRIPT_DIR}/templates/build_fail.json"
 | |
|     [[ "$event" == "success" ]] && template="${SCRIPT_DIR}/templates/build_success.json"
 | |
|     [[ "$event" == "release" ]] && template="${SCRIPT_DIR}/templates/build_release.json"
 | |
| 
 | |
|     [[ -z "$template" ]] && fail "Message template for event [$event] not defined."
 | |
| 
 | |
|     # shellcheck disable=SC2016
 | |
|     sed -e 's|${WORKFLOW_NAME}|'"${WORKFLOW_NAME}"'|' \
 | |
|         -e 's|${JOB}|'"${JOB}"'|' \
 | |
|         -e 's|${BRANCH}|'"${BRANCH}"'|' \
 | |
|         -e 's|${TAG}|'"${TAG}"'|' \
 | |
|         -e 's|${BUILD_URL}|'"${BUILD_URL}"'|' \
 | |
|         -e 's|${BUILD_NUM}|'"${BUILD_NUM}"'|' \
 | |
|         "$template"
 | |
| }
 | |
| 
 | |
| # Set message environment variables based on CI backend
 | |
| if [[ "$CIRCLECI" = true ]] ; then
 | |
|     BRANCH="$CIRCLE_BRANCH"
 | |
|     TAG="${CIRCLE_TAG:-}"
 | |
|     BUILD_URL="$CIRCLE_BUILD_URL"
 | |
|     BUILD_NUM="$CIRCLE_BUILD_NUM"
 | |
|     WORKFLOW_NAME="$(circleci_workflow_name)"
 | |
|     JOB="$(circleci_job_name)"
 | |
| fi
 | |
| 
 | |
| notify "$@"
 |