Skip to content

Commit

Permalink
chore: split pre-commit tool image from devcontainer
Browse files Browse the repository at this point in the history
  • Loading branch information
rcwbr committed Jan 28, 2025
1 parent 160a1a5 commit 0b21304
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 22 deletions.
2 changes: 2 additions & 0 deletions .devcontainer/devcontainer-bake.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ variable "devcontainer_layers" {
default = [
"docker-client",
"useradd",
"pre-commit-base",
"pre-commit-tool-image",
"pre-commit"
]
}
Expand Down
4 changes: 3 additions & 1 deletion .devcontainer/initialize
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,6 @@ devcontainer_definition_files_arr=(
DEVCONTAINER_DEFINITION_FILES="${devcontainer_definition_files_arr[*]}"
export DEVCONTAINER_DEFINITION_FILES
export DEVCONTAINER_BUILD_ADDITIONAL_ARGS="$*"
curl https://raw.githubusercontent.com/rcwbr/devcontainer-cache-build/0.4.0/devcontainer-cache-build-initialize | bash
# curl https://raw.githubusercontent.com/rcwbr/devcontainer-cache-build/0.4.0/devcontainer-cache-build-initialize | bash
# DEVCONTAINER_CACHE_BUILD_IMAGE=ghcr.io/rcwbr/devcontainer-cache-build:19-fix-handling-of-empty-target-outputs-b4767c26dfddada604ed9539bddc5d4c47042ad4
curl https://raw.githubusercontent.com/rcwbr/devcontainer-cache-build/test/19/devcontainer-cache-build-initialize | bash # TODO revert
3 changes: 1 addition & 2 deletions devcontainer-bake.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,5 @@ target "layer" {
}

group "default" {
// Target the last layer as default
targets = [devcontainer_layers[length(devcontainer_layers) - 1]]
targets = devcontainer_layers
}
20 changes: 3 additions & 17 deletions pre-commit/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
# hadolint ignore=DL3006
FROM common_context AS common_context

# Set base_context in the downstream Bake file
# hadolint ignore=DL3006
FROM base_context
ARG USER=root
# Assume root role for installs
# Act as root in this image
USER root
# Install git (if not already available) to spoof pre-commit environment
SHELL [ "/bin/bash", "-c" ]
Expand All @@ -23,19 +19,13 @@ RUN DEBIAN_FRONTEND=noninteractive \

# Prep folder for pre-commit
ENV DEVCONTAINER_PRE_COMMIT=/opt/devcontainers/pre-commit
RUN \
mkdir -p "$DEVCONTAINER_PRE_COMMIT" \
&& chmod a+rx "$DEVCONTAINER_PRE_COMMIT" \
&& chown -R $USER:$USER "$DEVCONTAINER_PRE_COMMIT"
# Apply spoof pre-commit executable
COPY pre-commit/pre-commit /usr/local/bin
USER ${USER}
# Create a temp repo and install the hooks from the config
# Load the config file from the downstream context
# hadolint ignore=DL3003,SC1091
RUN \
--mount=type=bind,from=local_context,source=.pre-commit-config.yaml,target=/tmp/.pre-commit-config.yaml \
python -m venv "$DEVCONTAINER_PRE_COMMIT/venv" \
mkdir -p "$DEVCONTAINER_PRE_COMMIT" \
&& python -m venv "$DEVCONTAINER_PRE_COMMIT/venv" \
&& source "$DEVCONTAINER_PRE_COMMIT/venv/bin/activate" \
&& mkdir "$DEVCONTAINER_PRE_COMMIT/tmp_repo" \
&& cd "$DEVCONTAINER_PRE_COMMIT/tmp_repo" \
Expand All @@ -45,7 +35,3 @@ RUN \
&& pre-commit install-hooks \
&& cd "$DEVCONTAINER_PRE_COMMIT" \
&& rm -rf "$DEVCONTAINER_PRE_COMMIT/tmp_repo"

COPY --from=common_context on_create_command /opt/devcontainers/on_create_command
# Include pre-commit initialization in config for devcontainers onCreateCommand
COPY pre-commit/on_create_command /opt/devcontainers/on_create_command
15 changes: 15 additions & 0 deletions pre-commit/caller.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# hadolint ignore=DL3006
FROM common_context AS common_context

# hadolint ignore=DL3006
FROM base_context
ARG USER=root
USER $USER
ARG DEVCONTAINER_PRE_COMMIT_IMAGE
# Burn the pre-commit image ref into the image for use in the caller script
ENV DEVCONTAINER_PRE_COMMIT_IMAGE=$DEVCONTAINER_PRE_COMMIT_IMAGE
# Apply pre-commit caller executable
COPY pre-commit/pre-commit /usr/local/bin
COPY --from=common_context on_create_command /opt/devcontainers/on_create_command
# Include pre-commit initialization in config for devcontainers onCreateCommand
COPY pre-commit/on_create_command /opt/devcontainers/on_create_command
28 changes: 27 additions & 1 deletion pre-commit/devcontainer-bake.hcl
Original file line number Diff line number Diff line change
@@ -1,14 +1,40 @@
variable "USER" {
default = "root"
}
variable "DEVCONTAINER_REGISTRY" {
default = ""
}
variable "DEVCONTAINER_IMAGE" {
default = ""
}
variable "PRE_COMMIT_TOOL_IMAGE" {
default = "type=registry,name=${DEVCONTAINER_REGISTRY}:${DEVCONTAINER_IMAGE}-pre-commit"
}

target "pre-commit" {
target "pre-commit-base" {
dockerfile-inline = "FROM base_context"
}

target "pre-commit-tool-image" {
dockerfile = "pre-commit/Dockerfile"
contexts = {
local_context = BAKE_CMD_CONTEXT
base_context = "target:pre-commit-base"
}
output = ["${PRE_COMMIT_TOOL_IMAGE}"]
}

target "pre-commit" {
dockerfile = "pre-commit/caller.Dockerfile"
contexts = {
local_context = BAKE_CMD_CONTEXT
common_context = "common"
base_context = "target:pre-commit-base"
// Tool context is unused; referenced only to establish it as a dep
tool_context = "target:pre-commit-tool-image"
}
args = {
USER = "${USER}"
DEVCONTAINER_PRE_COMMIT_IMAGE = "${PRE_COMMIT_TOOL_IMAGE}"
}
}
18 changes: 17 additions & 1 deletion pre-commit/pre-commit
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
#!/bin/bash

PATH="$DEVCONTAINER_PRE_COMMIT/venv/bin:$PATH" "$DEVCONTAINER_PRE_COMMIT/venv/bin/pre-commit" "$@"
set -e

export PRE_COMMIT_ARGS=($@)
docker run \
--rm \
-it \
--name pre-commit \
--user root \
--entrypoint bash \
-v "$(pwd):$(pwd)" \
-w "$(pwd)" \
-e DEVCONTAINER_PRE_COMMIT \
-e PRE_COMMIT_ARGS \
"$DEVCONTAINER_PRE_COMMIT_IMAGE" \
-c 'git config --global --add safe.directory "$(pwd)" && PATH="$DEVCONTAINER_PRE_COMMIT/venv/bin:$PATH" "$DEVCONTAINER_PRE_COMMIT/venv/bin/pre-commit" "${PRE_COMMIT_ARGS[@]}"'

sudo chown -R $USER:$USER $(pwd)

0 comments on commit 0b21304

Please sign in to comment.