Skip to content

Commit

Permalink
Update to Trac 1.6 and Python 3.8 (finally 🎉)
Browse files Browse the repository at this point in the history
Still running Django 1.11 which is technically not compatible
with Python 3.8 but our test suite seems to pass.
  • Loading branch information
bmispelon committed Feb 6, 2024
1 parent eb16ed0 commit 8182463
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 71 deletions.
9 changes: 5 additions & 4 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,18 @@ jobs:
uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.7'
python-version: '3.8'
- run: pip install "tinycss2>=1.2.0"
- run: python noshadows.py --tests

tracdjangoplugin:
runs-on: ubuntu-latest
container:
image: python:2.7.18-buster
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.8'
- name: Install requirements
run: python -m pip install -r requirements.txt
- name: Run tests
Expand Down
5 changes: 2 additions & 3 deletions DjangoPlugin/tracdjangoplugin/plugins.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
from urlparse import urlparse
from urllib.parse import urlparse

from trac.core import Component, implements
from trac.web.chrome import INavigationContributor
from trac.web.api import IRequestFilter, IRequestHandler, RequestDone
from trac.web.auth import LoginModule
from trac.wiki.web_ui import WikiModule
from trac.util import Markup
from trac.util.html import tag
from tracext.github import GitHubBrowser

Expand Down Expand Up @@ -82,7 +81,7 @@ def get_navigation_items(self, req):
(
"mainnav",
"custom_reports",
Markup('<a href="%s">Reports</a>' % req.href.wiki("Reports")),
tag.a("Reports", href=req.href.wiki("Reports")),
),
]

Expand Down
88 changes: 39 additions & 49 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,62 +1,52 @@
# The official python:2.7 image no longer receives automatic rebuilds (it's
# a year old as of October, 2021), so use the latest LTS release of Ubuntu
# that includes Python 2.7 instead.
FROM ubuntu:20.04

# Install packages needed to run your application (not build deps).
RUN set -x \
&& RUN_DEPS=" \
ca-certificates \
git \
libpq5 \
make \
postgresql-client \
python2.7 \
" \
&& apt-get update && apt-get install -y --no-install-recommends $RUN_DEPS \
# pull official base image
FROM python:3.8-slim-bullseye

# set work directory
WORKDIR /code

# set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# install deb packages
RUN apt-get update \
&& apt-get install --assume-yes --no-install-recommends \
git \
make \
postgresql-client-13 \
&& rm -rf /var/lib/apt/lists/*

# Copy requirements
ADD requirements.txt /requirements.txt
ADD DjangoPlugin /DjangoPlugin

# Install build deps, then run `pip install`, then remove unneeded build deps all in a single step.
# Correct the path to your production requirements file, if needed.
# For installing a python2.7-compatible pip: https://stackoverflow.com/a/54335642/166053
# Since we are using the system Python, also isolate the code in its own virtualenv.
RUN set -x \
&& BUILD_DEPS=" \
build-essential \
libpq-dev \
python2.7-dev \
wget \
" \
&& apt-get update && apt-get install -y --no-install-recommends $BUILD_DEPS \
&& wget -q -O /tmp/get-pip.py https://bootstrap.pypa.io/pip/2.7/get-pip.py \
&& python2.7 /tmp/get-pip.py \
&& rm /tmp/get-pip.py \
&& python2.7 -m pip install virtualenv \
&& virtualenv /venv \
&& /venv/bin/python -m pip install --no-cache-dir -r /requirements.txt \
\
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false $BUILD_DEPS \
# install python dependencies
COPY ./requirements.txt ./requirements.txt
COPY ./DjangoPlugin ./DjangoPlugin

RUN apt-get update \
&& apt-get install --assume-yes --no-install-recommends \
g++ \
gcc \
libc6-dev \
libpq-dev \
&& python3 -m pip install --no-cache-dir -r requirements.txt \
&& apt-get purge --assume-yes --auto-remove \
gcc \
libc6-dev \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*

# Copy application code
RUN mkdir /code/
WORKDIR /code/
ADD . /code/
COPY ./docker-entrypoint.sh ./docker-entrypoint.sh
COPY ./Makefile ./Makefile
COPY ./scss ./scss
COPY ./trac-env ./trac-env
RUN make compile-scss
RUN rm -r ./scss

RUN PATH=/venv/bin:${PATH} make compile-scss

VOLUME /code/trac-env/files/

# gunicorn or tracd will listen on this port
EXPOSE 9000

ENV DJANGO_SETTINGS_MODULE=tracdjangoplugin.settings TRAC_ENV=/code/trac-env/

ENTRYPOINT ["/code/docker-entrypoint.sh"]
ENTRYPOINT ["./docker-entrypoint.sh"]

# Start gunicorn
CMD ["/venv/bin/gunicorn", "tracdjangoplugin.wsgi:application", "--bind", "0.0.0.0:9000", "--workers", "8", "--max-requests", "1000"]
CMD ["gunicorn", "tracdjangoplugin.wsgi:application", "--bind", "0.0.0.0:9000", "--workers", "8", "--max-requests", "1000"]
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ services:
build:
context: ./
dockerfile: Dockerfile
command: ["/venv/bin/tracd", "--port", "9000", "-s", "trac-env"]
command: ["tracd", "--port", "9000", "-s", "trac-env"]
environment:
- TRAC_INI_database=postgres://code.djangoproject:secret@db/code.djangoproject
volumes:
Expand Down
4 changes: 2 additions & 2 deletions docker-entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ set -e
# database = postgres://...

for var in "${!TRAC_INI_@}"; do
sed -i "s;^${var:9} = .*;${var:9} = ${!var};" trac-env/conf/trac.ini
sed -i "s;^${var:9} = .*;${var:9} = ${!var};" /code/trac-env/conf/trac.ini
done

if [ "x$TRAC_COLLECT_STATIC" = 'xon' ]; then
# Collect trac static files to be served by nginx
/venv/bin/trac-admin ./trac-env/ deploy ./static/
trac-admin /code/trac-env/ deploy ./static/
fi

exec "$@"
19 changes: 7 additions & 12 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
# spam-filter doesn't work without babel (but somehow doesn't list it in its requirements)
Trac[pygments, babel]==1.4.4
Trac[pygments, babel]==1.6.0
dnspython==1.15
spambayes == 1.1b1
psycopg2==2.7.6.1 --no-binary=psycopg2
docutils==0.14
psycopg2==2.9.9 --no-binary=psycopg2
Django==1.11.29
libsass==0.17.0
Genshi==0.7.7 # still required by some plugins
libsass==0.23.0

# Trac plugins
https://trac.edgewall.org/browser/plugins/1.4/spam-filter?format=zip
# TracXMLRPC from PyPI does not (yet) have a 1.2.0 release (compatible with Trac 1.4)
https://trac.edgewall.org/browser/plugins/trunk/spam-filter?rev=17752&format=zip
# TracXMLRPC from PyPI does not (yet) have a 1.2.0 release (compatible with Trac >=1.4)
https://trac-hacks.org/browser/xmlrpcplugin/trunk?rev=18591&format=zip

oauthlib==2.1.0
requests==2.20.1
requests-oauthlib==1.0.0
trac-github==2.3
# No pypi release compatible with trac 1.6 yet
trac-github[oauth] @ git+https://github.com/bmispelon/trac-github.git@trac-1.6-py3

gunicorn==19.10.0
sentry-sdk==1.11.0
Expand Down

0 comments on commit 8182463

Please sign in to comment.