Setting up your Maven settings.xml
to release a Jenkins plugin (1 mins read).
How to set up your crdentials to release a Jenkins plugin via Maven.
Setting up your Maven settings.xml
to release a Jenkins plugin (1 mins read).
How to set up your crdentials to release a Jenkins plugin via Maven.
Removing ANSI escape codes in Vim (1 mins read).
How to remove ANSI escape codes in (Neo)Vim.
Creating global middleware for net/http
servers in Go (1 mins read).
How to wrap net/http
servers in Go with middleware(s) on every request.
What Go versions are my modules and dependencies targeting? (1 mins read).
Without using go mod vendor
, how you can look at the version of Go that each of your modules and dependencies target.
Why is Go trying to upgrade my go.mod
to Go 1.21? (1 mins read).
Why you may be seeing Go trying to upgrade the Go version in your go.mod
to Go 1.21.
Creating a Zoho Mail alias using the API (2 mins read).
How to use the Zoho Mail API to add an alias to your account.
Setting up Mend Renovate Community Edition for GitLab.com on Fly.io (2 mins read).
How to set up Mend Renovate Community Edition on Fly.io, when integrating with GitLab.com.
Custom Advisories: the unsung hero of dependency-management-data (3 mins read).
How to use custom advisories with dependency-management-data to track packages that your organisation may not want to use.
Turning on Caps Lock when the Caps Lock key is bound to a different key (1 mins read).
How to trigger a Caps Lock event when you've rebound the key to a differnet key.
Setting up real-time Slack notifications for GitHub (1 mins read).
How to get Slack's real-time notifications integrated with GitHub.
Managing Buildkite Agent Images with Renovate (1 mins read).
How to use Renovate to manage Buildkite Agent Images.
Running commands against every module in a Go multi-module project (1 mins read).
How to run commands like go test
when using a multi-module Go project.
Resolving Timeout
s when generating entropy when generating a new GPG key (1 mins read).
How I resolved an issue with a Timeout
error when generating a new GPG key.
Resolving black screen display with SDDM and NVIDIA GPUs (1 mins read).
How I resolved an issue with a black screen displaying when SDDM is used with an NVIDIA driver.
Analysing GitHub Pull Request review times with SQLite and Go (3 mins read).
How measuring how long code review took as a team lead to being able to change our processes, and then deliver much more effectively.
Getting started with Dependency Management Data (4 mins read).
How you can get started using Dependency Management Data in 3 commands.
Quantifying your reliance on Open Source software (24 mins read).
A writeup of my talk at DevOpsNotts, about the dependency-management-data project and how to use it to understand your internal and external dependencies.
LeadDev London 2023 (59 mins read).
A writeup of LeadDev London 2023 conference.
Merging a branch in GitHub - the hard way (4 mins read).
How to (kinda) merge two branches in GitHub using the underlying Git database API.
Validating Renovate configuration changes before merging (2 mins read).
How to perform a dry run to validate your Renovate config before it's merged.
Introducing dmd-web
, a web frontend for Dependency Management Data (DMD) (2 mins read).
Introducing a web frontend for the dependency-management-data project, to provide a better, centralised interface for interacting with the data.
Sharing state between net/http
method calls in Go (1 mins read).
How to construct a struct
in Go that can have its state shared between HTTP server handler functions.
Who do these Google (JSON file) credentials belong to? (1 mins read).
Given a JSON credentials file for Google APIs, are they still valid?
I'm joining Elastic (9 mins read).
Announcing my move to Elastic as a Senior Software Engineer, and looking back at my time at Deliveroo.
Using go.mod
versions to go install
a binary (1 mins read).
How to use go install
to install a binary from the version tracked in go.mod
.
Checking the migration status with golang-migrate
(1 mins read).
How to check what version of the schema is curently applied when using golang-migrate
.
Introducing openapi-sorbet
, a command-line tool for generating Sorbet types from OpenAPI (2 mins read).
How to generate Sorbet type-checked models from OpenAPI specifications.
Learn how to build tools (6 mins read).
A guest post on Letters to a New Developer about learning to automate and build tools to progress in your career.
Getting a --version
flag for Cobra CLIs in Go (2 mins read).
How to get Cobra to provide a --version
flag.
Performing downtime-inducing AWS RDS changes with no downtime☆ (2 mins read).
How to limit your downtime to seconds, instead of minutes, when performing downtime-inducing changes with AWS RDS.
The Lazy engineer's guide to running your Go web application to AWS Lambda (4 mins read).
How to take a Go web application and move it to AWS Lambda with two lines of code.
Which OS and CPU architecture is this binary compiled for? (4 mins read).
How to use Go to parse an arbitrary executable to work out the Operating System and CPU architecture it's compiled for.
Creating an HTTP 404 handler for Go net/http
servers (2 mins read).
How to add a catch-all 404 handler when writing HTTP servers with Go's net/http
server.
Serving the current directory over HTTP with Go (1 mins read).
How to use Go's standard library to serve the current directory over HTTP.
Getting the commit author details for a GitHub App account (1 mins read).
How to retrieve the git commit author details for a given GitHub App.
Generating Equal
methods for Go structs with goderive
(3 mins read).
How to use goderive
to generate an Equal
method between structs, so you don't have to.
Checking if files are synced between repos with GitHub Actions (2 mins read).
Creating a GitHub Action workflow to indicate when vendored files are out-of-sync between GitHub repos.
I don't think I want my next promotion (yet) (5 mins read).
Taking a second to pause and think about what Staff Engineer means to me, and why (right now) I may be looking to stay happy at Senior Engineer.
Working out which Docker namespaces and images you most depend on (2 mins read).
How to use dependency-management-data to visualise the most popular Docker namespaces and images you depend on.
Querying JSON with SQLite (1 mins read).
How to use json_each
and json_extract
to query a JSON field in SQLite.
Dynamically retrieving the version of a Node.JS/Typescript dependency, at runtime (1 mins read).
How to retrieve metadata about packages that are depended on at runtime.
Automating boilerplate/scaffolding code with custom code generation in Go, with jen
(3 mins read).
How to generate Go code using github.com/dave/jennifer
.
Debugging HTTP Client requests with Go (2 mins read).
How to add debug logging to http.Client
in Go.
Who do these Twilio credentials belong to? (2 mins read).
How to work out whether arbitrary Twilio credentials are valid, and if so, what type they are.
Getting a --version
flag for Cobra CLIs in Go, built with GoReleaser (2 mins read).
How to get Cobra to provide a --version
flag when using GoReleaser.
Cross-compiling a CGO project using Goreleaser (2 mins read).
How to use goreleaser-cross
to cross-compile a Go command-line tool.
Introducing dmd
, a command-line tool for Dependency Management Data (DMD) (2 mins read).
Introducing a command-line tool for better interacting with databases for managing dependency management data.
Getting a GitHub App installation token on the command-line (2 mins read).
How to get a GitHub App installation token (using Typescript) for a given installation.
Passing a private key as an environment variable (1 mins read).
How to convert a PEM-encoded private key in a form to be stored in an environment variable.
Listing the status of your branch protection in GitHub (1 mins read).
Creating a command-line Go tool to list the branch protection status of your repositories.