diff --git a/.devcontainer.json b/.devcontainer.json index d5d850c..81b3c1f 100644 --- a/.devcontainer.json +++ b/.devcontainer.json @@ -11,5 +11,8 @@ "features": { "ghcr.io/devcontainers/features/docker-in-docker:1": {} }, - "postCreateCommand": "npm install -g @devcontainers/cli" + "postCreateCommand": "npm install -g @devcontainers/cli", + "hostRequirements": { + "cpus": 4 + } } diff --git a/.github/workflows/test-all.yaml b/.github/workflows/test-all.yaml index 412eb11..cf876a4 100644 --- a/.github/workflows/test-all.yaml +++ b/.github/workflows/test-all.yaml @@ -47,7 +47,6 @@ jobs: "ubuntu:bionic", "debian:11", "debian:10", - "debian:9", "mcr.microsoft.com/devcontainers/base:ubuntu", "mcr.microsoft.com/devcontainers/base:debian", ] diff --git a/.github/workflows/test-pr.yaml b/.github/workflows/test-pr.yaml index 700c875..f89923d 100644 --- a/.github/workflows/test-pr.yaml +++ b/.github/workflows/test-pr.yaml @@ -54,7 +54,6 @@ jobs: "ubuntu:bionic", "debian:11", "debian:10", - "debian:9", "mcr.microsoft.com/devcontainers/base:ubuntu", "mcr.microsoft.com/devcontainers/base:debian", ] diff --git a/src/python/devcontainer-feature.json b/src/python/devcontainer-feature.json index f2d116e..8f8faae 100644 --- a/src/python/devcontainer-feature.json +++ b/src/python/devcontainer-feature.json @@ -1,6 +1,6 @@ { "id": "python", - "version": "1.0.10", + "version": "1.0.11", "name": "Python", "documentationURL": "https://github.com/devcontainers/features/tree/main/src/python", "description": "Installs the provided version of Python, as well as PIPX, and other common Python utilities. JupyterLab is conditionally installed with the python feature. Note: May require source code compilation.", @@ -60,7 +60,7 @@ "ms-python.vscode-pylance" ], "settings": { - "python.defaultInterpreterPath": "/usr/local/bin/python", + "python.defaultInterpreterPath": "/usr/local/python/current/bin/python", "python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8", "python.formatting.blackPath": "/usr/local/py-utils/bin/black", "python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf", @@ -74,6 +74,7 @@ } }, "installsAfter": [ - "ghcr.io/devcontainers/features/common-utils" + "ghcr.io/devcontainers/features/common-utils", + "ghcr.io/devcontainers/features/oryx" ] } diff --git a/src/python/install.sh b/src/python/install.sh index ac5eec6..de1b0e6 100755 --- a/src/python/install.sh +++ b/src/python/install.sh @@ -299,6 +299,9 @@ install_using_oryx() { echo "(!) Python version ${VERSION} already exists." exit 1 fi + + # The python install root path may not exist, so create it + mkdir -p "${PYTHON_INSTALL_PATH}" oryx_install "python" "${VERSION}" "${INSTALL_PATH}" "lib" || return 1 ln -s "${INSTALL_PATH}/bin/idle3" "${INSTALL_PATH}/bin/idle" @@ -339,11 +342,15 @@ install_python() { # If the os-provided versions are "good enough", detect that and bail out. if [ ${PYTHON_VERSION} = "os-provided" ] || [ ${PYTHON_VERSION} = "system" ]; then check_packages python3 python3-doc python3-pip python3-venv python3-dev python3-tk - PYTHON_ROOT="/usr/bin" + INSTALL_PATH="/usr" - ln -s "${PYTHON_ROOT}/python3" "${PYTHON_ROOT}/python" - ln -s "${PYTHON_ROOT}/pydoc3" "${PYTHON_ROOT}/pydoc" - ln -s "${PYTHON_ROOT}/python3-config" "${PYTHON_ROOT}/python-config" + ln -s "${INSTALL_PATH}/bin/python3" "${INSTALL_PATH}/bin/python" + ln -s "${INSTALL_PATH}/bin/pydoc3" "${INSTALL_PATH}/bin/pydoc" + ln -s "${INSTALL_PATH}/bin/python3-config" "${INSTALL_PATH}/bin/python-config" + + # Add the current symlink but point it to "/usr" since python is at /usr/bin/python + mkdir -p "${PYTHON_INSTALL_PATH}" + add_symlink should_install_from_source=false elif [ "$(dpkg --print-architecture)" = "amd64" ] && [ "${USE_ORYX_IF_AVAILABLE}" = "true" ] && type oryx > /dev/null 2>&1; then diff --git a/test/python/install_additional_jupyterlab.sh b/test/python/install_additional_jupyterlab.sh old mode 100644 new mode 100755 diff --git a/test/python/install_additional_python.sh b/test/python/install_additional_python.sh old mode 100644 new mode 100755 index 00e43d8..bbd6c13 --- a/test/python/install_additional_python.sh +++ b/test/python/install_additional_python.sh @@ -5,11 +5,34 @@ set -e # Optional: Import test library source dev-container-features-test-lib -check "python version 3.11 installed as default" python --version | grep 3.11 -check "python3 version 3.11 installed as default" python3 --version | grep 3.11 -check "python version 3.10.5 installed" ls -l /usr/local/python | grep 3.10.5 -check "python version 3.8.13 installed" ls -l /usr/local/python | grep 3.8.13 -check "python version 3.9.13 installed" ls -l /usr/local/python | grep 3.9.13 +check "python version 3.11 installed as default" bash -c "python --version | grep 3.11" +check "python3 version 3.11 installed as default" bash -c "python3 --version | grep 3.11" +check "python version 3.10.5 installed" bash -c "ls -l /usr/local/python | grep 3.10.5" +check "python version 3.8 installed" bash -c "ls -l /usr/local/python | grep 3.8" +check "python version 3.9.13 installed" bash -c "ls -l /usr/local/python | grep 3.9.13" + +# Check that tools can execute - make sure something didn't get messed up in this scenario +check "autopep8" autopep8 --version +check "black" black --version +check "yapf" yapf --version +check "bandit" bandit --version +check "flake8" flake8 --version +check "mypy" mypy --version +check "pycodestyle" pycodestyle --version +check "pydocstyle" pydocstyle --version +check "pylint" pylint --version + +# Check paths in settings +check "current symlink is correct" bash -c "which python | grep /usr/local/python/current/bin/python" +check "which autopep8" bash -c "which autopep8 | grep /usr/local/py-utils/bin/autopep8" +check "which black" bash -c "which black | grep /usr/local/py-utils/bin/black" +check "which yapf" bash -c "which yapf | grep /usr/local/py-utils/bin/yapf" +check "which bandit" bash -c "which bandit | grep /usr/local/py-utils/bin/bandit" +check "which flake8" bash -c "which flake8 | grep /usr/local/py-utils/bin/flake8" +check "which mypy" bash -c "which mypy | grep /usr/local/py-utils/bin/mypy" +check "which pycodestyle" bash -c "which pycodestyle | grep /usr/local/py-utils/bin/pycodestyle" +check "which pydocstyle" bash -c "which pydocstyle | grep /usr/local/py-utils/bin/pydocstyle" +check "which pylint" bash -c "which pylint | grep /usr/local/py-utils/bin/pylint" # Report result reportResults diff --git a/test/python/install_jupyterlab.sh b/test/python/install_jupyterlab.sh old mode 100644 new mode 100755 diff --git a/test/python/install_os_provided_python.sh b/test/python/install_os_provided_python.sh old mode 100644 new mode 100755 index 50a617e..e65b154 --- a/test/python/install_os_provided_python.sh +++ b/test/python/install_os_provided_python.sh @@ -10,7 +10,28 @@ check "python is installed" python --version check "pip is installed" pip --version check "pip is installed" pip3 --version -check "node is installed" node --version +# Check that tools can execute +check "autopep8" autopep8 --version +check "black" black --version +check "yapf" yapf --version +check "bandit" bandit --version +check "flake8" flake8 --version +check "mypy" mypy --version +check "pycodestyle" pycodestyle --version +check "pydocstyle" pydocstyle --version +check "pylint" pylint --version + +# Check paths in settings +check "current symlink is correct" bash -c "which python | grep /usr/local/python/current/bin/python" +check "which autopep8" bash -c "which autopep8 | grep /usr/local/py-utils/bin/autopep8" +check "which black" bash -c "which black | grep /usr/local/py-utils/bin/black" +check "which yapf" bash -c "which yapf | grep /usr/local/py-utils/bin/yapf" +check "which bandit" bash -c "which bandit | grep /usr/local/py-utils/bin/bandit" +check "which flake8" bash -c "which flake8 | grep /usr/local/py-utils/bin/flake8" +check "which mypy" bash -c "which mypy | grep /usr/local/py-utils/bin/mypy" +check "which pycodestyle" bash -c "which pycodestyle | grep /usr/local/py-utils/bin/pycodestyle" +check "which pydocstyle" bash -c "which pydocstyle | grep /usr/local/py-utils/bin/pydocstyle" +check "which pylint" bash -c "which pylint | grep /usr/local/py-utils/bin/pylint" # Report result reportResults \ No newline at end of file diff --git a/test/python/install_via_oryx.sh b/test/python/install_via_oryx.sh new file mode 100755 index 0000000..e65b154 --- /dev/null +++ b/test/python/install_via_oryx.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +set -e + +# Optional: Import test library +source dev-container-features-test-lib + +check "python3 is installed" python3 --version +check "python is installed" python --version +check "pip is installed" pip --version +check "pip is installed" pip3 --version + +# Check that tools can execute +check "autopep8" autopep8 --version +check "black" black --version +check "yapf" yapf --version +check "bandit" bandit --version +check "flake8" flake8 --version +check "mypy" mypy --version +check "pycodestyle" pycodestyle --version +check "pydocstyle" pydocstyle --version +check "pylint" pylint --version + +# Check paths in settings +check "current symlink is correct" bash -c "which python | grep /usr/local/python/current/bin/python" +check "which autopep8" bash -c "which autopep8 | grep /usr/local/py-utils/bin/autopep8" +check "which black" bash -c "which black | grep /usr/local/py-utils/bin/black" +check "which yapf" bash -c "which yapf | grep /usr/local/py-utils/bin/yapf" +check "which bandit" bash -c "which bandit | grep /usr/local/py-utils/bin/bandit" +check "which flake8" bash -c "which flake8 | grep /usr/local/py-utils/bin/flake8" +check "which mypy" bash -c "which mypy | grep /usr/local/py-utils/bin/mypy" +check "which pycodestyle" bash -c "which pycodestyle | grep /usr/local/py-utils/bin/pycodestyle" +check "which pydocstyle" bash -c "which pydocstyle | grep /usr/local/py-utils/bin/pydocstyle" +check "which pylint" bash -c "which pylint | grep /usr/local/py-utils/bin/pylint" + +# Report result +reportResults \ No newline at end of file diff --git a/test/python/scenarios.json b/test/python/scenarios.json index 80e0fb5..920f4a2 100644 --- a/test/python/scenarios.json +++ b/test/python/scenarios.json @@ -33,8 +33,13 @@ "install_os_provided_python": { "image": "mcr.microsoft.com/devcontainers/base:0-bullseye", "features": { - "node": "latest", "python": "os-provided" } + }, + "install_via_oryx": { + "image": "mcr.microsoft.com/oryx/build:full-debian-bullseye", + "features": { + "python": "3.10" + } } } \ No newline at end of file diff --git a/test/python/test.sh b/test/python/test.sh index 7bd2281..8f7d336 100755 --- a/test/python/test.sh +++ b/test/python/test.sh @@ -7,6 +7,31 @@ source dev-container-features-test-lib # Definition specific tests check "version" python --version +check "pip is installed" pip --version +check "pip is installed" pip3 --version + +# Check that tools can execute +check "autopep8" autopep8 --version +check "black" black --version +check "yapf" yapf --version +check "bandit" bandit --version +check "flake8" flake8 --version +check "mypy" mypy --version +check "pycodestyle" pycodestyle --version +check "pydocstyle" pydocstyle --version +check "pylint" pylint --version + +# Check paths in settings +check "current symlink is correct" bash -c "which python | grep /usr/local/python/current/bin/python" +check "which autopep8" bash -c "which autopep8 | grep /usr/local/py-utils/bin/autopep8" +check "which black" bash -c "which black | grep /usr/local/py-utils/bin/black" +check "which yapf" bash -c "which yapf | grep /usr/local/py-utils/bin/yapf" +check "which bandit" bash -c "which bandit | grep /usr/local/py-utils/bin/bandit" +check "which flake8" bash -c "which flake8 | grep /usr/local/py-utils/bin/flake8" +check "which mypy" bash -c "which mypy | grep /usr/local/py-utils/bin/mypy" +check "which pycodestyle" bash -c "which pycodestyle | grep /usr/local/py-utils/bin/pycodestyle" +check "which pydocstyle" bash -c "which pydocstyle | grep /usr/local/py-utils/bin/pydocstyle" +check "which pylint" bash -c "which pylint | grep /usr/local/py-utils/bin/pylint" # Report result reportResults