Deliver with Attitude
Lessons from Pied Piper’s Resident Satanist
If you’re unfamiliar with the HBO show Silicon Valley, the references in this post may not make sense. But hopefully the code will.
In HBO’s Silicon Valley, Canadian Satanist Bertram Gilfoyle is responsible for getting code to production at Pied Piper.
Gilfoyle believes in automation. He once harnessed a rack to hack into a fridge. He values targeted alerts. He rigged up a notification system to help with his recently developed interest in Bitcoin mining.
Imagine what he could do with total control of Pied Piper’s delivery flow, and the ability to respond to events such as commit, build and deploy, with complete information at his fingertips. Imagine Gilfoyle empowered by Atomist.
Gilfoyle: I’ve been writing sub-par code for 48 hours and I want to kill myself. How do you do it every day Dinesh?
Dinesh: I’ve also been writing bullshit code for 48 hours… and want you to kill yourself.
Gilfoyle is in eternal battle with Dinesh Chugtai, Pied Piper’s other key engineer. His first priority would be to embarrass Dinesh by playing an objectionable sound whenever he pushes code. (“Your shame is my paradise.”) Running an Atomist software delivery machine, Gilfoyle could do this with a little TypeScript or JavaScript, affecting all projects instantly.
softwareDeliveryMachine.addPushReactions({
name: "NapalmDeath",
pushTest: pushTest("IsFromDinesh",
async p => p.push.after.committer.login === "dinesh"),
action: youSuffer,
});
A software delivery machine offers an API making it trivial to subscribe to important events concerning a team. This one is a push reaction. It’s invoked on a push to any project in the organization, with access to the full context: the current and previous state of the code, the committer and their identity in other systems; and the chat channels where people care about this repository.
Having access to the full power of Node.js would allow Gilfoyle to unleash his full creativity to do anything from play a sound to hacking the NSA. The youSuffer
function referenced above would play the song You Suffer, for example by calling the API of a Sonos server.
Should Dinesh break the build, Gilfoyle would gloat and want everyone to know. He could automate this by subscribing to a similar event:
softwareDeliveryMachine.addBuildListeners(async b => {
if (b.build.status === BuildStatus.failed &&
b.build.push.after.committer.login === "dinesh") ...
})
Gilfoyle is exceedingly vain. He’d want to trumpet his own commits. (“It’s talent and sweat”). All events make it easy to post to any Slack channels linked to the repository:
softwareDeliveryMachine.addPushReactions({
name: "HailGilfoyle",
pushTest: pushTest("IsFromGilfoyle",
async p => p.push.after.committer.login === "gilfoyle"),
action: p =>
p.addressChannels("https://my.assets/gloating_gilfoyle.jpg")
});
Gilfoyle’s greatest joy in life is trolling Dinesh. Atomist would make it trivial for him to insult Dinesh via Slack DM whenever Dinesh creates a repository:
softwareDeliveryMachine.addNewRepoWithCodeActions(async ri => {
if (ri.push.after.committer.login === "dinesh")
return ri.context.messageClient.addressUsers(
"More garbage from Dinesh :see_no_evil:",
"dinesh");
});
“There is no good and evil, only self.” Gilfoyle is lazy. Atomist would enable him to close any issue assigned to him with an appropriate insult:
softwareDeliveryMachine
.addNewIssueListeners(closeIssueAssignedToMe)
.addUpdatedIssueListeners(closeIssueAssignedToMe);
The closeIssueAssignedToMe
function uses the GitHub API to close the issue, appending a picture of Gilfoyle to its body:
async function closeIssueAssignedToMe(i: IssueListenerInvocation) {
if (i.issue.state === "open" &&
i.issue.assignees.some(a => a.login === "gilfoyle")) {
const newBody = (i.issue.body || "") +
"_Our process sucks. Your inability to stop us from sucking is a failure of leadership._\n\n" +
`\n<img height='225' width='400' src=\"https://my.assets/giloyle-phone.jpg\"/>`;
updateIssue(i.credentials, i.id, i.issue.number, {
title: i.issue.title,
body: newBody,
state: "closed",
});
}
}
Assigning an issue to Gilfoyle in any project now results in this:
Gilfoyle: I make sure that one bad config on one key component doesn’t bankrupt the entire company. That’s what I do.
“I don’t trust anyone. It’s a huge part of my belief system.” Atomist could help Gilfoyle automate such checks and consider the latest commit, so he has more time to spend pursuing the freedoms granted by his commitment to LaVeyan Satanism. Atomist reviewers (essentially, push listeners with a structured return type) would allow him to look inside projects and observe their state after each push. The following will ensure that Spring Boot configuration doesn’t hard code the server port, a 12 factor violation that makes apps difficult to manage in the cloud:
softwareDeliveryMachine.addReviewerRegistrations(
patternMatchReviewer(
"server-port",
{globPattern: "src/main/resources/**.properties", severity: "info"},
{
name: "Harcoded server port",
antiPattern: /server\.port=\d+/,
comment: "Don't hardcode server port. Not 12 factor",
},
);
These examples show the power of an automation hub, which enables a single code change to affect all projects instantly, and reduces the marginal cost of adding a new automation. They show the power of an integrated model. The Atomist API for software provides a domain model for common events and makes it possible to customize every part of the delivery process to reflect your team’s preferences. These examples are only possible with a correlated model of the things that matter to a team, such as builds, pushes, commits, committers’ identities in Slack and others systems. They show how valuable it is to be able to develop our development experience using a full-featured programming language. Traditional tools oriented around YAML and Bash cannot deliver such functionality easily or elegantly.
We believe Atomist’s novel approach can bring delivery and team productivity to a new level. Our software delivery machine framework is here, and an example machine is here. A more comprehensive discussion is here.
We should let Gilfoyle have the last word:
People like to lie... It’s a war of all against all. The history of humanity is a book written in blood. We’re all just animals in a pit.