Logging - A Primer

Logging is the primary user interface for supporting and troubleshooting your system. It is critical that you get it right. I know this because I have gotten it wrong often enough. If you move to microservice architectures and containers, the criticality only increases because errors and anomalies are as distributed as your runtime. Here are some opinionated recommendations about how to not get it wrong. Do not create your own logging framework. Read more...

Jenkins - Read Labels From ECR Images

I’ve been working on converting some of our Java based applications to run in Docker containers in an AWS ECS cluster. With our existing pipelines for these applications, we store metadata from the build as properties on the build artifact in Artifactory. This includes information like the git revision associated with the build, the branch it was pulled from, etc etc. In our transition to Docker, we aren’t using Artifactory for image storage. Read more...

Local First Development

If pressed to define how I approach programming, the words “pragmatic essentialism” will be used at some point. Do what works and make it as simple as possible to get the job done across time. This manifests itself in various ways in my day-to-day work. One of the rules I try to hold to is that the set up of a project for development should be as localized as possible. Read more...

Running Jenkins in Docker on AWS or a Mac

I’ve been working on a Jenkins image that will run in AWS. At the risk of going full Inception in the opening paragraph, I want the Jenkins container running in Docker to be able to run Docker commands. Running Docker inside Docker is a possibility but the author of the feature has other suggestions for this use case. So I want the running Jenkins container to be able to access Docker running on the host machine. Read more...

The Metaphors We Build By

The practice of software development is frequently described in terms of metaphors. The point being to establish a non-obvious connection or analogy between the creation of abstract logical structures executed by computers and other pursuits that are somehow similar. Metaphors are powerful cognitive constructs by which two words or ideas are linked by association or identity even if they seem dissimilar. When Shakespeare said “all the world’s a stage”, he was using metaphor. Read more...

Flask on Shared Hosting

In the course of experimenting with Python and Flask, I decided I wanted to deploy a Flask-based Rest API to the hosting provider that I use. I admit, this is not nearly so cool and modern as using a Docker container or hosting it as a Serverless Lambda app in AWS. Since I am already paying for this web site, however, deploying it into my existing shared hosting account means it costs me nothing extra. Read more...

Visual Studio Code, Python and pipenv

I’ve been doing some experimenting with pipenv to simplify my nascent Python programming workflows and also with Visual Studio Code as a cross-platform code editor. So naturally I want VS Code to use the python version from my pipenv-based virtual environment (as one does). I also want the compiled .pyc files to not show up in the explorer view. Fortunately, both of these things can be accomplished by overriding some default VS Code settings. Read more...

Hugo Site Automation

This site is built with a static site generator called Hugo. It works well for what I’m trying to do and it’s more secure and faster than a CMS. Since I’m a big proponent of continuous delivery and project automation, it seemed only right to get the site update running in a pipeline on every commit to master. This post outlines that process. Caveats This isn’t a Hugo tutorial. There’s plenty of information on the Hugo web site that I’m not going to cover here. Read more...