Automating project setup using Slack and NodeJS

Neil Osmond

One of the most tedious parts of a developer's or project manager's life is setting up a new project, you have to:

  • Create your git repository (we use bitbucket here at Technology Studio towers)
  • Create azure websites to deploy your dev and live sites to
  • Create a teamcity project, integrate git and add your builds
  • Create a Slack room (more about that below)

We love using Slack for our internal messaging (OK, OK, for sending memes to each other) so we wondered how we could integrate project setup with Slack. The advantage of this approach is that anybody could do it (it doesn't rely on a developer or someone with knowledge of the above services), all of our tooling and integration is in one place and it's self documented.

Slash Commands

We had a number of integration options when considering how to do this through Slack:

  • Webhooks
  • A custom plugin
  • Slash commands

We decided to use Slash commands as we can setup multiple commands under the same configured integration, we're all accustomed to using such commands for things like Hangouts and Giphy, and it's quick and easy to get an integration setup. A slash command has two elements:

  • The command - a command is made up of two parts - the command name and further text
  • A URL - a URL that is requested when somebody runs the slash command.

Our project setup slash command looks a bit like this:

/project-setup [ProjectName] [Services (azure,bitbucket,slack,teamcity)]

It takes in two commands:

  • ProjectName - The name of the new project, this is used for the Azure website names, the Bitbucket repo name, the Slack channel name and the Teamcity project.
  • Services - A comma delimited list of the services to setup:

Where the wild things live

They live in a Node script hosted on azure in case you're wondering.

The real magic happens in the URL that the above slash command is requesting. We decided to implement our script in Node because we love Javascript here at Earthware and it's easy and quick to develop and deploy without the need for compilation. The following URL receives the following parameters from Slack:

  • token=gIkuvaNzQIHg97ATvDxqgjtO
  • team_id=T0001
  • team_domain=example
  • channel_id=C2147483705
  • channel_name=test
  • user_id=U2147483697
  • user_name=Steve
  • command=/weather
  • text=94070

We're just interested in the token so we can make sure the request is from Slack and the text so we can pull out the two arguments specified above.

The script takes the two arguments from the Slash command and uses different npm packages and webservices to do the wild things. Below are a list of the tools/webservices we used for each service:

  • We set up the azure websites using the azure-asm-website npm package.
  • Bitbucket have an awesome REST API that we consumed using the request npm package.
  • Slack have an equally nice API that we bearly scratched the service of
  • Teamcity have an API with a mind blogging amount of documentation

We'll be blogging in further detail about these tasks in the near future.

What's missing?

We would have loved to have setup our JIRA project and Confluence space but their API doesn't currently allow for this.

What else are we missing? Get in touch and let us know.

Can't wait to find out more? Then get in touch to join in with the fun or get in touch if you want us to get your project setup.

Header image via imgflip.com/memegenerator.