diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 32db3a4..17f7bf6 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -14,6 +14,7 @@ jobs: matrix: features: - circleci-cli + - deno-cache - exercism-cli baseImage: - debian:latest diff --git a/src/deno-cache/NOTES.md b/src/deno-cache/NOTES.md new file mode 100644 index 0000000..754bb96 --- /dev/null +++ b/src/deno-cache/NOTES.md @@ -0,0 +1,6 @@ +# Deno Cache + +Setup the [deno cache](https://jsr.io/@deno/cache-dir) as a volume. + +Intended for usage with the `denoland/deno:debian` docker image. Otherwise, +will create a `deno` group with read-write permissions on the cache directory. diff --git a/src/deno-cache/devcontainer-feature.json b/src/deno-cache/devcontainer-feature.json new file mode 100644 index 0000000..69273fb --- /dev/null +++ b/src/deno-cache/devcontainer-feature.json @@ -0,0 +1,25 @@ +{ + "id": "deno-cache", + "name": "Deno cache setup", + "version": "0.1.0", + "containerEnv": { + "DENO_DIR": "/deno-dir" + }, + "options": { + "username": { + "description": "Add the 'deno' group to the given non-root user. Defaults to the value of `remoteUser`.", + "default": "automatic", + "type": "string" + } + }, + "mounts": [ + { + "source": "deno-cache-${devcontainerId}", + "target": "/deno-dir", + "type": "volume" + } + ], + "installsAfter": [ + "ghcr.io/devcontainers/features/common-utils" + ] +} diff --git a/src/deno-cache/install.sh b/src/deno-cache/install.sh new file mode 100644 index 0000000..0925567 --- /dev/null +++ b/src/deno-cache/install.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -e + +GROUP=deno + +echo "Creating cache directory: $DENO_DIR" +mkdir --parents "$DENO_DIR" + +echo "Creating user group: $GROUP" +groupadd --force --key GID_MIN=1993 "$GROUP" + +echo "Assigning group to cache directory..." +chgrp --changes --recursive "$GROUP" "$DENO_DIR" + +echo "Assigning permissions with sticky group..." +chmod --changes --recursive 2775 "$DENO_DIR" + +echo "Appending group ${GROUP@Q} to user..." +if [[ "$USERNAME" == "automatic" ]]; then + usermod --append --groups "$GROUP" "$_REMOTE_USER" +elif [[ -n "$USERNAME" && "$USERNAME" != "root" ]]; then + usermod --append --groups "$GROUP" "$USERNAME" +fi diff --git a/test/deno-cache/denoland_deno__debian__custom_user.sh b/test/deno-cache/denoland_deno__debian__custom_user.sh new file mode 100644 index 0000000..8775191 --- /dev/null +++ b/test/deno-cache/denoland_deno__debian__custom_user.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +set -e + +source dev-container-features-test-lib + +check "Group exists" getent group deno +check "Directory /deno-dir exists" test -d "$DENO_DIR" +check "Group is set" test "$(stat --printf="%G" "$DENO_DIR")" == "deno" +check "Permissions are set" test "$(stat --printf="%a" "$DENO_DIR")" -eq 2775 +check "Remote user is in the deno group" bash -c "getent group deno | grep jsr" +check "Run deno info" deno info "jsr:@deno/cache-dir" + +reportResults diff --git a/test/deno-cache/scenarios.json b/test/deno-cache/scenarios.json new file mode 100644 index 0000000..4bdff8d --- /dev/null +++ b/test/deno-cache/scenarios.json @@ -0,0 +1,12 @@ +{ + "denoland_deno__debian__custom_user": { + "image": "denoland/deno:debian", + "remoteUser": "jsr", + "features": { + "deno-cache": {}, + "ghcr.io/devcontainers/features/common-utils:2": { + "username": "jsr" + } + } + } +} diff --git a/test/deno-cache/test.sh b/test/deno-cache/test.sh new file mode 100644 index 0000000..6939650 --- /dev/null +++ b/test/deno-cache/test.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +set -e + +source dev-container-features-test-lib + +check "Group exists" getent group deno +check "Directory /deno-dir exists" test -d "$DENO_DIR" +check "Group is set" test "$(stat --printf="%G" "$DENO_DIR")" == "deno" +check "Permissions are set" test "$(stat --printf="%a" "$DENO_DIR")" -eq 2775 + +reportResults