diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 69783a17..8be83136 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -28,7 +28,7 @@ jobs: key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }} - uses: pre-commit/action@v3.0.0 - build-test-push: + test: runs-on: ubuntu-22.04 needs: pre-commit strategy: @@ -53,12 +53,6 @@ jobs: pg_version: "14" python_version: "3.9" env: - # Indicates what's the equivalent to tecnativa/doodba:latest image - LATEST_RELEASE: "17.0" - # Variables found by default in Docker Hub builder - DOCKER_REPO: tecnativa/doodba - DOCKER_TAG: ${{ matrix.odoo_version }} - GIT_SHA1: ${{ github.sha }} # Other variables to configure tests and execution environment DOCKER_BUILDKIT: 1 PG_VERSIONS: ${{ matrix.pg_version }} @@ -76,22 +70,76 @@ jobs: # to get rid of AttributeError: cython_sources when installing pyyaml - run: poetry add pyyaml==5.3.1 - run: poetry install - # Build images - - run: poetry run ./hooks/build # Test - run: poetry run python -m unittest -v tests - # Push - - name: push to docker hub - if: github.repository == 'Tecnativa/doodba' && github.ref == 'refs/heads/master' - env: - REGISTRY_HOST: docker.io - REGISTRY_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} - REGISTRY_USERNAME: ${{ secrets.DOCKERHUB_LOGIN }} - run: poetry run ./hooks/push - - name: push to github container registry - if: github.repository == 'Tecnativa/doodba' && github.ref == 'refs/heads/master' - env: - REGISTRY_HOST: ghcr.io - REGISTRY_PASSWORD: ${{ secrets.BOT_TOKEN }} - REGISTRY_USERNAME: ${{ secrets.BOT_LOGIN }} - run: poetry run ./hooks/push + + build-push: + runs-on: ubuntu-22.04 + needs: test + strategy: + fail-fast: false + matrix: + # Test modern Odoo versions with latest Postgres version + odoo_version: ["17.0"] + platforms: ["linux/amd64,linux/arm64"] + include: + # Older odoo versions don't support latest postgres and Python versions + - odoo_version: "16.0" + platforms: "linux/amd64,linux/arm64" + - odoo_version: "15.0" + platforms: "linux/amd64,linux/arm64" + - odoo_version: "14.0" + platforms: "linux/amd64,linux/arm64" + - odoo_version: "13.0" + platforms: "linux/amd64" + env: + # Indicates what's the equivalent to tecnativa/doodba:latest image + LATEST_RELEASE: "17.0" + # Define the docker hub repository location and github container registry host + DOCKER_REPO: tecnativa/doodba + GHCR_HOST: ghcr.io + steps: + # Set build date as env variable to be used later + - name: Set build date + run: echo "BUILD_DATE=$(date '+%Y-%m-%dT%H:%M:%S.%N%:z')" >> $GITHUB_ENV + # Prepare + - uses: actions/checkout@v4 + # Setup QEMU + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + # Setup buildx + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub + if: github.repository == 'tecnativa/doodba' && github.ref == 'refs/heads/master' + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_LOGIN }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to GitHub Container Registry + if: github.repository == 'tecnativa/doodba' && github.ref == 'refs/heads/master' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + file: ./${{ matrix.odoo_version }}.Dockerfile + platforms: ${{ matrix.platforms }} + push: + ${{ github.repository == 'tecnativa/doodba' && github.ref == + 'refs/heads/master' }} + tags: | + ${{ env.DOCKER_REPO }}:${{ matrix.odoo_version }}onbuild + ${{ env.DOCKER_REPO }}:${{ matrix.odoo_version }}-onbuild + ${{ env.GHCR_HOST }}/${{ env.DOCKER_REPO }}${{ env.DOCKER_REPO_SUFFIX }}:${{ matrix.odoo_version }} + ${{ env.GHCR_HOST }}/${{ env.DOCKER_REPO }}${{ env.DOCKER_REPO_SUFFIX }}:${{ matrix.odoo_version }}-onbuild + ${{ matrix.odoo_version == env.LATEST_RELEASE && format('{0}:latest', env.DOCKER_REPO) || '' }} + ${{ matrix.odoo_version == env.LATEST_RELEASE && format('{0}/{1}{2}:latest', env.GHCR_HOST, env.DOCKER_REPO, env.DOCKER_REPO_SUFFIX) || '' }} + build-args: | + VCS_REF=${{ github.sha }} + BUILD_DATE=${{ env.BUILD_DATE }} + ODOO_VERSION=${{ matrix.odoo_version }} diff --git a/14.0.Dockerfile b/14.0.Dockerfile index 889cbd5d..51e31e52 100644 --- a/14.0.Dockerfile +++ b/14.0.Dockerfile @@ -2,9 +2,11 @@ FROM python:3.8-slim-buster AS base EXPOSE 8069 8072 -ARG GEOIP_UPDATER_VERSION=4.3.0 +ARG TARGETARCH +ARG GEOIP_UPDATER_VERSION=6.0.0 ARG WKHTMLTOPDF_VERSION=0.12.5 -ARG WKHTMLTOPDF_CHECKSUM='dfab5506104447eef2530d1adb9840ee3a67f30caaad5e9bcb8743ef2f9421bd' +ARG WKHTMLTOPDF_AMD64_CHECKSUM='dfab5506104447eef2530d1adb9840ee3a67f30caaad5e9bcb8743ef2f9421bd' +ARG WKHTMLTOPDF_ARM64_CHECKSUM="3344e3a72f4cb4c1218cf48ac5fa9e88bef62aa7fa6f2295be7d5bc1fef100b1" ENV DB_FILTER=.* \ DEPTH_DEFAULT=1 \ DEPTH_MERGE=100 \ @@ -35,8 +37,25 @@ ENV DB_FILTER=.* \ # See https://github.com/$ODOO_SOURCE/blob/$ODOO_VERSION/debian/control RUN apt-get -qq update \ && apt-get install -yqq --no-install-recommends \ - curl \ - && curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.buster_amd64.deb \ + curl; \ + if [ "$TARGETARCH" = "arm64" ]; then \ + if [ "$WKHTMLTOPDF_VERSION" != "0.12.6.1" ]; then \ + echo "Error: WKHTMLTOPDF_VERSION must be exactly 0.12.6.1 for arm builds. Forcing version to 0.12.6.1"; \ + export WKHTMLTOPDF_VERSION="0.12.6.1";\ + fi; \ + WKHTMLTOPDF_URL="https://github.com/wkhtmltopdf/packaging/releases/download/${WKHTMLTOPDF_VERSION}-2/wkhtmltox_${WKHTMLTOPDF_VERSION}-2.bullseye_${TARGETARCH}.deb" \ + WKHTMLTOPDF_CHECKSUM=$WKHTMLTOPDF_ARM64_CHECKSUM; \ + elif [ "$TARGETARCH" = "amd64" ]; then \ + WKHTMLTOPDF_URL="https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.buster_${TARGETARCH}.deb" \ + WKHTMLTOPDF_CHECKSUM=$WKHTMLTOPDF_AMD64_CHECKSUM; \ + else \ + echo "Unsupported architecture: $TARGETARCH" >&2; \ + exit 1; \ + fi \ + && curl -SLo wkhtmltox.deb ${WKHTMLTOPDF_URL} \ + && echo "Downloading wkhtmltopdf from: ${WKHTMLTOPDF_URL}" \ + && echo "Expected wkhtmltox checksum: ${WKHTMLTOPDF_CHECKSUM}" \ + && echo "Computed wkhtmltox checksum: $(sha256sum wkhtmltox.deb | awk '{ print $1 }')" \ && echo "${WKHTMLTOPDF_CHECKSUM} wkhtmltox.deb" | sha256sum -c - \ && apt-get install -yqq --no-install-recommends \ ./wkhtmltox.deb \ @@ -56,9 +75,9 @@ RUN apt-get -qq update \ && echo 'deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main' >> /etc/apt/sources.list.d/postgresql.list \ && curl -SL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ && apt-get update \ - && curl --silent -L --output geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb https://github.com/maxmind/geoipupdate/releases/download/v${GEOIP_UPDATER_VERSION}/geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ - && dpkg -i geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ - && rm geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ + && curl --silent -L --output geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb https://github.com/maxmind/geoipupdate/releases/download/v${GEOIP_UPDATER_VERSION}/geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb \ + && dpkg -i geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb \ + && rm geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb \ && apt-get autopurge -yqq \ && rm -Rf wkhtmltox.deb /var/lib/apt/lists/* /tmp/* \ && sync @@ -118,8 +137,14 @@ RUN build_deps=" \ " \ && apt-get update \ && apt-get install -yqq --no-install-recommends $build_deps \ - && pip install \ - -r https://raw.githubusercontent.com/$ODOO_SOURCE/$ODOO_VERSION/requirements.txt \ + && curl -o requirements.txt https://raw.githubusercontent.com/$ODOO_SOURCE/$ODOO_VERSION/requirements.txt \ + && \ + if [ "$TARGETARCH" = "arm64" ]; then \ + echo "Upgrading odoo requirements.txt with gevent==21.12.0 and greenlet==1.1.0 (minimum versions compatible with arm64)" && \ + sed -i 's/gevent==[0-9\.]*/gevent==21.12.0/' requirements.txt && \ + sed -i 's/greenlet==[0-9\.]*/greenlet==1.1.0/' requirements.txt; \ + fi \ + && pip install -r requirements.txt \ 'websocket-client~=0.56' \ astor \ # Install fix from https://github.com/acsone/click-odoo-contrib/pull/93 diff --git a/15.0.Dockerfile b/15.0.Dockerfile index 311f30ec..1bb05d65 100644 --- a/15.0.Dockerfile +++ b/15.0.Dockerfile @@ -2,9 +2,11 @@ FROM python:3.8-slim-bullseye AS base EXPOSE 8069 8072 -ARG GEOIP_UPDATER_VERSION=4.3.0 +ARG TARGETARCH +ARG GEOIP_UPDATER_VERSION=6.0.0 ARG WKHTMLTOPDF_VERSION=0.12.5 -ARG WKHTMLTOPDF_CHECKSUM='dfab5506104447eef2530d1adb9840ee3a67f30caaad5e9bcb8743ef2f9421bd' +ARG WKHTMLTOPDF_AMD64_CHECKSUM='dfab5506104447eef2530d1adb9840ee3a67f30caaad5e9bcb8743ef2f9421bd' +ARG WKHTMLTOPDF_ARM64_CHECKSUM="3344e3a72f4cb4c1218cf48ac5fa9e88bef62aa7fa6f2295be7d5bc1fef100b1" ENV DB_FILTER=.* \ DEPTH_DEFAULT=1 \ DEPTH_MERGE=100 \ @@ -35,8 +37,25 @@ ENV DB_FILTER=.* \ # See https://github.com/$ODOO_SOURCE/blob/$ODOO_VERSION/debian/control RUN apt-get -qq update \ && apt-get install -yqq --no-install-recommends \ - curl \ - && curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.buster_amd64.deb \ + curl; \ + if [ "$TARGETARCH" = "arm64" ]; then \ + if [ "$WKHTMLTOPDF_VERSION" != "0.12.6.1" ]; then \ + echo "Error: WKHTMLTOPDF_VERSION must be exactly 0.12.6.1 for arm builds. Forcing version to 0.12.6.1"; \ + export WKHTMLTOPDF_VERSION="0.12.6.1";\ + fi; \ + WKHTMLTOPDF_URL="https://github.com/wkhtmltopdf/packaging/releases/download/${WKHTMLTOPDF_VERSION}-2/wkhtmltox_${WKHTMLTOPDF_VERSION}-2.bullseye_${TARGETARCH}.deb" \ + WKHTMLTOPDF_CHECKSUM=$WKHTMLTOPDF_ARM64_CHECKSUM; \ + elif [ "$TARGETARCH" = "amd64" ]; then \ + WKHTMLTOPDF_URL="https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_${WKHTMLTOPDF_VERSION}-1.buster_${TARGETARCH}.deb" \ + WKHTMLTOPDF_CHECKSUM=$WKHTMLTOPDF_AMD64_CHECKSUM; \ + else \ + echo "Unsupported architecture: $TARGETARCH" >&2; \ + exit 1; \ + fi \ + && curl -SLo wkhtmltox.deb ${WKHTMLTOPDF_URL} \ + && echo "Downloading wkhtmltopdf from: ${WKHTMLTOPDF_URL}" \ + && echo "Expected wkhtmltox checksum: ${WKHTMLTOPDF_CHECKSUM}" \ + && echo "Computed wkhtmltox checksum: $(sha256sum wkhtmltox.deb | awk '{ print $1 }')" \ && echo "${WKHTMLTOPDF_CHECKSUM} wkhtmltox.deb" | sha256sum -c - \ && apt-get install -yqq --no-install-recommends \ ./wkhtmltox.deb \ @@ -55,9 +74,9 @@ RUN apt-get -qq update \ && echo 'deb http://apt.postgresql.org/pub/repos/apt/ bullseye-pgdg main' >> /etc/apt/sources.list.d/postgresql.list \ && curl -SL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ && apt-get update \ - && curl --silent -L --output geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb https://github.com/maxmind/geoipupdate/releases/download/v${GEOIP_UPDATER_VERSION}/geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ - && dpkg -i geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ - && rm geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ + && curl --silent -L --output geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb https://github.com/maxmind/geoipupdate/releases/download/v${GEOIP_UPDATER_VERSION}/geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb \ + && dpkg -i geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb \ + && rm geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb \ && apt-get autopurge -yqq \ && rm -Rf wkhtmltox.deb /var/lib/apt/lists/* /tmp/* \ && sync @@ -116,8 +135,14 @@ RUN build_deps=" \ " \ && apt-get update \ && apt-get install -yqq --no-install-recommends $build_deps \ - && pip install \ - -r https://raw.githubusercontent.com/$ODOO_SOURCE/$ODOO_VERSION/requirements.txt \ + && curl -o requirements.txt https://raw.githubusercontent.com/$ODOO_SOURCE/$ODOO_VERSION/requirements.txt \ + && \ + if [ "$TARGETARCH" = "arm64" ]; then \ + echo "Upgrading odoo requirements.txt with gevent==21.12.0 and greenlet==1.1.0 (minimum versions compatible with arm64)" && \ + sed -i 's/gevent==[0-9\.]*/gevent==21.12.0/' requirements.txt && \ + sed -i 's/greenlet==[0-9\.]*/greenlet==1.1.0/' requirements.txt; \ + fi \ + && pip install -r requirements.txt \ 'websocket-client~=0.56' \ astor \ click-odoo-contrib \ diff --git a/16.0.Dockerfile b/16.0.Dockerfile index b41dbc3b..6ec59ab2 100644 --- a/16.0.Dockerfile +++ b/16.0.Dockerfile @@ -2,13 +2,17 @@ FROM python:3.10-slim-bookworm AS base EXPOSE 8069 8072 -ARG GEOIP_UPDATER_VERSION=4.3.0 +ARG TARGETARCH +ARG GEOIP_UPDATER_VERSION=6.0.0 ARG WKHTMLTOPDF_VERSION=0.12.6.1 -ARG WKHTMLTOPDF_CHECKSUM='98ba0d157b50d36f23bd0dedf4c0aa28c7b0c50fcdcdc54aa5b6bbba81a3941d' +ARG WKHTMLTOPDF_AMD64_CHECKSUM='98ba0d157b50d36f23bd0dedf4c0aa28c7b0c50fcdcdc54aa5b6bbba81a3941d' +ARG WKHTMLTOPDF_ARM64_CHECKSUM="b6606157b27c13e044d0abbe670301f88de4e1782afca4f9c06a5817f3e03a9c" +ARG WKHTMLTOPDF_URL="https://github.com/wkhtmltopdf/packaging/releases/download/${WKHTMLTOPDF_VERSION}-3/wkhtmltox_${WKHTMLTOPDF_VERSION}-3.bookworm_${TARGETARCH}.deb" ARG LAST_SYSTEM_UID=499 ARG LAST_SYSTEM_GID=499 ARG FIRST_UID=500 ARG FIRST_GID=500 + ENV DB_FILTER=.* \ DEPTH_DEFAULT=1 \ DEPTH_MERGE=100 \ @@ -35,16 +39,27 @@ ENV DB_FILTER=.* \ WDB_WEB_PORT=1984 \ WDB_WEB_SERVER=localhost + # Other requirements and recommendations # See https://github.com/$ODOO_SOURCE/blob/$ODOO_VERSION/debian/control RUN echo "LAST_SYSTEM_UID=$LAST_SYSTEM_UID\nLAST_SYSTEM_GID=$LAST_SYSTEM_GID\nFIRST_UID=$FIRST_UID\nFIRST_GID=$FIRST_GID" >> /etc/adduser.conf \ - && echo "SYS_UID_MAX $LAST_SYSTEM_UID\nSYS_GID_MAX $LAST_SYSTEM_GID" >> /etc/login.defs \ - && sed -i -E "s/^UID_MIN\s+[0-9]+.*/UID_MIN $FIRST_UID/;s/^GID_MIN\s+[0-9]+.*/GID_MIN $FIRST_GID/" /etc/login.defs \ + && echo "SYS_UID_MAX $LAST_SYSTEM_UID\nSYS_GID_MAX $LAST_SYSTEM_GID" >> /etc/login.defs \ + && sed -i -E "s/^UID_MIN\s+[0-9]+.*/UID_MIN $FIRST_UID/;s/^GID_MIN\s+[0-9]+.*/GID_MIN $FIRST_GID/" /etc/login.defs \ && useradd --system -u $LAST_SYSTEM_UID -s /usr/sbin/nologin -d / systemd-network \ && apt-get -qq update \ - && apt-get install -yqq --no-install-recommends \ - curl \ - && curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/packaging/releases/download/${WKHTMLTOPDF_VERSION}-3/wkhtmltox_${WKHTMLTOPDF_VERSION}-3.bookworm_amd64.deb \ + && apt-get install -yqq --no-install-recommends curl \ + && if [ "$TARGETARCH" = "arm64" ]; then \ + WKHTMLTOPDF_CHECKSUM=$WKHTMLTOPDF_ARM64_CHECKSUM; \ + elif [ "$TARGETARCH" = "amd64" ]; then \ + WKHTMLTOPDF_CHECKSUM=$WKHTMLTOPDF_AMD64_CHECKSUM; \ + else \ + echo "Unsupported architecture: $TARGETARCH" >&2; \ + exit 1; \ + fi \ + && curl -SLo wkhtmltox.deb ${WKHTMLTOPDF_URL} \ + && echo "Downloading wkhtmltopdf from: ${WKHTMLTOPDF_URL}" \ + && echo "Expected wkhtmltox checksum: ${WKHTMLTOPDF_CHECKSUM}" \ + && echo "Computed wkhtmltox checksum: $(sha256sum wkhtmltox.deb | awk '{ print $1 }')" \ && echo "${WKHTMLTOPDF_CHECKSUM} wkhtmltox.deb" | sha256sum -c - \ && apt-get install -yqq --no-install-recommends \ ./wkhtmltox.deb \ @@ -63,9 +78,9 @@ RUN echo "LAST_SYSTEM_UID=$LAST_SYSTEM_UID\nLAST_SYSTEM_GID=$LAST_SYSTEM_GID\nFI RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ bookworm-pgdg main' >> /etc/apt/sources.list.d/postgresql.list \ && curl -SL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ && apt-get update \ - && curl --silent -L --output geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb https://github.com/maxmind/geoipupdate/releases/download/v${GEOIP_UPDATER_VERSION}/geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ - && dpkg -i geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ - && rm geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ + && curl --silent -L --output geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb https://github.com/maxmind/geoipupdate/releases/download/v${GEOIP_UPDATER_VERSION}/geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb \ + && dpkg -i geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb \ + && rm geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb \ && apt-get autopurge -yqq \ && rm -Rf wkhtmltox.deb /var/lib/apt/lists/* /tmp/* \ && sync @@ -124,8 +139,14 @@ RUN build_deps=" \ " \ && apt-get update \ && apt-get install -yqq --no-install-recommends $build_deps \ - && pip install \ - -r https://raw.githubusercontent.com/$ODOO_SOURCE/$ODOO_VERSION/requirements.txt \ + && curl -o requirements.txt https://raw.githubusercontent.com/$ODOO_SOURCE/$ODOO_VERSION/requirements.txt \ + && \ + if [ "$TARGETARCH" = "arm64" ]; then \ + echo "Upgrading odoo requirements.txt with gevent==21.12.0 and greenlet==1.1.0 (minimum version compatible with arm64)" && \ + sed -i 's/gevent==[0-9\.]*/gevent==21.12.0/' requirements.txt && \ + sed -i 's/greenlet==[0-9\.]*/greenlet==1.1.0/' requirements.txt; \ + fi \ + && pip install -r requirements.txt \ 'websocket-client~=0.56' \ astor \ click-odoo-contrib \ diff --git a/17.0.Dockerfile b/17.0.Dockerfile index 432cf503..94bec602 100644 --- a/17.0.Dockerfile +++ b/17.0.Dockerfile @@ -2,9 +2,12 @@ FROM python:3.10-slim-bookworm AS base EXPOSE 8069 8072 -ARG GEOIP_UPDATER_VERSION=4.3.0 +ARG TARGETARCH +ARG GEOIP_UPDATER_VERSION=6.0.0 ARG WKHTMLTOPDF_VERSION=0.12.6.1 -ARG WKHTMLTOPDF_CHECKSUM='98ba0d157b50d36f23bd0dedf4c0aa28c7b0c50fcdcdc54aa5b6bbba81a3941d' +ARG WKHTMLTOPDF_AMD64_CHECKSUM='98ba0d157b50d36f23bd0dedf4c0aa28c7b0c50fcdcdc54aa5b6bbba81a3941d' +ARG WKHTMLTOPDF_ARM64_CHECKSUM="b6606157b27c13e044d0abbe670301f88de4e1782afca4f9c06a5817f3e03a9c" +ARG WKHTMLTOPDF_URL="https://github.com/wkhtmltopdf/packaging/releases/download/${WKHTMLTOPDF_VERSION}-3/wkhtmltox_${WKHTMLTOPDF_VERSION}-3.bookworm_${TARGETARCH}.deb" ARG LAST_SYSTEM_UID=499 ARG LAST_SYSTEM_GID=499 ARG FIRST_UID=500 @@ -44,7 +47,18 @@ RUN echo -e "LAST_SYSTEM_UID=$LAST_SYSTEM_UID\nLAST_SYSTEM_GID=$LAST_SYSTEM_GID\ && apt-get -qq update \ && apt-get install -yqq --no-install-recommends \ curl \ - && curl -SLo wkhtmltox.deb https://github.com/wkhtmltopdf/packaging/releases/download/${WKHTMLTOPDF_VERSION}-3/wkhtmltox_${WKHTMLTOPDF_VERSION}-3.bookworm_amd64.deb \ + && if [ "$TARGETARCH" = "arm64" ]; then \ + WKHTMLTOPDF_CHECKSUM=$WKHTMLTOPDF_ARM64_CHECKSUM; \ + elif [ "$TARGETARCH" = "amd64" ]; then \ + WKHTMLTOPDF_CHECKSUM=$WKHTMLTOPDF_AMD64_CHECKSUM; \ + else \ + echo "Unsupported architecture: $TARGETARCH" >&2; \ + exit 1; \ + fi \ + && curl -SLo wkhtmltox.deb ${WKHTMLTOPDF_URL} \ + && echo "Downloading wkhtmltopdf from: ${WKHTMLTOPDF_URL}" \ + && echo "Expected wkhtmltox checksum: ${WKHTMLTOPDF_CHECKSUM}" \ + && echo "Computed wkhtmltox checksum: $(sha256sum wkhtmltox.deb | awk '{ print $1 }')" \ && echo "${WKHTMLTOPDF_CHECKSUM} wkhtmltox.deb" | sha256sum -c - \ && apt-get install -yqq --no-install-recommends \ ./wkhtmltox.deb \ @@ -63,9 +77,9 @@ RUN echo -e "LAST_SYSTEM_UID=$LAST_SYSTEM_UID\nLAST_SYSTEM_GID=$LAST_SYSTEM_GID\ RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ bookworm-pgdg main' >> /etc/apt/sources.list.d/postgresql.list \ && curl -SL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ && apt-get update \ - && curl --silent -L --output geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb https://github.com/maxmind/geoipupdate/releases/download/v${GEOIP_UPDATER_VERSION}/geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ - && dpkg -i geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ - && rm geoipupdate_${GEOIP_UPDATER_VERSION}_linux_amd64.deb \ + && curl --silent -L --output geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb https://github.com/maxmind/geoipupdate/releases/download/v${GEOIP_UPDATER_VERSION}/geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb \ + && dpkg -i geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb \ + && rm geoipupdate_${GEOIP_UPDATER_VERSION}_linux_${TARGETARCH}.deb \ && apt-get autopurge -yqq \ && rm -Rf wkhtmltox.deb /var/lib/apt/lists/* /tmp/* \ && sync @@ -124,8 +138,13 @@ RUN build_deps=" \ " \ && apt-get update \ && apt-get install -yqq --no-install-recommends $build_deps \ - && pip install \ - -r https://raw.githubusercontent.com/$ODOO_SOURCE/$ODOO_VERSION/requirements.txt \ + && curl -o requirements.txt https://raw.githubusercontent.com/$ODOO_SOURCE/$ODOO_VERSION/requirements.txt \ + && \ + if [ "$TARGETARCH" = "arm64" ]; then \ + echo "Upgrading odoo requirements.txt with gevent==21.12.0 (minimum version compatible with arm64)" && \ + sed -i 's/gevent==[0-9\.]*/gevent==21.12.0/' requirements.txt; \ + fi \ + && pip install -r requirements.txt \ 'websocket-client~=0.56' \ astor \ click-odoo-contrib \ diff --git a/hooks/build b/hooks/build deleted file mode 100755 index 2fc238b3..00000000 --- a/hooks/build +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -from plumbum import FG, local - -REPO = local.env["DOCKER_REPO"] -VERSION = local.env["DOCKER_TAG"] -ROOT = local.path(__file__).up(2) -COMMIT = local.env.get("GIT_SHA1", local.env.get("TRAVIS_COMMIT", "")) - -# Shortcuts -build = local["time"]["docker", "image", "build"] -date = local["date"]["--rfc-3339", "ns"] -tag = local["docker"]["image", "tag"] - -# Build base and onbuild images -for target, suffix in (("base", ""), ("onbuild", "-onbuild")): - image_name = "%s:%s%s" % (REPO, VERSION, suffix) - ( - build[ - "--build-arg", - "VCS_REF=%s" % COMMIT, - "--build-arg", - "BUILD_DATE=%s" % date().strip(), - "--build-arg", - "ODOO_VERSION=%s" % VERSION, - "--tag", - image_name, - "--target", - target, - "--file", - "%s.Dockerfile" % VERSION, - ROOT, - ] - & FG - ) - - # Tag "latest" image if applicable - if VERSION == local.env.get("LATEST_RELEASE"): - tag[image_name, "%s:latest%s" % (REPO, suffix)] & FG diff --git a/hooks/push b/hooks/push deleted file mode 100755 index d71bc724..00000000 --- a/hooks/push +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -from plumbum import FG, local -from plumbum.cmd import docker # noqa pylint: disable=import-error - -REGISTRY = local.env["REGISTRY_HOST"] -REPO = local.env["DOCKER_REPO"] -REPO_SUFFIX = local.env.get("DOCKER_REPO_SUFFIX", "") -VERSION = local.env["DOCKER_TAG"] - -# Log all locally available images; will help to pin images -docker["image", "ls", "--digests", REPO] & FG - -# Login in Docker Hub -docker( - "login", - "--username", - local.env["REGISTRY_USERNAME"], - "--password", - local.env["REGISTRY_PASSWORD"], - REGISTRY, -) - -# Push built images -for suffix in ("", "-onbuild"): - # Prefix images with registry - local_tag = f"{REPO}:{VERSION}{suffix}" - public_tag = f"{REGISTRY}/{REPO}{REPO_SUFFIX}:{VERSION}{suffix}" - docker["image", "tag", local_tag, public_tag] & FG - # Push to registry - docker["image", "push", public_tag] & FG - if VERSION == local.env.get("LATEST_RELEASE"): - public_latest_tag = f"{REGISTRY}/{REPO}{REPO_SUFFIX}:latest{suffix}" - docker["image", "tag", local_tag, public_latest_tag] & FG - docker["image", "push", public_latest_tag] & FG