Octwilio combines the Octopus Deploy and Twilio APIs. Twilio sends messages when certain events in Octopus happen. Responses to those messages can invoke requests to the Octopus API.
For example, if a deployment requires approval, Octwilio uses the Twilio API to send an SMS to a chosen approver. The approver can then reply to the SMS with "Approve" or "Reject." Octwilio accepts the message from Twilio and uses the Octopus API to update the state of the deployment.
I do not have a publically available demo link, but please enjoy this screenshot of Octwilio in action.
You can see a message announcing the deployment has started. After that, there is a message letting me know that the deployment requires approval. I reply with a very official "looks good to me." I get a notification that the deployment was approved, and finally that it was successful.
The code and configuration instructions are hosted on GitHub.
How it works
This project contains [Firebase] cloud functions for connecting Octopus Deploy and Twilio events. The functions handle Octopus Deploy subscription events as well as SMS messages to a Twilio phone number.
More details can be found in this blog series about building Octwilio.
- Send SMS alert when an Octopus Deploy deployment requires approval
- Approve or reject a deployment via SMS
- Send SMS alerts for deployment events
- Endpoint for deployment notifications
How to use it
- Create a copy using GitHub's repository template functionality
- Update the
.firebasercwith the respective values.
- Configure your Firebase, Octopus Deploy, and Twilio accounts
- Create your Firebase project
- Deploy the functions to Firebase
- Configure your Octopus Deploy subscriptions
- Configure your Twilio phone number webhook
I built Octwilio with Firebase Cloud Functions. Cloud Functions are Node-based serverless functions that fire on specific events. Octwilio uses functions that trigger on HTTP requests. These functions are the glue between the Twilio and Octopus Deploy APIs.
The details on how I built Octwilio are in earlier posts of this series. Start with the first one!
Posted on by: