John Locke
9 years ago
commit
6daae05edf
5 changed files with 183 additions and 0 deletions
-
7Dockerfile
-
87README.md
-
5bin/check
-
3bin/in
-
81bin/out
@ -0,0 +1,7 @@ |
|||
FROM debian:jessie |
|||
|
|||
RUN apt-get update && apt-get -y install jq curl |
|||
|
|||
COPY bin/ /opt/resource/ |
|||
COPY matrix_bash_bot/matrix-bashbot.sh /usr/local/bin/ |
|||
RUN chmod +x /opt/resource/* /usr/local/bin/matrix-bashbot.sh |
@ -0,0 +1,87 @@ |
|||
# Matrix Notification Resource for Concourse CI |
|||
|
|||
Send notification messages to [Matrix](http://matrix.org) using a string message or templated message. |
|||
|
|||
This resource borrows heavily from the [Slack notification resource](https://github.com/cloudfoundry-community/slack-notification-resource). Usage and behavior around text and text_file parameters should be handled exactly the same as in that. |
|||
|
|||
## Installing |
|||
|
|||
``` |
|||
resource-types: |
|||
- name: matrix-notification-resource |
|||
type: docker-image |
|||
source: |
|||
repository: freelock/matrix-notification-resource |
|||
``` |
|||
|
|||
## Registering with Matrix |
|||
|
|||
This resource needs an access token for a valid user account. It will not create the user account for you, or retrieve the token. |
|||
|
|||
To get a token, first create a Matrix user account on your homeserver of choice. Then you can use Curl to get an access token for the account: |
|||
|
|||
``` |
|||
curl -XPOST -d '{"type":"m.login.password", "user":"example", "password":"wordpass"}' "http://matrix.org/_matrix/client/api/r0/login" |
|||
|
|||
{ |
|||
"access_token": "QGV4YW1wbGU6bG9jYWxob3N0.vRDLTgxefmKWQEtgGd", |
|||
"home_server": "matrix.org", |
|||
"user_id": "@example:matrix.org" |
|||
} |
|||
``` |
|||
|
|||
... add the returned access_token to the resource. |
|||
|
|||
Then, a user will need to invite the account to the appropriate room, and the account will need to accept the invitation. |
|||
|
|||
## Source Configuration |
|||
|
|||
* `matrix_server_url`: *Required.* Example: https://matrix.org |
|||
* `token`: *Required.* token to authenticate with Matrix server |
|||
* `room_id`: *Required.* The room to send notifications to -- this account must already be a member of this room. |
|||
|
|||
Pull requests accepted for room_alias, user logins, auto-joins. |
|||
|
|||
#### `out`: Sends message to Matrix room |
|||
|
|||
Send message to specified Matrix Room, with the configured parameters |
|||
|
|||
#### Parameters |
|||
* `text`: (string) Text to send to the Matrix room |
|||
* `text_file`: (string) File containing text to send to the Matrix room |
|||
* `msgtype`: *Optional.* Message type, m.notice, m.text (default: m.notice) |
|||
|
|||
## Example |
|||
|
|||
### Check |
|||
``` |
|||
--- |
|||
resources: |
|||
- name: matrix-notification |
|||
type: matrix-notification-resource |
|||
source: |
|||
matrix_server_url: https://matrix.org |
|||
token: {{matrix_token}} |
|||
room_id: {{matrix_room_id}} |
|||
``` |
|||
|
|||
### In |
|||
|
|||
*Not supported* |
|||
|
|||
### Out |
|||
|
|||
``` |
|||
--- |
|||
--- |
|||
- put: matrix-notification |
|||
params: |
|||
text_file: results/message.txt |
|||
text: | |
|||
The build had a result. Check it out at: |
|||
http://my.concourse.url/pipelines/$BUILD_PIPELINE_NAME/jobs/$BUILD_JOB_NAME/builds/$BUILD_NAME |
|||
or at: |
|||
http://my.concourse.url/builds/$BUILD_ID |
|||
|
|||
Result: $TEXT_FILE_CONTENT |
|||
``` |
@ -0,0 +1,5 @@ |
|||
#!/bin/bash |
|||
|
|||
read json |
|||
echo '[]' |
|||
exit 0 |
@ -0,0 +1,3 @@ |
|||
#!/bin/bash |
|||
|
|||
echo '{"version":{"ref":"none"}}' |
@ -0,0 +1,81 @@ |
|||
#!/bin/bash |
|||
|
|||
# Send message to a matrix room. API call looks like this: |
|||
# curl -XPOST -d '{"msgtype":"m.text", "body":"hello"}' "http://matrix.org/_matrix/client/api/v1/rooms/%21CvcvRuDYDzTOzfKKgh%3Alocalhost/send/m.room.message?access_token=YOUR_ACCESS_TOKEN" |
|||
|
|||
|
|||
set -e |
|||
|
|||
cd "${1}" |
|||
|
|||
exec 3>&1 |
|||
exec 1>&2 |
|||
|
|||
# for jq |
|||
PATH=/usr/local/bin:$PATH |
|||
|
|||
payload=$(mktemp /tmp/resource-in.XXXXXX) |
|||
|
|||
cat > "${payload}" <&0 |
|||
|
|||
matrix_server_url="$(jq -r '.source.matrix_server_url' < "${payload}")" |
|||
token="$(jq -r '.source.token' < "${payload}")" |
|||
room_id="$(jq -r '.source.room_id' < "${payload}")" |
|||
|
|||
ts="$(date +%s)" |
|||
|
|||
matrix_endpoint="$matrix_server_url/_matrix/client/r0/rooms/$room_id/send/m.room.message/$ts?access_token=$token" |
|||
|
|||
text_file="$(jq -r '.params.text_file // ""' < "${payload}")" |
|||
from="$(jq -r '.params.from // ""' < "${payload}")" |
|||
text="$(jq '(.params.text // "${TEXT_FILE_CONTENT}")' < "${payload}")" |
|||
msgtype="$(jq '(.params.msgtype // "m.notice")' < "${payload}")" |
|||
|
|||
always_notify="$(jq -r '.params.always_notify // "true"' < "${payload}")" |
|||
debug="$(jq -r '.params.debug // "false"' < "${payload}")" |
|||
silent="$(jq -r '.params.silent // "false"' < "${payload}")" |
|||
|
|||
TEXT_FILE_CONTENT="" |
|||
[[ -n "${text_file}" && -f "${text_file}" ]] && TEXT_FILE_CONTENT="$(cat "${text_file}")" |
|||
|
|||
if [[ "$always_notify" == "true" || -n "$TEXT_FILE_CONTENT" || -z "$text_file" ]] |
|||
then |
|||
TEXT_FILE_CONTENT="${TEXT_FILE_CONTENT:-_(no notification provided)_}" |
|||
|
|||
text="$(eval printf ${text} )" |
|||
[[ -z "${text}" ]] && text="_(missing notification text)_" |
|||
text="$(echo "${text}" | jq -R -s .)" |
|||
|
|||
[[ "${token}" != "null" ]] && username="$(eval "printf ${token}" | jq -R -s .)" |
|||
[[ "${room_id}" != "null" ]] && room_id="$(eval "printf ${room_id}" | jq -R -s .)" |
|||
body="$(cat <<EOF |
|||
{ |
|||
"msgtype": ${msgtype}, |
|||
"body": ${text} |
|||
} |
|||
EOF |
|||
)" |
|||
|
|||
compact_body="$(echo "${body}" | jq -c '.')" |
|||
|
|||
if [[ "$debug" == "true" ]] |
|||
then |
|||
json="$(cat <<EOF |
|||
{ |
|||
"matrix_endpoint": "${matrix_endpoint}", |
|||
"body": ${body} |
|||
} |
|||
EOF |
|||
)" |
|||
echo "$json" | jq -c '.' |
|||
exit 0 |
|||
elif [[ "$silent" == "true" ]] |
|||
then |
|||
echo "Using silent output" |
|||
curl -s -X PUT --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{compact_body}' "${matrix_endpoint}" |
|||
else |
|||
curl -v -X PUT --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{compact_body}' "${matrix_endpoint}" |
|||
fi |
|||
fi |
|||
|
|||
jq -n "{version:{timestamp:\"$(date +%s)\"}}" >&3 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue