From 5958d4a23343faa2468578a61e8dcf0370ea0dc5 Mon Sep 17 00:00:00 2001 From: Maxim Slipenko Date: Sun, 17 Sep 2023 19:52:23 +0000 Subject: [PATCH] wip --- .github/workflows/test.yaml | 22 +-- src/color/README.md | 24 ---- src/color/devcontainer-feature.json | 21 --- src/color/install.sh | 26 ---- src/hello/README.md | 24 ---- src/hello/devcontainer-feature.json | 22 --- src/hello/install.sh | 29 ---- src/wine/install.sh | 45 ++++-- src/wine/library_scripts.sh | 172 ----------------------- test/_global/color_and_hello.sh | 33 ----- test/_global/scenarios.json | 13 -- test/color/gold.sh | 17 --- test/color/green.sh | 17 --- test/color/my_favorite_color_is_green.sh | 31 ---- test/color/scenarios.json | 33 ----- test/color/test.sh | 47 ------- test/hello/hello.sh | 17 --- test/hello/scenarios.json | 10 -- test/hello/test.sh | 47 ------- test/wine/scenarios.json | 4 +- test/wine/test.sh | 44 +----- test/wine/wine_specified_version.sh | 9 ++ 22 files changed, 47 insertions(+), 660 deletions(-) delete mode 100644 src/color/README.md delete mode 100644 src/color/devcontainer-feature.json delete mode 100644 src/color/install.sh delete mode 100644 src/hello/README.md delete mode 100644 src/hello/devcontainer-feature.json delete mode 100644 src/hello/install.sh delete mode 100644 src/wine/library_scripts.sh delete mode 100644 test/_global/color_and_hello.sh delete mode 100644 test/_global/scenarios.json delete mode 100644 test/color/gold.sh delete mode 100644 test/color/green.sh delete mode 100644 test/color/my_favorite_color_is_green.sh delete mode 100644 test/color/scenarios.json delete mode 100644 test/color/test.sh delete mode 100644 test/hello/hello.sh delete mode 100644 test/hello/scenarios.json delete mode 100644 test/hello/test.sh create mode 100644 test/wine/wine_specified_version.sh diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 9a32de6..b9397eb 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -13,12 +13,9 @@ jobs: strategy: matrix: features: - - color - - hello + - wine baseImage: - - debian:latest - - ubuntu:latest - - mcr.microsoft.com/devcontainers/base:ubuntu + - mcr.microsoft.com/devcontainers/base:debian steps: - uses: actions/checkout@v3 @@ -34,8 +31,7 @@ jobs: strategy: matrix: features: - - color - - hello + - wine steps: - uses: actions/checkout@v3 @@ -44,15 +40,3 @@ jobs: - name: "Generating tests for '${{ matrix.features }}' scenarios" run: devcontainer features test -f ${{ matrix.features }} --skip-autogenerated --skip-duplicated . - - test-global: - runs-on: ubuntu-latest - continue-on-error: true - steps: - - uses: actions/checkout@v3 - - - name: "Install latest devcontainer CLI" - run: npm install -g @devcontainers/cli - - - name: "Testing global scenarios" - run: devcontainer features test --global-scenarios-only . diff --git a/src/color/README.md b/src/color/README.md deleted file mode 100644 index 4883b95..0000000 --- a/src/color/README.md +++ /dev/null @@ -1,24 +0,0 @@ - -# My Favorite Color (color) - -A feature to remind you of your favorite color - -## Example Usage - -```json -"features": { - "ghcr.io/Maks1mS/devcontainers-features/color:1": {} -} -``` - -## Options - -| Options Id | Description | Type | Default Value | -|-----|-----|-----|-----| -| favorite | Choose your favorite color. | string | red | - - - ---- - -_Note: This file was auto-generated from the [devcontainer-feature.json](https://github.com/Maks1mS/devcontainers-features/blob/main/src/color/devcontainer-feature.json). Add additional notes to a `NOTES.md`._ diff --git a/src/color/devcontainer-feature.json b/src/color/devcontainer-feature.json deleted file mode 100644 index e14e7e7..0000000 --- a/src/color/devcontainer-feature.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "My Favorite Color", - "id": "color", - "version": "1.0.3", - "description": "A feature to remind you of your favorite color", - "options": { - "favorite": { - "type": "string", - "enum": [ - "red", - "gold", - "green" - ], - "default": "red", - "description": "Choose your favorite color." - } - }, - "installsAfter": [ - "ghcr.io/devcontainers/features/common-utils" - ] -} diff --git a/src/color/install.sh b/src/color/install.sh deleted file mode 100644 index 883c25d..0000000 --- a/src/color/install.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh -set -e - -echo "Activating feature 'color'" -echo "The provided favorite color is: ${FAVORITE}" - - -# The 'install.sh' entrypoint script is always executed as the root user. -# -# These following environment variables are passed in by the dev container CLI. -# These may be useful in instances where the context of the final -# remoteUser or containerUser is useful. -# For more details, see https://containers.dev/implementors/features#user-env-var -echo "The effective dev container remoteUser is '$_REMOTE_USER'" -echo "The effective dev container remoteUser's home directory is '$_REMOTE_USER_HOME'" - -echo "The effective dev container containerUser is '$_CONTAINER_USER'" -echo "The effective dev container containerUser's home directory is '$_CONTAINER_USER_HOME'" - -cat > /usr/local/bin/color \ -<< EOF -#!/bin/sh -echo "my favorite color is ${FAVORITE}" -EOF - -chmod +x /usr/local/bin/color diff --git a/src/hello/README.md b/src/hello/README.md deleted file mode 100644 index 42faf82..0000000 --- a/src/hello/README.md +++ /dev/null @@ -1,24 +0,0 @@ - -# Hello, World! (hello) - -A hello world feature - -## Example Usage - -```json -"features": { - "ghcr.io/Maks1mS/devcontainers-features/hello:1": {} -} -``` - -## Options - -| Options Id | Description | Type | Default Value | -|-----|-----|-----|-----| -| greeting | Select a pre-made greeting, or enter your own | string | hey | - - - ---- - -_Note: This file was auto-generated from the [devcontainer-feature.json](https://github.com/Maks1mS/devcontainers-features/blob/main/src/hello/devcontainer-feature.json). Add additional notes to a `NOTES.md`._ diff --git a/src/hello/devcontainer-feature.json b/src/hello/devcontainer-feature.json deleted file mode 100644 index e2a3178..0000000 --- a/src/hello/devcontainer-feature.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "Hello, World!", - "id": "hello", - "version": "1.0.2", - "description": "A hello world feature", - "options": { - "greeting": { - "type": "string", - "proposals": [ - "hey", - "hello", - "hi", - "howdy" - ], - "default": "hey", - "description": "Select a pre-made greeting, or enter your own" - } - }, - "installsAfter": [ - "ghcr.io/devcontainers/features/common-utils" - ] -} diff --git a/src/hello/install.sh b/src/hello/install.sh deleted file mode 100644 index 480e262..0000000 --- a/src/hello/install.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -set -e - -echo "Activating feature 'hello'" - -GREETING=${GREETING:-undefined} -echo "The provided greeting is: $GREETING" - -# The 'install.sh' entrypoint script is always executed as the root user. -# -# These following environment variables are passed in by the dev container CLI. -# These may be useful in instances where the context of the final -# remoteUser or containerUser is useful. -# For more details, see https://containers.dev/implementors/features#user-env-var -echo "The effective dev container remoteUser is '$_REMOTE_USER'" -echo "The effective dev container remoteUser's home directory is '$_REMOTE_USER_HOME'" - -echo "The effective dev container containerUser is '$_CONTAINER_USER'" -echo "The effective dev container containerUser's home directory is '$_CONTAINER_USER_HOME'" - -cat > /usr/local/bin/hello \ -<< EOF -#!/bin/sh -RED='\033[0;91m' -NC='\033[0m' # No Color -echo "\${RED}${GREETING}, \$(whoami)!\${NC}" -EOF - -chmod +x /usr/local/bin/hello \ No newline at end of file diff --git a/src/wine/install.sh b/src/wine/install.sh index 5b1117f..c06425f 100644 --- a/src/wine/install.sh +++ b/src/wine/install.sh @@ -7,11 +7,11 @@ WINEPREFIX="$WINEHOME/.wine32" WINEARCH="win32" WINEDEBUG=-all -ensure_nanolayer nanolayer_location "v0.5.0" - -$nanolayer_location \ - install \ - apt-get \ +install_debian() { + export DEBIAN_FRONTEND=noninteractive + dpkg --add-architecture i386 + apt-get update + apt-get install -y --no-install-recommends \ apt-transport-https \ ca-certificates \ telnet \ @@ -19,14 +19,29 @@ $nanolayer_location \ gnupg2 \ wget -wget https://dl.winehq.org/wine-builds/winehq.key -O - | apt-key add - -echo "deb https://dl.winehq.org/wine-builds/debian bookworm main" > /etc/apt/sources.list.d/winehq.list -{ \ - echo "Package: *wine* *wine*:i386"; \ - echo "Pin: version $WINEVERSION~bookworm"; \ - echo "Pin-Priority: 1001"; \ -} > /etc/apt/preferences.d/winehq.pref + wget https://dl.winehq.org/wine-builds/winehq.key -O - | apt-key add - + echo "deb https://dl.winehq.org/wine-builds/debian $VERSION_CODENAME main" >/etc/apt/sources.list.d/winehq.list + { + echo "Package: *wine* *wine*:i386" + echo "Pin: version $WINEVERSION~$VERSION_CODENAME" + echo "Pin-Priority: 1001" + } >/etc/apt/preferences.d/winehq.pref -$nanolayer_location install apt-get winehq-stable -wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks -O /usr/bin/winetricks -chmod +rx /usr/bin/winetricks \ No newline at end of file + apt-get update + apt-get install -y --no-install-recommends winehq-stable + wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks -O /usr/bin/winetricks + chmod +rx /usr/bin/winetricks + + apt purge --auto-remove -y + apt autoremove --purge -y + rm -rf /var/lib/apt/lists/* +} + +. /etc/os-release + +if [ "${ID}" = "debian" ]; then + install_debian +else + echo "Linux distro ${ID} not supported." + exit 1 +fi diff --git a/src/wine/library_scripts.sh b/src/wine/library_scripts.sh deleted file mode 100644 index 87874f5..0000000 --- a/src/wine/library_scripts.sh +++ /dev/null @@ -1,172 +0,0 @@ -// https://github.com/devcontainers-contrib/features/blob/696aa94479697cf701c559ef17d4f0bbb86bd00c/src/bikeshed/library_scripts.sh - -clean_download() { - # The purpose of this function is to download a file with minimal impact on container layer size - # this means if no valid downloader is found (curl or wget) then we install a downloader (currently wget) in a - # temporary manner, and making sure to - # 1. uninstall the downloader at the return of the function - # 2. revert back any changes to the package installer database/cache (for example apt-get lists) - # The above steps will minimize the leftovers being created while installing the downloader - # Supported distros: - # debian/ubuntu/alpine - - url=$1 - output_location=$2 - tempdir=$(mktemp -d) - downloader_installed="" - - _apt_get_install() { - tempdir=$1 - - # copy current state of apt list - in order to revert back later (minimize contianer layer size) - cp -p -R /var/lib/apt/lists $tempdir - apt-get update -y - apt-get -y install --no-install-recommends wget ca-certificates - } - - _apt_get_cleanup() { - tempdir=$1 - - echo "removing wget" - apt-get -y purge wget --auto-remove - - echo "revert back apt lists" - rm -rf /var/lib/apt/lists/* - rm -r /var/lib/apt/lists && mv $tempdir/lists /var/lib/apt/lists - } - - _apk_install() { - tempdir=$1 - # copy current state of apk cache - in order to revert back later (minimize contianer layer size) - cp -p -R /var/cache/apk $tempdir - - apk add --no-cache wget - } - - _apk_cleanup() { - tempdir=$1 - - echo "removing wget" - apk del wget - } - # try to use either wget or curl if one of them already installer - if type curl >/dev/null 2>&1; then - downloader=curl - elif type wget >/dev/null 2>&1; then - downloader=wget - else - downloader="" - fi - - # in case none of them is installed, install wget temporarly - if [ -z $downloader ] ; then - if [ -x "/usr/bin/apt-get" ] ; then - _apt_get_install $tempdir - elif [ -x "/sbin/apk" ] ; then - _apk_install $tempdir - else - echo "distro not supported" - exit 1 - fi - downloader="wget" - downloader_installed="true" - fi - - if [ $downloader = "wget" ] ; then - wget -q $url -O $output_location - else - curl -sfL $url -o $output_location - fi - - # NOTE: the cleanup procedure was not implemented using `trap X RETURN` only because - # alpine lack bash, and RETURN is not a valid signal under sh shell - if ! [ -z $downloader_installed ] ; then - if [ -x "/usr/bin/apt-get" ] ; then - _apt_get_cleanup $tempdir - elif [ -x "/sbin/apk" ] ; then - _apk_cleanup $tempdir - else - echo "distro not supported" - exit 1 - fi - fi - -} - - -ensure_nanolayer() { - # Ensure existance of the nanolayer cli program - local variable_name=$1 - - local required_version=$2 - - local __nanolayer_location="" - - # If possible - try to use an already installed nanolayer - if [ -z "${NANOLAYER_FORCE_CLI_INSTALLATION}" ]; then - if [ -z "${NANOLAYER_CLI_LOCATION}" ]; then - if type nanolayer >/dev/null 2>&1; then - echo "Found a pre-existing nanolayer in PATH" - __nanolayer_location=nanolayer - fi - elif [ -f "${NANOLAYER_CLI_LOCATION}" ] && [ -x "${NANOLAYER_CLI_LOCATION}" ] ; then - __nanolayer_location=${NANOLAYER_CLI_LOCATION} - echo "Found a pre-existing nanolayer which were given in env variable: $__nanolayer_location" - fi - - # make sure its of the required version - if ! [ -z "${__nanolayer_location}" ]; then - local current_version - current_version=$($__nanolayer_location --version) - - - if ! [ $current_version == $required_version ]; then - echo "skipping usage of pre-existing nanolayer. (required version $required_version does not match existing version $current_version)" - __nanolayer_location="" - fi - fi - - fi - - # If not previuse installation found, download it temporarly and delete at the end of the script - if [ -z "${__nanolayer_location}" ]; then - - if [ "$(uname -sm)" = 'Linux x86_64' ] || [ "$(uname -sm)" = "Linux aarch64" ]; then - tmp_dir=$(mktemp -d -t nanolayer-XXXXXXXXXX) - - clean_up () { - ARG=$? - rm -rf $tmp_dir - exit $ARG - } - trap clean_up EXIT - - - if [ -x "/sbin/apk" ] ; then - clib_type=musl - else - clib_type=gnu - fi - - tar_filename=nanolayer-"$(uname -m)"-unknown-linux-$clib_type.tgz - - # clean download will minimize leftover in case a downloaderlike wget or curl need to be installed - clean_download https://github.com/devcontainers-contrib/cli/releases/download/$required_version/$tar_filename $tmp_dir/$tar_filename - - tar xfzv $tmp_dir/$tar_filename -C "$tmp_dir" - chmod a+x $tmp_dir/nanolayer - __nanolayer_location=$tmp_dir/nanolayer - - - else - echo "No binaries compiled for non-x86-linux architectures yet: $(uname -m)" - exit 1 - fi - fi - - # Expose outside the resolved location - export ${variable_name}=$__nanolayer_location - -} - - diff --git a/test/_global/color_and_hello.sh b/test/_global/color_and_hello.sh deleted file mode 100644 index 9a08758..0000000 --- a/test/_global/color_and_hello.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# The 'test/_global' folder is a special test folder that is not tied to a single feature. -# -# This test file is executed against a running container constructed -# from the value of 'color_and_hello' in the tests/_global/scenarios.json file. -# -# The value of a scenarios element is any properties available in the 'devcontainer.json'. -# Scenarios are useful for testing specific options in a feature, or to test a combination of features. -# -# This test can be run with the following command (from the root of this repo) -# devcontainer features test --global-scenarios-only . - -set -e - -# Optional: Import test library bundled with the devcontainer CLI -source dev-container-features-test-lib - -echo -e "The result of the 'color' command will be:\n" -color -echo -e "The result of the 'hello' command will be:\n" -hello -echo -e "\n" - -# Feature-specific tests -# The 'check' command comes from the dev-container-features-test-lib. -check "check purple is my favorite color" bash -c "color | grep 'my favorite color is purple'" -check "check I am greeting with 'Greetings'" bash -c "hello | grep 'Greetings, $(whoami)'" - - -# Report result -# If any of the checks above exited with a non-zero exit code, the test will fail. -reportResults diff --git a/test/_global/scenarios.json b/test/_global/scenarios.json deleted file mode 100644 index b046998..0000000 --- a/test/_global/scenarios.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "color_and_hello": { - "image": "mcr.microsoft.com/devcontainers/base:ubuntu", - "features": { - "color": { - "favorite": "purple" - }, - "hello": { - "greeting": "Greetings" - } - } - } -} \ No newline at end of file diff --git a/test/color/gold.sh b/test/color/gold.sh deleted file mode 100644 index 1aaa9aa..0000000 --- a/test/color/gold.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# This test file will be executed against one of the scenarios devcontainer.json test that -# includes the 'color' feature with "favorite": "gold" option. - -set -e - -# Optional: Import test library bundled with the devcontainer CLI -source dev-container-features-test-lib - -# Feature-specific tests -# The 'check' command comes from the dev-container-features-test-lib. -check "execute command" bash -c "color | grep 'my favorite color is gold'" - -# Report result -# If any of the checks above exited with a non-zero exit code, the test will fail. -reportResults diff --git a/test/color/green.sh b/test/color/green.sh deleted file mode 100644 index 5b55388..0000000 --- a/test/color/green.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# This test file will be executed against one of the scenarios devcontainer.json test that -# includes the 'color' feature with "favorite": "green" option. - -set -e - -# Optional: Import test library bundled with the devcontainer CLI -source dev-container-features-test-lib - -# Feature-specific tests -# The 'check' command comes from the dev-container-features-test-lib. -check "execute command" bash -c "color | grep 'my favorite color is green'" - -# Report result -# If any of the checks above exited with a non-zero exit code, the test will fail. -reportResults diff --git a/test/color/my_favorite_color_is_green.sh b/test/color/my_favorite_color_is_green.sh deleted file mode 100644 index 94e6295..0000000 --- a/test/color/my_favorite_color_is_green.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -# This test file will be executed against after building a container with the -# 'my_favorite_color_is_green' scenario in 'test/test/color/scenarios.json'. -# -# For more information, see: https://github.com/devcontainers/cli/blob/main/docs/features/test.md -# -# This scenario first uses the 'common-utils' Features to add a new user 'octocat'. -# It then installs the 'color' Feature with the FAVORITE option set to 'green' (the default FAVORITE value if none provided is 'red'). -# -# -# This test (as well as any of the other scenarios in 'scenarios.json') can be run with the following command: -# -# devcontainer features test \ -# --features color \ -# --skip-autogenerated \ -# /path/to/this/repo - -set -e - -# Optional: Import test library bundled with the devcontainer CLI -# Provides the 'check' and 'reportResults' commands. -source dev-container-features-test-lib - -# Feature-specific tests -# The 'check' command comes from the dev-container-features-test-lib. -check "validate favorite color" color | grep 'my favorite color is green' - -# Report result -# If any of the checks above exited with a non-zero exit code, the test will fail. -reportResults diff --git a/test/color/scenarios.json b/test/color/scenarios.json deleted file mode 100644 index bfd7952..0000000 --- a/test/color/scenarios.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "my_favorite_color_is_green": { - "image": "mcr.microsoft.com/devcontainers/base:focal", - "features": { - "ghcr.io/devcontainers/features/common-utils:1": { - "installZsh": false, - "installOhMyZsh": false, - "upgradePackages": false, - "username": "octocat" - }, - "color": { - "favorite": "green" - } - }, - "remoteUser": "octocat" - }, - "gold": { - "image": "mcr.microsoft.com/devcontainers/base:ubuntu", - "features": { - "color": { - "favorite": "gold" - } - } - }, - "green": { - "image": "mcr.microsoft.com/devcontainers/base:ubuntu", - "features": { - "color": { - "favorite": "green" - } - } - } -} diff --git a/test/color/test.sh b/test/color/test.sh deleted file mode 100644 index bab0fa3..0000000 --- a/test/color/test.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -# This test file will be executed against an auto-generated devcontainer.json that -# includes the 'color' Feature with no options. -# -# For more information, see: https://github.com/devcontainers/cli/blob/main/docs/features/test.md -# -# Eg: -# { -# "image": "<..some-base-image...>", -# "features": { -# "color": {} -# }, -# "remoteUser": "root" -# } -# -# Thus, the value of all options will fall back to the default value in the -# Feature's 'devcontainer-feature.json'. -# For the 'color' feature, that means the default favorite color is 'red'. -# -# These scripts are run as 'root' by default. Although that can be changed -# with the '--remote-user' flag. -# -# This test can be run with the following command: -# -# devcontainer features test \ -# --features color \ -# --remote-user root \ -# --skip-scenarios \ -# --base-image mcr.microsoft.com/devcontainers/base:ubuntu \ -# /path/to/this/repo - -set -e - -# Optional: Import test library bundled with the devcontainer CLI -# See https://github.com/devcontainers/cli/blob/HEAD/docs/features/test.md#dev-container-features-test-lib -# Provides the 'check' and 'reportResults' commands. -source dev-container-features-test-lib - -# Feature-specific tests -# The 'check' command comes from the dev-container-features-test-lib. Syntax is... -# check