From 0a7bd5479883aaeafb6b3f72d91eac565809b183 Mon Sep 17 00:00:00 2001 From: blag Date: Thu, 28 Mar 2019 21:59:46 -0700 Subject: [PATCH 01/11] Add more documentation for chat providers that also support the Slack attachments API --- docs/source/chatops/aliases.rst | 57 +++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/docs/source/chatops/aliases.rst b/docs/source/chatops/aliases.rst index e65aaba1f..fb60b5a1b 100644 --- a/docs/source/chatops/aliases.rst +++ b/docs/source/chatops/aliases.rst @@ -318,8 +318,8 @@ follow as an attachment. ``{~}`` at the end of the string will display the whole message in plaintext. -Passing Attachment API parameters (Slack-only) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Passing Attachment API parameters (Slack, Mattermost, and Rocketchat only) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Slack formats ChatOps output as attachments, and you can configure the API parameters in the ``result.extra.slack`` field. @@ -369,6 +369,59 @@ dynamically: Support for other chat providers is coming soon, and of course you are always welcome to contribute! See the example below for hacking on ``extra``. +Mattermost and Rocketchat also support the Slack attachments API. However, you will need +to use the ``mattermost`` and ``rocketchat`` keys to ``extra``: + +.. code-block:: yaml + + [...] + formats: + - "say {{ phrase }} in {{ color }}" + result: + extra: + mattermost: + color: "{{execution.parameters.color}}" + [...] + +.. code-block:: yaml + + formats: + - "say {{ phrase }} in {{ color }}" + result: + extra: + rocketchat: + color: "{{execution.parameters.color}}" + [...] + +And you absolutely can specify more than one chat provider in a single alias by using +more than one key in ``extra``. This can be useful if you might switch chat providers +in the future, or if you are trying to prototype an alias to (for instance) compare and +contrast chat providers (although we can tell you that, right now, Slack definitely has +the best integration with st2chatops). + +.. code-block:: yaml + + [...] + formats: + - "say {{ phrase }} in {{ color }}" + result: + extra: + slack: + image_url: "http://i.imgur.com/Gb9kAYK.jpg" + fields: + - title: Kitten headcount + value: Eight. + short: true + - title: Number of boxes + value: A bunch. + short: true + color: "#00AA00" + mattermost: + color: "{{execution.parameters.color}}" + rocketchat: + color: "{{execution.parameters.color}}" + [...] + Testing and extending alias parameters ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 141fcb087cc66d8961da24deb3ce12557dd075ef Mon Sep 17 00:00:00 2001 From: blag Date: Thu, 28 Mar 2019 20:07:16 -0700 Subject: [PATCH 02/11] Add configuration steps for Microsoft Teams --- docs/source/chatops/index.rst | 1 + docs/source/chatops/msteams_is_a_diva.rst | 234 ++++++++++++++++++++++ 2 files changed, 235 insertions(+) create mode 100644 docs/source/chatops/msteams_is_a_diva.rst diff --git a/docs/source/chatops/index.rst b/docs/source/chatops/index.rst index 2ef85ca74..81b7ebe44 100644 --- a/docs/source/chatops/index.rst +++ b/docs/source/chatops/index.rst @@ -50,6 +50,7 @@ Interested in learning more? Here are some things to get you started on your voy :maxdepth: 1 chatops + Configuration for Microsoft Teams Action Aliases notifications Pack Deployment diff --git a/docs/source/chatops/msteams_is_a_diva.rst b/docs/source/chatops/msteams_is_a_diva.rst new file mode 100644 index 000000000..e44e110d2 --- /dev/null +++ b/docs/source/chatops/msteams_is_a_diva.rst @@ -0,0 +1,234 @@ +Using Microsoft Teams (with BotFramework) +========================================= + +Configurating st2chatops with Microsoft Teams is **much** more involved than configuring +other chat platforms. + +.. note:: Caveats + + * There are multiple hubot adapters for Microsoft Teams and/or BotFramework. Only + two of them (that we found) are production quality, and only the + BotFramework-Hubot project is the officially supported option. + * Microsoft BotFramework's "push model" requires bots to have an open port open to + the internet. This is a limitation of Teams/BotFramework. + (`source `_) + * The BotFramework bot does not receive all messages in a channel. Users MUST + explicitly at-mention the bot user to send any messages to the bot. + * Users can alternatively direct message the bot user itself (without + at-mentioning it) in the bot user's "room". This isn't really considered ChatOps + though. And it is impossible to disable this "feature" from within Teams itself. + However, all StackStorm alias executions are logged as normal, although StackStorm's + RBAC does not work in st2chatops. + * The `Orky `_ project is meant to run within Azure + and send events via a websocket. We have investigated this method but we were unable + to get it working in development. + +Setup BotFramework +~~~~~~~~~~~~~~~~~~ + +1. Note the internet accessible hostname and port for your st2chatops (hubot) server. +2. Register a bot within `BotFramework `_. +3. Note your Microsoft App ID and password, you will need these later. +4. Configure the "Messaging endpoint" option to your st2chatops server, and append + ``/api/messages`` to it. + + .. code-block:: none + + https://:/api/messages + + .. warning:: + + Ensure that URI path of the messaging endpoint matches the ``BOTBUILDER_ENDPOINT`` + setting in your ``/opt/stackstorm/chatops/st2chatops.env`` configuration file. + +Create the bot application manifest zip file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The application manifest is a zip folder of a few files: + +* ``coloricon.png`` - a 96px by 96px png icon of your bot +* ``outlineicon.png`` - a 20px by 20px png icon of your bot +* ``manifest.json`` - a JSON file that describes your bot + +Below is an example of a ``manifest.json`` file. You should copy these contents and +modify them to match your organization. Use the Microsoft App ID you got from the +previous steps to fill in BOTH the ``id`` and ``botId`` values. However, you will NOT +use the Microsoft App password in this file. All information included in this file +will be specific to your deployment of StackStorm. + +.. code-block:: json + + { + "manifestVersion": "1.0", + "version": "1.0", + "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee", + "packageName": "company.division.stackstorm.chatops", + "developer": { + "name": "Company", + "websiteUrl": "https://example.com/Organization/Project", + "privacyUrl": "https://example.com/Organization/Project/blob/master/privacy.md", + "termsOfUseUrl": "https://example.com/Organization/Project/blob/master/terms.md" + }, + "name": { + "short": "StackStorm (bot)", + "full": "StackStorm automation platform" + }, + "description": { + "short": "You can use StackStorm with ChatOps", + "full": "You can use StackStorm to implement ChatOps within your organization!" + }, + "icons": { + "outline": "outlineicon.png", + "color": "coloricon.png" + }, + "accentColor": "#FFFFED", + "bots": [ + { + "botId": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee", + "isNotificationOnly": false, + "scopes": [ + "team", + "personal" + ], + "commandLists":[ + { + "scopes":[ + "team", + "personal" + ], + "commands":[] + } + ] + } + ] + } + +If you know what ChatOps commands StackStorm will support, you can specify them in the +``commandLists`` array. This will allow Teams to display better help information, but +it is not possible to dynamically update this information when new aliases are added +to st2chatops, or when aliases are changed. Due to this limitation, it is probably best +to make this the basic st2chatops/hubot help command (which is ``!help`` by default). + +Here is a snippet of ``commandLists`` from the Orky project: + +.. code-block:: none + + "commandLists":[ + { + "scopes":[ + "team", + "personal" + ], + "commands":[ + { + "title":"add ", + "description":"Adds a bot with the given name." + }, + { + "title":"remove ", + "description":"Removes a bot with the given name." + }, + { + "title":"enable ", + "description":"Enables a bot." + }, + { + "title":"disable ", + "description":"Disables a bot." + }, + { + "title":"copy ", + "description":"Copies a bot and returns the copy key." + }, + { + "title":"paste ", + "description":"Pastes a bot referenced by the copied key." + }, + { + "title":"rename ", + "description":"Renames a bot." + }, + { + "title":"status", + "description":"Shows the status of your bots." + }, + { + "title":"tell ", + "description":"Tells a bot to execute a command." + } + ] + } + ] + +.. warning:: + + Make sure that ``id`` and ``botId`` are the same values! + +Zip all of those files into the root of a zip file: + +.. code-block:: bash + + $ zip manifest.zip manifest.json outlineicon.png coloricon.png + +.. warning:: + + Make sure that the files themselves are located at the root of the zip file and not in + a directory in the zip file root! + +Sideload the application manifest into Microsoft Teams +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. note:: + + - You will need to sideload the application manifest into all teams that use ChatOps. + - You will need to have administrator privileges in your Microsoft Teams tenant to + sideload application manifests. If you do not see the "Upload a custom app" option + then you do not have the correct permissions to sideload a bot application. + +1. Go to the "Teams" tab on the left column, and click a team you wish to sideload to. +2. Click the three horizontal dots next to the team name in the channel list. +3. Select "Manage team", and go to the "Apps" tab in the main pane. +4. At the bottom right of the main pane, click the "Upload a custom app" link. +5. Upload the application manifest file you created previously. + +Configure ``st2chatops.env`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Modify your st2chatops configuration file at ``/opt/stackstorm/chatops/st2chatops.env``. +Uncomment the lines for ``HUBOT_ADAPTER=botframework``, but do NOT change this value. +Also uncomment the lines for ``BOTBUILDER_APP_ID`` and ``BOTBUILDER_APP_PASSWORD``, and +change their values to the Microsoft App ID and password from the previous steps. + +.. warning:: + + Ensure that the ``BOTBUILDER_APP_ID`` is the same as the ``id`` and ``botId`` in your + manifest file. + +If you did not configure the ``/api/messages`` endpoint in your BotFramework configuration, +set the ``BOTBUILDER_ENDPOINT`` to the URI path you used. Set the rest of the options for +Microsoft Teams/BotFramework in ``st2chatops.env``. + +.. warning:: + + If you do not set ``HUBOT_OFFICE365_TENANT_FILTER``, then ALL Office365 tenants will be + able to communicate with your hubot instance if they sideload your application manifest. + +Restart st2chatops +~~~~~~~~~~~~~~~~~~ + +Restart st2chatops with the ``st2ctl`` command: + +.. code-block:: bash + + st2ctl restart-component st2chatops + +Troubleshooting +~~~~~~~~~~~~~~~ + +Troubleshooting the Microsoft Teams adapter is nearly impossible to do directly. You can +use the test client in the configuration webpage of your BotFramework bot to test the +connection from BotFramework to your bot. If your st2chatops logs show messages received +from the web test client in BotFramework, then the issue is between Microsoft Teams and +BotFramework. Double check the values in your application manifest, and remove and +re-upload your manifest (if you changed it). You can also message your bot directly from +within Microsoft Teams, in its own room. From e34841b3246e925db1d102ef048643161ac310f8 Mon Sep 17 00:00:00 2001 From: blag Date: Fri, 29 Mar 2019 11:35:03 -0700 Subject: [PATCH 03/11] Fix some grammar --- docs/source/chatops/aliases.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/chatops/aliases.rst b/docs/source/chatops/aliases.rst index fb60b5a1b..2356fb92a 100644 --- a/docs/source/chatops/aliases.rst +++ b/docs/source/chatops/aliases.rst @@ -370,7 +370,7 @@ Support for other chat providers is coming soon, and of course you are always we contribute! See the example below for hacking on ``extra``. Mattermost and Rocketchat also support the Slack attachments API. However, you will need -to use the ``mattermost`` and ``rocketchat`` keys to ``extra``: +to add both the ``mattermost`` and ``rocketchat`` keys to ``extra``: .. code-block:: yaml From 1eab0492a185ff060e37c399ebfb706debd84986 Mon Sep 17 00:00:00 2001 From: blag Date: Fri, 29 Mar 2019 12:09:31 -0700 Subject: [PATCH 04/11] Use the term 'chat provider' instead of 'chat platform' --- docs/source/chatops/msteams_is_a_diva.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/chatops/msteams_is_a_diva.rst b/docs/source/chatops/msteams_is_a_diva.rst index e44e110d2..0f0674888 100644 --- a/docs/source/chatops/msteams_is_a_diva.rst +++ b/docs/source/chatops/msteams_is_a_diva.rst @@ -2,7 +2,7 @@ Using Microsoft Teams (with BotFramework) ========================================= Configurating st2chatops with Microsoft Teams is **much** more involved than configuring -other chat platforms. +other chat providers. .. note:: Caveats From 5ea2cb4780f28b9712e308e128945d89c9843a41 Mon Sep 17 00:00:00 2001 From: blag Date: Fri, 29 Mar 2019 12:10:00 -0700 Subject: [PATCH 05/11] Add some information regarding Orky --- docs/source/chatops/msteams_is_a_diva.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/source/chatops/msteams_is_a_diva.rst b/docs/source/chatops/msteams_is_a_diva.rst index 0f0674888..bb1a59ffe 100644 --- a/docs/source/chatops/msteams_is_a_diva.rst +++ b/docs/source/chatops/msteams_is_a_diva.rst @@ -232,3 +232,11 @@ from the web test client in BotFramework, then the issue is between Microsoft Te BotFramework. Double check the values in your application manifest, and remove and re-upload your manifest (if you changed it). You can also message your bot directly from within Microsoft Teams, in its own room. + +Here are a few links that may help you troubleshoot: + +* `Hubot issue with configuration steps `_ + +Finally, the `Orky `_ project is very interesting to us, +but as of this writing, the plugin is difficult to configure, some of the code is broken, +and it is exceptionally difficult to debug. From ac6e4cfc548a324052b143ead35315658d189084 Mon Sep 17 00:00:00 2001 From: blag Date: Fri, 29 Mar 2019 12:28:16 -0700 Subject: [PATCH 06/11] Reformat the changes to the alias documentation a bit, and add anchor tags --- docs/source/chatops/aliases.rst | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/source/chatops/aliases.rst b/docs/source/chatops/aliases.rst index 2356fb92a..c49609c2d 100644 --- a/docs/source/chatops/aliases.rst +++ b/docs/source/chatops/aliases.rst @@ -366,11 +366,8 @@ dynamically: color: "{{execution.parameters.color}}" [...] -Support for other chat providers is coming soon, and of course you are always welcome to -contribute! See the example below for hacking on ``extra``. - Mattermost and Rocketchat also support the Slack attachments API. However, you will need -to add both the ``mattermost`` and ``rocketchat`` keys to ``extra``: +to use the ``mattermost`` and ``rocketchat`` keys of ``extra``: .. code-block:: yaml @@ -393,6 +390,11 @@ to add both the ``mattermost`` and ``rocketchat`` keys to ``extra``: color: "{{execution.parameters.color}}" [...] +.. _specifying-multiple-extra-keys-for-different-providers: + +Specifying Multiple ``extra`` Keys For Different Providers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + And you absolutely can specify more than one chat provider in a single alias by using more than one key in ``extra``. This can be useful if you might switch chat providers in the future, or if you are trying to prototype an alias to (for instance) compare and @@ -422,6 +424,11 @@ the best integration with st2chatops). color: "{{execution.parameters.color}}" [...] +Other chat providers also support ``extra``. See the :ref:`example below ` for +hacking on ``extra``. You may also need to dig into the +`source code `_ for +individual adapters to see how to use ``extra`` for your chat provider. + Testing and extending alias parameters ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -432,6 +439,8 @@ on ``hubot-stackstorm`` without having to modify StackStorm source code. For example, you might want to introduce an ``audit`` parameter that would make Hubot log executions of certain aliases into a separate file. You would define it in your aliases like this: +.. _extra-hacking: + .. code-block:: yaml --- From 3280ea92f587c52f1f6b49b0e53e09318784d290 Mon Sep 17 00:00:00 2001 From: blag Date: Fri, 29 Mar 2019 12:29:01 -0700 Subject: [PATCH 07/11] List out all of the chat providers --- docs/source/chatops/chatops.rst | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/docs/source/chatops/chatops.rst b/docs/source/chatops/chatops.rst index b85f86886..0e4e85597 100644 --- a/docs/source/chatops/chatops.rst +++ b/docs/source/chatops/chatops.rst @@ -45,6 +45,40 @@ about what ChatOps means to us, and how it provides real-world value to you. .. _chatops-configuration: +Officially Supported Chat Providers +=================================== + +We officially provide support for the following chat providers with hubot: + +* `Slack `_ +* Microsoft Teams (via `BotFramework `_) +* `Mattermost **version 5** `_ +* `Rocket.Chat `_ +* `Cisco Spark `_ + +Since +`HipChat is being discontinued `_, +official support for the `HipChat adapter `_ will end when +HipChat reaches end-of-life (as of this writing, this is planned for June 30th, 2020), and it will be +completely removed **without any deprecation period** from the st2chatops project once HipChat itself +is terminated. Administrators of local HipChat servers should **already** be actively migrating to +other chat providers. + +For help migrating between chat providers, please see the section on +:ref:`specifying multiple extra keys for different providers ` +for some ideas on how to ease the transition between HipChat and another chat provider. + +Officially Unsupported Chat Providers +===================================== + +We do not provide support for the following adapters, but they are still bundled in the +st2chatops package, can be configured in ``st2chatops.env``, and still work (as far as we +know). + +* `Flowdock `_ +* `XMPP `_ +* `IRC `_ + Configuration ============= From 1f824f9f4dfca77ffce5d0d23e4bb070046934d0 Mon Sep 17 00:00:00 2001 From: blag Date: Fri, 29 Mar 2019 12:31:16 -0700 Subject: [PATCH 08/11] Add a note about configuring Microsoft Teams/BotFramework and link to that doc page --- docs/source/chatops/chatops.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/source/chatops/chatops.rst b/docs/source/chatops/chatops.rst index 0e4e85597..dafe9ca6c 100644 --- a/docs/source/chatops/chatops.rst +++ b/docs/source/chatops/chatops.rst @@ -82,6 +82,13 @@ know). Configuration ============= +.. note:: Microsoft Teams + + Configuring st2chatops with Microsoft Teams is a more involved process. Please see + `our documentation ` specifically for that chat provider. + All other chat providers can be configured in ``st2chatops.env`` with the instructions + below. + Package-based Install ~~~~~~~~~~~~~~~~~~~~~ From 3615677589913827909d9cba07c66c24a1fb5f93 Mon Sep 17 00:00:00 2001 From: blag Date: Fri, 29 Mar 2019 12:32:00 -0700 Subject: [PATCH 09/11] Add links to helpful resources for configuring Microsoft Teams and BotFramework --- docs/source/chatops/msteams_is_a_diva.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/source/chatops/msteams_is_a_diva.rst b/docs/source/chatops/msteams_is_a_diva.rst index bb1a59ffe..84ed84885 100644 --- a/docs/source/chatops/msteams_is_a_diva.rst +++ b/docs/source/chatops/msteams_is_a_diva.rst @@ -175,6 +175,10 @@ Zip all of those files into the root of a zip file: Make sure that the files themselves are located at the root of the zip file and not in a directory in the zip file root! +The Orky project has a complete +`example manifest.json file `_ +you can take a look at for more information. + Sideload the application manifest into Microsoft Teams ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -191,6 +195,10 @@ Sideload the application manifest into Microsoft Teams 4. At the bottom right of the main pane, click the "Upload a custom app" link. 5. Upload the application manifest file you created previously. +Please see the +`official documentation `_ +for more information on how to sideload an app package to Microsoft Teams. + Configure ``st2chatops.env`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -235,7 +243,18 @@ within Microsoft Teams, in its own room. Here are a few links that may help you troubleshoot: +* `ngrok.com `_ - tunnels an HTTP/HTTPS ``ngrok.io`` URL to your local + machine, useful for debugging what requests are coming from BotFramework +* `Documentation for the BotFramework-Hubot adapter `_ * `Hubot issue with configuration steps `_ +* A complete + `example of manifest.json `_ + for your bot application manifest JSON file to include the in your bot application manifest + zip file. +* `Official Microsoft documentation for uploading an app package to Teams `_ +* `Documentation for Orky `_ - + you will NOT use Orky itself, but it does have instructions for configuring a + BotFramework bot and creating a bot application manifest Finally, the `Orky `_ project is very interesting to us, but as of this writing, the plugin is difficult to configure, some of the code is broken, From b628636c9ac89f15793b4b8f1b89601d000fa79b Mon Sep 17 00:00:00 2001 From: blag Date: Fri, 29 Mar 2019 12:47:33 -0700 Subject: [PATCH 10/11] Use msteams.rst --- docs/source/chatops/chatops.rst | 2 +- docs/source/chatops/index.rst | 2 +- docs/source/chatops/{msteams_is_a_diva.rst => msteams.rst} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename docs/source/chatops/{msteams_is_a_diva.rst => msteams.rst} (100%) diff --git a/docs/source/chatops/chatops.rst b/docs/source/chatops/chatops.rst index dafe9ca6c..257fd6cd0 100644 --- a/docs/source/chatops/chatops.rst +++ b/docs/source/chatops/chatops.rst @@ -85,7 +85,7 @@ Configuration .. note:: Microsoft Teams Configuring st2chatops with Microsoft Teams is a more involved process. Please see - `our documentation ` specifically for that chat provider. + :doc:`our documentation ` specifically for that chat provider. All other chat providers can be configured in ``st2chatops.env`` with the instructions below. diff --git a/docs/source/chatops/index.rst b/docs/source/chatops/index.rst index 81b7ebe44..346215e5c 100644 --- a/docs/source/chatops/index.rst +++ b/docs/source/chatops/index.rst @@ -50,7 +50,7 @@ Interested in learning more? Here are some things to get you started on your voy :maxdepth: 1 chatops - Configuration for Microsoft Teams + Configuration for Microsoft Teams Action Aliases notifications Pack Deployment diff --git a/docs/source/chatops/msteams_is_a_diva.rst b/docs/source/chatops/msteams.rst similarity index 100% rename from docs/source/chatops/msteams_is_a_diva.rst rename to docs/source/chatops/msteams.rst From 5998c15a527cce5aa2a10e48fd5ce75d04de8c78 Mon Sep 17 00:00:00 2001 From: blag Date: Fri, 29 Mar 2019 14:46:53 -0700 Subject: [PATCH 11/11] Fix some formatting --- docs/source/chatops/chatops.rst | 2 +- docs/source/chatops/msteams.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/chatops/chatops.rst b/docs/source/chatops/chatops.rst index 257fd6cd0..d460d5463 100644 --- a/docs/source/chatops/chatops.rst +++ b/docs/source/chatops/chatops.rst @@ -52,7 +52,7 @@ We officially provide support for the following chat providers with hubot: * `Slack `_ * Microsoft Teams (via `BotFramework `_) -* `Mattermost **version 5** `_ +* `Mattermost version 5 `_ * `Rocket.Chat `_ * `Cisco Spark `_ diff --git a/docs/source/chatops/msteams.rst b/docs/source/chatops/msteams.rst index 84ed84885..9829598b5 100644 --- a/docs/source/chatops/msteams.rst +++ b/docs/source/chatops/msteams.rst @@ -4,7 +4,7 @@ Using Microsoft Teams (with BotFramework) Configurating st2chatops with Microsoft Teams is **much** more involved than configuring other chat providers. -.. note:: Caveats +.. note:: **Caveats** * There are multiple hubot adapters for Microsoft Teams and/or BotFramework. Only two of them (that we found) are production quality, and only the