diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..13c91a0f --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,14 @@ +{ + "name": "exercism-generic", + "image": "vpayno/ci-generic-debian:latest", + "customizations": { + "vscode": { + "settings": {}, + "extensions": [] + } + }, + "portsAttributes": {}, + "postCreateCommand": "cd /workspaces/exercism-workspace/; tree .devcontainer/; ./.devcontainer/scripts/dc-up-post-create-command.sh", + "remoteUser": "root", + "shutdownAction": "none" +} diff --git a/.devcontainer/scripts/dc-down b/.devcontainer/scripts/dc-down new file mode 100755 index 00000000..a2bc242e --- /dev/null +++ b/.devcontainer/scripts/dc-down @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +declare devcontainer_id + +devcontainer_id="$(docker ps --format 'json' | jq -r '. | select(.Labels | contains("exercism-workspace")) | select(.Image == "vpayno/ci-generic-debian:latest") | .ID')" + +# delete old container +if [[ -n ${devcontainer_id} ]]; then + printf "Removing old container...\n" + docker rm -f "${devcontainer_id}" + printf "done.\n" +fi +printf "\n" diff --git a/.devcontainer/scripts/dc-run b/.devcontainer/scripts/dc-run new file mode 100755 index 00000000..0e1e35d3 --- /dev/null +++ b/.devcontainer/scripts/dc-run @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +set -e +set -x + +if [[ -f ./.devcontainer/scripts/data.tmp ]]; then + # shellcheck disable=SC1091 source=.devcontainer/scripts/data.tmp + source ./.devcontainer/scripts/data.tmp +fi + +if [[ ${1} == --root ]]; then + devcontainer exec --workspace-folder "${PWD}" bash -i +else + devcontainer exec --workspace-folder "${PWD}" sudo -u "${devcontainer_username:-USER}" -i +fi diff --git a/.devcontainer/scripts/dc-up b/.devcontainer/scripts/dc-up new file mode 100755 index 00000000..284b866d --- /dev/null +++ b/.devcontainer/scripts/dc-up @@ -0,0 +1,52 @@ +#!/usr/bin/env bash + +# shellcheck disable=SC2120 +rword() { + local -a words + local word + local -i word_size=${1:-0} + local -i tries + + mapfile -t words ./.devcontainer/scripts/data.tmp <<-EOF + devcontainer_username="$(id --name --user)" + devcontainer_password="$(rword)" + devcontainer_uid="$(id --user)" + devcontainer_gid="$(id --group)" +EOF + +# delete old container +if [[ -n ${devcontainer_id} ]]; then + printf "Removing old container...\n" + docker rm -f "${devcontainer_id}" + printf "done.\n" +fi +printf "\n" + +# starts up container +time devcontainer up --mount type=bind,source="${HOME}",target="${HOME}" --workspace-folder "${PWD}" +printf "\n" diff --git a/.devcontainer/scripts/dc-up-post-create-command.sh b/.devcontainer/scripts/dc-up-post-create-command.sh new file mode 100755 index 00000000..afb8e835 --- /dev/null +++ b/.devcontainer/scripts/dc-up-post-create-command.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +set -x +set -e + +# shellcheck disable=SC1091 source=.devcontainer/scripts/data.tmp +source /workspaces/exercism-workspace/.devcontainer/scripts/data.tmp + +# shellcheck disable=SC2154 +{ + groupadd --gid "${devcontainer_gid}" "${devcontainer_username}" + useradd --uid "${devcontainer_uid}" --gid "${devcontainer_gid}" --no-create-home --groups docker "${devcontainer_username}" + chsh --shell /bin/bash "${devcontainer_username}" + printf "%s\n%s\n" "${devcontainer_password}" "${devcontainer_password}" | passwd "${devcontainer_username}" + id "${devcontainer_username}" +} + +declare -a cargo_pkgs=( + bacon + cargo-fuzz + cargo-generate + cargo-scaffold + cargo-spellcheck + git-cliff + irust + ripgrep +) + +# these commands also run as root + +cargo install --locked "${cargo_pkgs[@]}" +printf "\n" + +rustup component add rust-analyzer +printf "\n" diff --git a/.gitignore b/.gitignore index 4b632411..197fea6b 100644 --- a/.gitignore +++ b/.gitignore @@ -84,3 +84,6 @@ rust/index.scip # wasm node_modules/ package-lock.json + +# dev-container +/.devcontainer/scripts/data.tmp