diff --git a/CHANGELOG.md b/CHANGELOG.md index 456bda7..31d8e54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ Note: Breaking changes between versions are indicated by "💥". +## Unreleased + +- 💥[Improvement] Better `dev` commands, with dedicated development docker image. One of the consequences is that the `dev watchthemes` command is replaced by `dev run lms watchthemes`. +- [Improvement] `images` commands now accept multiple `image` arguments + ## 3.7.4 (2019-10-19) - [Bugfix] Fix missing requirements file in pypi package (#261) diff --git a/docs/dev.rst b/docs/dev.rst index 31fa3d9..0eaa3c1 100644 --- a/docs/dev.rst +++ b/docs/dev.rst @@ -15,6 +15,18 @@ Once the local platform has been configured, you should stop it so that it does tutor local stop +Finally, you should build the ``openedx-dev`` docker image:: + + tutor images build openedx-dev + +This ``openedx-dev`` development image differs from the ``openedx`` production image: + +- The user that runs inside the container has the same UID as the user on the host, in order to avoid permission problems inside mounted volumes (and in particular in the edx-platform repository). +- Additional python and system requirements are installed for convenient debugging: `ipython `__, `ipdb `__, vim, telnet. +- The edx-platform `development requirements `__ are installed. + +Since the ``openedx-dev`` is based upon the ``openedx`` docker image, it should be re-built every time the ``openedx`` docker image is modified. + Run a local development webserver --------------------------------- @@ -71,7 +83,7 @@ In order to run a fork of edx-platform, dependencies need to be properly install Debug edx-platform ~~~~~~~~~~~~~~~~~~ -To debug a local edx-platform repository, add a ``import pdb; pdb.set_trace()`` breakpoint anywhere in your code and run:: +To debug a local edx-platform repository, add a ``import ipdb; ipdb.set_trace()`` breakpoint anywhere in your code and run:: tutor dev runserver lms --edx-platform-path=/path/to/edx-platform @@ -92,7 +104,7 @@ Then, follow the `Open edX documentation to apply your themes + +# Install useful system requirements +RUN apt update && \ + apt install -y vim telnet \ + && rm -rf /var/lib/apt/lists/* + +# Install dev python requirements +RUN pip install -r requirements/edx/development.txt +RUN pip install ipdb==0.12.2 ipython==5.8.0 + +# Configure new user +ARG USERID=1000 +RUN useradd --home-dir /openedx --uid $USERID openedx +RUN chown -R openedx:openedx /openedx + +# Copy new entrypoint (to take care of permission issues at runtime) +COPY ./bin /openedx/bin +RUN chmod a+x /openedx/bin/* + +# Default django settings +ENV SETTINGS tutor.development + +# TODO recompile static assets and point to edx-platform \ No newline at end of file diff --git a/tutor/templates/build/openedx-dev/bin/docker-entrypoint.sh b/tutor/templates/build/openedx-dev/bin/docker-entrypoint.sh new file mode 100644 index 0000000..2378682 --- /dev/null +++ b/tutor/templates/build/openedx-dev/bin/docker-entrypoint.sh @@ -0,0 +1,10 @@ +#!/bin/sh -e +export DJANGO_SETTINGS_MODULE=$SERVICE_VARIANT.envs.$SETTINGS + +# Change file permissions of mounted volumes +echo "Setting file permissions..." +find /openedx -not -path "/openedx/edx-platform/*" -not -user openedx -exec chown openedx:openedx {} \+ +echo "File permissions set." + +# Run CMD as user openedx +exec chroot --userspec="$openedx:openedx" --skip-chdir / env HOME=/openedx "$@" \ No newline at end of file diff --git a/tutor/templates/build/openedx/Dockerfile b/tutor/templates/build/openedx/Dockerfile index c2745f5..3d8d0bf 100644 --- a/tutor/templates/build/openedx/Dockerfile +++ b/tutor/templates/build/openedx/Dockerfile @@ -44,7 +44,7 @@ RUN virtualenv /openedx/venv ENV PATH /openedx/venv/bin:${PATH} ENV VIRTUAL_ENV /openedx/venv/ RUN pip install setuptools==39.0.1 pip==9.0.3 -RUN pip install -r requirements/edx/development.txt +RUN pip install -r requirements/edx/base.txt # Install patched version of ora2 RUN pip uninstall -y ora2 && \ @@ -107,7 +107,7 @@ ENV SETTINGS tutor.production {{ patch("openedx-dockerfile") }} -# Entrypoint will fix permissions of all files and run commands as openedx +# Entrypoint will set right environment variables ENTRYPOINT ["docker-entrypoint.sh"] # Run server diff --git a/tutor/templates/build/openedx/bin/docker-entrypoint.sh b/tutor/templates/build/openedx/bin/docker-entrypoint.sh index 91fdf48..235d2a6 100755 --- a/tutor/templates/build/openedx/bin/docker-entrypoint.sh +++ b/tutor/templates/build/openedx/bin/docker-entrypoint.sh @@ -1,19 +1,3 @@ #!/bin/sh -e export DJANGO_SETTINGS_MODULE=$SERVICE_VARIANT.envs.$SETTINGS -USERID=${USERID:=0} - -## Configure user with a different USERID if requested. -if [ "$USERID" -ne 0 ] - then - echo "creating new user 'openedx' with UID $USERID" - useradd --home-dir /openedx -u $USERID openedx - - # Change file permissions - chown --no-dereference -R openedx /openedx - - # Run CMD as different user - exec chroot --userspec="$USERID" --skip-chdir / env HOME=/openedx "$@" -else - # Run CMD as root (business as usual) - exec "$@" -fi +exec "$@" \ No newline at end of file diff --git a/tutor/templates/config.yml b/tutor/templates/config.yml index 9d0d75a..47fc8bb 100644 --- a/tutor/templates/config.yml +++ b/tutor/templates/config.yml @@ -28,6 +28,7 @@ ANDROID_RELEASE_STORE_PASSWORD: "android store password" ANDROID_RELEASE_KEY_PASSWORD: "android release key password" ANDROID_RELEASE_KEY_ALIAS: "android release key alias" DOCKER_IMAGE_OPENEDX: "overhangio/openedx:{{ TUTOR_VERSION }}" +DOCKER_IMAGE_OPENEDX_DEV: "overhangio/openedx-dev:{{ TUTOR_VERSION }}" DOCKER_IMAGE_ANDROID: "overhangio/openedx-android:{{ TUTOR_VERSION }}" DOCKER_IMAGE_FORUM: "overhangio/openedx-forum:{{ TUTOR_VERSION }}" DOCKER_IMAGE_MEMCACHED: "memcached:1.4.38" diff --git a/tutor/templates/dev/docker-compose.yml b/tutor/templates/dev/docker-compose.yml new file mode 100644 index 0000000..f277b4f --- /dev/null +++ b/tutor/templates/dev/docker-compose.yml @@ -0,0 +1,29 @@ +version: "3" + +services: + x-openedx-service: + &openedx-service + image: {{ DOCKER_REGISTRY }}{{ DOCKER_IMAGE_OPENEDX_DEV }} + volumes: + # static assets + - ../../data/openedx/staticfiles:/openedx/staticfiles + # theme files + - ../build/openedx/themes:/openedx/themes + # editable requirements + - ../build/openedx/requirements:/openedx/requirements + + lms: + <<: *openedx-service + cms: + <<: *openedx-service + lms_worker: + <<: *openedx-service + cms_worker: + <<: *openedx-service + + # Additional service for watching theme changes + watchthemes: + <<: *openedx-service + command: openedx-assets watch-themes --env dev + + {{ patch("local-docker-compose-dev-services")|indent(2) }} \ No newline at end of file