diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0a2dfe803e5aa20c91c9bdbca4a183d895b13e44..9874c1eb3e8a00f0198d1da661c742e396358ebe 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -46,7 +46,8 @@ test: services: - postgres:10 - redis:4.0 - before_script: [] + before_script: + - pip install -r requirements-dev.txt script: - pytest --junitxml=junit.xml --cov-report xml:coverage.xml --cov=app -v artifacts: @@ -97,7 +98,8 @@ pages: <<: *runner_tags stage: deploy image: "$CONTAINER_RELEASE_IMAGE" - before_script: [] + before_script: + - pip install -r requirements-dev.txt script: - sphinx-build -M html docs docs/_build - mv docs/_build/html public diff --git a/Dockerfile b/Dockerfile index a313d757a6017484bce977669a0bb48f350e4e51..5e08a1291bc08e8cc72b8f3fd07180e693bbddf2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,64 @@ -FROM registry.esss.lu.se/ics-docker/miniconda:4.5 +FROM python:3.6-slim as base -USER root -WORKDIR /app -RUN chown conda:users /app +# Install Python dependencies in an intermediate image +# as some requires a compiler (uwsgi) +FROM base as builder + +# Install dependencies required to compile some Python packages +# Taken from https://github.com/docker-library/python/blob/master/3.6/stretch/slim/Dockerfile +# For psycopg2: libpq-dev +# For pillow: libjpeg-dev libpng-dev libtiff-dev +RUN apt-get update \ + && apt-get install -yq --no-install-recommends \ + gcc \ + libbz2-dev \ + libc6-dev \ + libexpat1-dev \ + libffi-dev \ + libjpeg-dev \ + libgdbm-dev \ + liblzma-dev \ + libncursesw5-dev \ + libpng-dev \ + libpq-dev \ + libreadline-dev \ + libsqlite3-dev \ + libssl-dev \ + libtiff-dev \ + make \ + tk-dev \ + wget \ + xz-utils \ + zlib1g-dev \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +COPY requirements.txt /requirements.txt +RUN python -m venv /venv \ + && . /venv/bin/activate \ + && pip install --no-cache-dir -r /requirements.txt + +FROM base -USER conda +RUN groupadd -r -g 1000 csi \ + && useradd --no-log-init -r -g csi -u 1000 csi -# Install CSEntry requirements -COPY environment.yml /app/environment.yml -RUN conda env create -n csentry -f environment.yml \ - && rm -rf /opt/conda/pkgs/* +COPY --chown=csi:csi --from=builder /venv /venv + +# Install libraries for psycopg2 and pillow +# Shall be the same as the one linked to when compiling in builder image! +RUN apt-get update \ + && apt-get install -yq --no-install-recommends \ + libjpeg62-turbo \ + libpng16-16 \ + libtiff5 \ + libpq5 \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +COPY --chown=csi:csi . /app/ +WORKDIR /app -# Install the app -COPY . /app/ +ENV PATH /venv/bin:$PATH -# activate the csentry environment -ENV PATH /opt/conda/envs/csentry/bin:$PATH +USER csi diff --git a/environment.yml b/environment.yml deleted file mode 100644 index b5880c8f1e7215faa13461d2c012116f2fb063b5..0000000000000000000000000000000000000000 --- a/environment.yml +++ /dev/null @@ -1,115 +0,0 @@ -name: csentry -channels: - - conda-forge - - defaults -dependencies: - - alabaster=0.7.10=py36_1 - - alembic=0.9.6=py_0 - - asn1crypto=0.22.0=py36_0 - - attrs=17.4.0=py_0 - - babel=2.5.1=py36_0 - - blinker=1.4=py_0 - - ca-certificates=2017.11.5=0 - - certifi=2017.11.5=py36_0 - - cffi=1.10.0=py36_0 - - chardet=3.0.4=py36_0 - - click=6.7=py36_0 - - colorama=0.3.9=py36_0 - - coverage=4.4.2=py36_0 - - cryptography=2.0.3=py36_0 - - dnspython=1.15.0=py_0 - - docutils=0.14=py36_0 - - email_validator=1.0.2=py_0 - - factory_boy=2.10.0=py_0 - - faker=0.8.1=py_0 - - flask=0.12.2=py36_0 - - flask-admin=1.5.0=py36_0 - - flask-debugtoolbar=0.10.1=py36_0 - - flask-login=0.4.0=py36_0 - - flask-mail=0.9.1=py36_1 - - flask-migrate=2.1.1=py36_0 - - flask-sqlalchemy=2.3.2=py_0 - - flask-wtf=0.14.2=py36_0 - - freetype=2.7=2 - - icu=58.2=0 - - idna=2.6=py36_1 - - imagesize=0.7.1=py36_0 - - itsdangerous=0.24=py_2 - - jansson=2.7=0 - - jinja2=2.9.6=py36_0 - - jpeg=9b=2 - - krb5=1.14.2=0 - - ldap3=2.3=py36_0 - - libffi=3.2.1=3 - - libpng=1.6.28=2 - - libpq=9.6.3=0 - - libtiff=4.0.7=1 - - libxml2=2.9.5=2 - - mako=1.0.7=py36_0 - - markupsafe=1.0=py36_0 - - ncurses=5.9=10 - - olefile=0.44=py36_0 - - openssl=1.0.2l=0 - - pcre=8.39=0 - - pillow=4.3.0=py36_1 - - pip=9.0.1=py36_0 - - pluggy=0.6.0=py_0 - - psycopg2=2.7.3.2=py36_0 - - py=1.5.2=py_0 - - pyasn1=0.3.7=py_0 - - pycparser=2.18=py36_0 - - pycrypto=2.6.1=py36_1 - - pygments=2.2.0=py36_0 - - pyjwt=1.5.3=py_0 - - pyopenssl=17.4.0=py36_0 - - pysocks=1.6.8=py36_1 - - pytest=3.4.2=py36_0 - - pytest-cov=2.5.1=py36_0 - - python=3.6.3=1 - - python-dateutil=2.6.1=py36_0 - - python-editor=1.0.3=py36_0 - - pytz=2017.3=py_2 - - pyyaml=3.12=py36_1 - - qrcode=5.3=py36_0 - - readline=6.2=0 - - redis-py=2.10.6=py_0 - - requests=2.18.4=py36_1 - - setuptools=36.7.2=py36_0 - - six=1.11.0=py36_1 - - snowballstemmer=1.2.1=py36_0 - - sphinx=1.6.7=py36_0 - - sphinxcontrib-websupport=1.0.1=py36_0 - - sqlalchemy=1.1.13=py36_0 - - sqlite=3.13.0=1 - - tk=8.5.19=2 - - typing=3.6.2=py36_0 - - urllib3=1.22=py36_0 - - uwsgi=2.0.15=py36_2 - - werkzeug=0.12.2=py_1 - - wheel=0.30.0=py36_2 - - whitenoise=3.3.1=py36_0 - - wtforms=2.1=py36_0 - - xz=5.2.3=0 - - yaml=0.1.6=0 - - zlib=1.2.11=0 - - ecdsa=0.13=py36_0 - - pip: - - ansible-tower-cli==3.2.1 - - arrow==0.12.1 - - dominate==2.3.1 - - email-validator==1.0.2 - - flask-caching==1.3.3 - - flask-jwt-extended==3.4.0 - - flask-ldap3-login==0.9.13 - - flask-redis==0.3.0 - - flask-session==0.3.1 - - inflection==0.3.1 - - pytest-factoryboy==2.0.1 - - rq==0.10.0 - - rq-dashboard==0.3.10 - - sphinxcontrib-httpdomain==1.6.0 - - sqlalchemy-citext==1.3.post0 - - sqlalchemy-continuum==1.3.3 - - sqlalchemy-utils==0.32.21 - - ukpostcodeparser==1.1.1 - - visitor==0.1.3 diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000000000000000000000000000000000000..7c3da6715b063e41adcd4aa5d333ca8e069f0fa4 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,7 @@ +sphinx +sphinxcontrib-httpdomain +coverage +factory_boy +pytest +pytest-cov +pytest-factoryboy diff --git a/requirements-to-freeze.txt b/requirements-to-freeze.txt new file mode 100644 index 0000000000000000000000000000000000000000..735bbf46c003a760733105bd5ebab9fd1ab4bbfb --- /dev/null +++ b/requirements-to-freeze.txt @@ -0,0 +1,26 @@ +flask>=1.0.0 +flask-admin +flask-caching +flask-debugtoolbar +flask-jwt-extended +flask-ldap3-login +flask-login +flask-mail +flask-migrate +flask-redis +flask-session +flask-sqlalchemy +flask-wtf +pillow +psycopg2 +pyjwt +python-dateutil +pyyaml +qrcode +uwsgi +whitenoise +ansible-tower-cli +rq +rq-dashboard +sqlalchemy-citext +sqlalchemy-continuum diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..c142d14fe3aa22c3a5f660404c149326ed2d260b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,49 @@ +alembic==1.0.0 +ansible-tower-cli==3.3.0 +arrow==0.12.1 +blinker==1.4 +certifi==2018.4.16 +chardet==3.0.4 +click==6.7 +colorama==0.3.9 +Flask==1.0.2 +Flask-Admin==1.5.1 +Flask-Caching==1.4.0 +Flask-DebugToolbar==0.10.1 +Flask-JWT-Extended==3.12.0 +flask-ldap3-login==0.9.14 +Flask-Login==0.4.1 +Flask-Mail==0.9.1 +Flask-Migrate==2.2.1 +Flask-Redis==0.3.0 +Flask-Session==0.3.1 +Flask-SQLAlchemy==2.3.2 +Flask-WTF==0.14.2 +idna==2.7 +itsdangerous==0.24 +Jinja2==2.10 +ldap3==2.5.1 +Mako==1.0.7 +MarkupSafe==1.0 +Pillow==5.2.0 +psycopg2==2.7.5 +pyasn1==0.4.4 +PyJWT==1.6.4 +python-dateutil==2.7.3 +python-editor==1.0.3 +PyYAML==3.13 +qrcode==6.0 +redis==2.10.6 +requests==2.19.1 +rq==0.12.0 +rq-dashboard==0.3.12 +six==1.11.0 +SQLAlchemy==1.2.10 +sqlalchemy-citext==1.3.post0 +SQLAlchemy-Continuum==1.3.6 +SQLAlchemy-Utils==0.33.3 +urllib3==1.23 +uWSGI==2.0.17.1 +Werkzeug==0.14.1 +whitenoise==3.3.1 +WTForms==2.2.1