Skip to content

Instantly share code, notes, and snippets.

View gcr_repo_digest.bzl
load("@io_bazel_rules_docker//container:providers.bzl", "BundleInfo", "ImageInfo")
load("//deployment/docker:image_name.bzl", "image_name")
load(":providers.bzl", "DigestInfo", "RepoInfo")
def _bundle_impl(target, ctx):
bundle_info = target[BundleInfo]
return RepoInfo(image_digests = {
image_name(bundle_info, x[ImageInfo]): x[DigestInfo]
for x in ctx.rule.attr.image_targets
NathanHowell / BUILD
Last active May 19, 2020
Seal Python with a VirtualEnv toolchain
load("@rules_python//python:defs.bzl", "py_runtime", "py_runtime_pair")
load(":venv.bzl", "py_venv")
load(":wrapper.bzl", "py_wrapper")
name = "py3_venv",
# caching the venv interpreter doesn't work for two reasons:
# * there are no platform dependencies on this target: the cache will contain binaries for the wrong OS
# * there are no dependencies on the interpreter binary or standard library: the cache may contain stale versions
NathanHowell / Dockerfile
Created Feb 13, 2020
lightweight pubsub emulator image
View Dockerfile
FROM alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45 AS build
RUN apk add --no-cache ca-certificates curl python3
RUN curl${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz \
| tar xzf -
RUN /google-cloud-sdk/ \
--bash-completion=false \
--override-components beta pubsub-emulator \
--path-update=false \
NathanHowell / gist:5435345
Last active Feb 10, 2020
Simple Warp server that can be gracefully shutdown over HTTP.
View gist:5435345
{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import Control.Concurrent (forkIO)
import Control.Concurrent.STM
import Control.Monad (when)
import Control.Monad.Trans (liftIO)
import Network.HTTP.Types
import Network.Wai as Wai
NathanHowell / BUILD
Last active Jan 29, 2020
How to push a bundle of images in parallel
load("@io_bazel_rules_docker//container:bundle.bzl", "container_bundle")
load("@io_bazel_rules_docker//container:image.bzl", "container_image")
load("@io_bazel_rules_docker//contrib:push-all.bzl", _push_bundle = "docker_push")
name = "my_first_image",
NathanHowell / settings.gradle
Created Jun 25, 2019
Example settings.gradle to dynamically derive projects from build.gradle files
View settings.gradle
// find all build.gradle files in the expected locations in the build tree
.matching {
exclude '**/src/**', '**/build/**', '**/.*'
include '**/build.gradle'
.each {
// then convert the file path to a project path
final relative = rootProject.projectDir.relativePath(it.parentFile)
final project = ":${relative.replace('/', ':')}"
NathanHowell /
Last active Oct 31, 2018
KinesisIO using Splittable DoFn (SDF) and the V2 Kinesis API (HTTP/2 push)
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
NathanHowell / pb.hs
Created May 20, 2012
Protocol Buffers via GHC Generics
View pb.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE ScopedTypeVariables #-}

Keybase proof

I hereby claim:

  • I am nathanhowell on github.
  • I am nathanhowell ( on keybase.
  • I have a public key ASC5cgtZMOLRHjV1qLg1TtuAv8xI1wjwmwqhvv9eUn7ybAo

To claim this, I am signing this object:

NathanHowell / Dockerfile
Created Jul 28, 2017
Example of multistage Docker build for grpc
View Dockerfile
FROM alpine:3.6 AS base
RUN apk add --no-cache python3 ca-certificates tzdata tini \
&& apk upgrade --no-cache
FROM base AS build
RUN apk add --no-cache \
python3-dev \
cython \
You can’t perform that action at this time.