Skip to content

Commit d95bbba

Browse files
psychomantyspaulobernardoaf
authored andcommitted
Change docker and cache
1 parent 1066d66 commit d95bbba

File tree

9 files changed

+258
-497
lines changed

9 files changed

+258
-497
lines changed

.dockerignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,10 @@ sitestatic
33
env
44
.env
55
temba/settings.py
6+
.git
7+
.github
8+
Dockerfile
9+
.dockerignore
10+
.gitignore
11+
usr
12+
venv

.github/workflows/build-flows-push-tag-shared.yaml

Lines changed: 73 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,22 @@ jobs:
1212
runs-on: ubuntu-latest
1313
steps:
1414
- name: Check out the repo
15-
uses: actions/checkout@v3
15+
uses: actions/checkout@v4
16+
if: github.event_name != 'pull_request'
1617
with:
1718
ref: "${{env.GITHUB_SHA}}"
1819
token: ${{ secrets.DEVOPS_GITHUB_PERMANENT_TOKEN }}
1920

21+
#- name: Docker meta
22+
# id: meta
23+
# uses: docker/metadata-action@v5
24+
# with:
25+
# images: push-backend
26+
# tags: |
27+
# type=semver,pattern={{version}}-develop
28+
# type=semver,pattern={{version}}-staging
29+
# type=semver,pattern={{version}}
30+
2031
- name: Set variables
2132
run: |
2233
TAG="$( echo "${GITHUB_REF}" | cut -d'/' -f3 )"
@@ -41,8 +52,7 @@ jobs:
4152
echo "IMAGE_SOURCE_URL=https://github.com/weni-ai/flows" | tee -a "${GITHUB_ENV}"
4253
echo "MANIFESTS_REPOSITORY=weni-ai/kubernetes-manifests-platform" | tee -a "${GITHUB_ENV}"
4354
echo "MANIFESTS_APPLICATION=weni-flows/flows" | tee -a "${GITHUB_ENV}"
44-
echo "MANIFESTS_PATCH_TARGET=deployment-flows.json" | tee -a "${GITHUB_ENV}"
45-
echo "MANIFESTS_PATCH_TARGET1=deployment-flows-image.json" | tee -a "${GITHUB_ENV}"
55+
echo "MANIFESTS_PATCH_TARGET=deployment-flows-image.json" | tee -a "${GITHUB_ENV}"
4656
4757
FLOWEDITOR_VERSION=$(jq -r '.dependencies["@nyaruka/flow-editor"]' < package.json)
4858
echo "FLOWEDITOR_VERSION=${FLOWEDITOR_VERSION}" | tee -a "${GITHUB_ENV}"
@@ -53,56 +63,90 @@ jobs:
5363
fi
5464
echo "FLOWEDITOR_BRANCH=$FLOWEDITOR_BRANCH" | tee -a "${GITHUB_ENV}"
5565
56-
5766
- name: Set up QEMU
58-
uses: docker/setup-qemu-action@v2
67+
uses: docker/setup-qemu-action@v3
5968

6069
- name: Set up Docker Buildx
61-
uses: docker/setup-buildx-action@v2
70+
uses: docker/setup-buildx-action@v3
6271

6372
- name: Login to ECR
64-
uses: docker/login-action@v2
73+
uses: docker/login-action@v3
74+
if: github.event_name != 'pull_request'
6575
with:
6676
registry: ${{ secrets.ECR }}
67-
username: ${{ secrets.AWS_ACCESS_KEY_ID_SHARED }}
77+
username: ${{ secrets.AWS_ACCESS_KEY_ID_SHARED }}
6878
password: ${{ secrets.AWS_SECRET_ACCESS_KEY_SHARED }}
6979

80+
# Cache
81+
- name: Cache var-cache-apt
82+
uses: actions/cache@v3
83+
with:
84+
path: var-cache-apt
85+
key: var-cache-apt-${{ hashFiles('docker/Dockerfile') }}
86+
- name: Cache var-lib-apt
87+
uses: actions/cache@v3
88+
with:
89+
path: var-lib-apt
90+
key: var-lib-apt-${{ hashFiles('docker/Dockerfile') }}
91+
- name: Cache pip
92+
uses: actions/cache@v3
93+
with:
94+
path: cache-pip
95+
key: cache-pip-${{ hashFiles('docker/Dockerfile') }}
96+
- name: Cache npm
97+
uses: actions/cache@v3
98+
with:
99+
path: cache-npm
100+
key: cache-npm-${{ hashFiles('docker/Dockerfile') }}
101+
102+
# Inject cache
103+
- name: inject var-cache-apt into docker
104+
uses: reproducible-containers/[email protected]
105+
with:
106+
cache-source: var-cache-apt
107+
cache-target: /var/cache/apt
108+
- name: inject var-lib-apt into docker
109+
uses: reproducible-containers/[email protected]
110+
with:
111+
cache-source: var-lib-apt
112+
cache-target: /var/lib/apt
113+
- name: inject pip cache into docker
114+
uses: reproducible-containers/[email protected]
115+
with:
116+
cache-source: cache-pip
117+
cache-target: /pip_cache
118+
- name: inject npm cache into docker
119+
uses: reproducible-containers/[email protected]
120+
with:
121+
cache-source: cache-npm
122+
cache-target: /npm_cache
123+
70124
- name: Build and push - Flows Image
71-
uses: docker/build-push-action@v3
125+
uses: docker/build-push-action@v5
72126
with:
127+
cache-from: type=gha
128+
cache-to: type=gha,mode=max
73129
context: .
74130
labels: |
75131
tag=${{env.TAG}}
76132
commit=${{env.COMMIT_SHA}}
77133
repository=${{env.IMAGE_SOURCE_URL}}
78134
file: docker/Dockerfile
79-
push: true
135+
push: ${{ github.event_name != 'pull_request' }}
80136
tags: "${{env.IMAGE_TAG}}"
81-
no-cache: true
137+
#tags: ${{ steps.meta.outputs.tags }}
138+
#platforms: linux/amd64,linux/arm64,linux/arm/v7,darwin/amd64,linux/arm/v8
139+
#no-cache: true
82140
build-args: |
83141
FLOWEDITOR_VERSION=${{ env.FLOWEDITOR_VERSION }}
84142
FLOWEDITOR_REPO=${{ env.FLOWEDITOR_REPO }}
85143
FLOWEDITOR_BRANCH=${{ env.FLOWEDITOR_BRANCH }}
86-
87-
- name: Build and push - Flows Varnish Image
88-
uses: docker/build-push-action@v3
89-
with:
90-
context: ./docker
91-
labels: |
92-
tag=${{env.TAG}}
93-
commit=${{env.COMMIT_SHA}}
94-
repository=${{env.IMAGE_SOURCE_URL}}
95-
file: docker/Dockerfile.varnish
96-
push: true
97-
tags: "${{env.IMAGE_TAG}}-varnish"
98-
no-cache: true
99-
build-args: |
100-
BACKEND_ADDRESS=flows:8000
101144
102145
- name: Check out Kubernetes Manifests
103146
uses: actions/checkout@master
104147
with:
105148
ref: main
149+
#ref: feature/flows-cache
106150
repository: "${{ env.MANIFESTS_REPOSITORY }}"
107151
token: "${{ secrets.DEVOPS_GITHUB_PERMANENT_TOKEN }}"
108152
path: ./kubernetes-manifests/
@@ -140,20 +184,13 @@ jobs:
140184
)
141185
echo "Old image version to compare: ${OLD_VERSION}<=${{env.VERSION}}"
142186
if verlte "${OLD_VERSION}" "${VERSION}" || [[ ! "${OLD_VERSION}" =~ [0-9]+\.[0-9]+\.[0-9]+ ]] ; then
143-
echo 'New configurations for varnish:'
144-
new_configuration=$(
145-
cat "${e}/${{ env.MANIFESTS_PATCH_TARGET }}" \
146-
| jq '(..|select(.path == "/spec/template/spec/containers/1/image")?) += {value: "'"${{env.IMAGE_TAG}}"'-varnish"}'
147-
)
148-
echo "${new_configuration}"
149-
echo "${new_configuration}" > "${e}/${{ env.MANIFESTS_PATCH_TARGET }}"
150187
echo 'New configurations for image flows:'
151188
new_configuration=$(
152-
cat "${e}/${{ env.MANIFESTS_PATCH_TARGET1 }}" \
189+
cat "${e}/${{ env.MANIFESTS_PATCH_TARGET }}" \
153190
| jq '(..|select(.path == "/spec/template/spec/containers/0/image")?) += {value: "'"${{env.IMAGE_TAG}}"'"}'
154191
)
155192
echo "${new_configuration}"
156-
echo "${new_configuration}" > "${e}/${{ env.MANIFESTS_PATCH_TARGET1 }}"
193+
echo "${new_configuration}" > "${e}/${{ env.MANIFESTS_PATCH_TARGET }}"
157194
else
158195
echo "Version in file is greater than build, skipping update yaml"
159196
fi
@@ -167,4 +204,5 @@ jobs:
167204
repository: "${{ env.MANIFESTS_REPOSITORY }}"
168205
directory: ./kubernetes-manifests/
169206
branch: main
207+
#branch: feature/flows-cache
170208
message: "From Flows Build (Push Tag ${{ env.MANIFESTS_ENVIRONMENT }})"

docker/Dockerfile

Lines changed: 99 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,125 @@
1-
FROM python:3.9-slim-bullseye as build-poetry
2-
3-
WORKDIR /app
4-
5-
COPY ./pyproject.toml .
6-
COPY ./poetry.lock .
7-
COPY ./docker/pip-requires.txt .
8-
9-
RUN python -m pip install -U poetry==1.1.15 \
10-
&& poetry cache clear -n --all pypi \
11-
&& pip install requests==2.29.0 \
12-
&& poetry add -n --lock $(cat pip-requires.txt) \
13-
&& poetry export --without-hashes --output requirements.txt
14-
15-
FROM python:3.9-slim-bullseye
1+
# syntax = docker/dockerfile:1
2+
3+
ARG PYTHON_VERSION="3.9"
4+
ARG DEBIAN_VERSION="bookworm"
5+
ARG POETRY_VERSION="1.1.15"
6+
ARG REQUESTS_VERSION="2.29.0"
7+
8+
ARG BUILD_DEPS="\
9+
gcc bzip2 git curl libpq-dev gettext \
10+
libgdal-dev python3-cffi python3-gdal \
11+
python3-dev default-libmysqlclient-dev build-essential \
12+
build-essential \
13+
git cmake \
14+
autoconf pkg-config autoconf libtool automake \
15+
libmariadb-dev npm"
16+
# default-libmysqlclient-dev
17+
ARG RUNTIME_DEPS="\
18+
git \
19+
tzdata \
20+
postgresql-client \
21+
netcat-traditional \
22+
curl \
23+
gosu \
24+
gdal-bin \
25+
npm"
26+
#libmariadb3 \
27+
28+
FROM python:${PYTHON_VERSION}-slim-${DEBIAN_VERSION} as base
29+
30+
ARG POETRY_VERSION
31+
ARG REQUESTS_VERSION
32+
ARG NODE_VERSION
33+
34+
ENV PYTHONUNBUFFERED=1 \
35+
PYTHONDONTWRITEBYTECODE=1 \
36+
DEBIAN_FRONTEND=noninteractive \
37+
PROJECT=rapidpro \
38+
PROJECT_PATH=/app \
39+
PROJECT_USER=rapidpro \
40+
PROJECT_GROUP=rapidpro \
41+
NPM_CONFIG_PREFIX=/opt/npm-globals \
42+
PIP_DISABLE_PIP_VERSION_CHECK=1 \
43+
PATH="/opt/npm-globals/bin:/app/node_modules/.bin/:${PATH}:/install/bin"
1644

1745
ARG COMPRESS_ENABLED
1846
ARG BRANDING_ENABLED
1947

2048
ARG RAPIDPRO_APPS_GIT_URL
2149
ARG RAPIDPRO_APPS_GIT_BRANCH
2250

23-
ENV PYTHONUNBUFFERED 1
24-
ENV DEBIAN_FRONTEND noninteractive
51+
LABEL app=${VERSION} \
52+
os="debian" \
53+
os.version="12" \
54+
name="Flows" \
55+
description="APP image" \
56+
maintainer="https://github.com/weni-ai" \
57+
org.opencontainers.image.url="https://github.com/weni-ai/flows" \
58+
org.opencontainers.image.documentation="https://github.com/weni-ai/flows" \
59+
org.opencontainers.image.source="https://github.com/weni-ai/flows" \
60+
org.opencontainers.image.title="Flows"
2561

26-
ENV PROJECT rapidpro
27-
ENV PROJECT_PATH /app
28-
ENV PROJECT_USER $PROJECT
29-
ENV PROJECT_GROUP $PROJECT_USER
30-
ENV PROJECT_CONF ${PROJECT_PATH}-conf
31-
ENV NPM_CONFIG_PREFIX /opt/npm-globals
32-
ENV PATH "${NPM_CONFIG_PREFIX}/bin:${PATH}"
62+
RUN addgroup --gid 1999 "${PROJECT_GROUP}" \
63+
&& useradd --system -m -d /app -u 1999 -g 1999 "${PROJECT_USER}"
3364

34-
RUN apt-get update \
35-
&& apt-get install --no-install-recommends --no-install-suggests -y apt-utils \
36-
&& apt-get install --no-install-recommends --no-install-suggests -y gcc bzip2 git curl nginx libpq-dev gettext \
37-
libgdal-dev python3-cffi python3-gdal vim
65+
WORKDIR "${PROJECT_PATH}"
3866

39-
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - \
40-
&& apt-get install --no-install-recommends --no-install-suggests -y nodejs
67+
RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache
4168

42-
RUN rm -rf /var/lib/apt/lists/*
69+
FROM base as build-poetry
4370

44-
RUN useradd -Ums /bin/bash $PROJECT_USER \
45-
&& usermod -aG adm $PROJECT_USER
71+
ARG POETRY_VERSION
72+
ARG REQUESTS_VERSION
73+
ARG NODE_VERSION
4674

47-
RUN mkdir $PROJECT_PATH \
48-
&& mkdir $PROJECT_CONF \
49-
&& mkdir $NPM_CONFIG_PREFIX \
50-
&& chown -R $PROJECT_USER:$PROJECT_GROUP $PROJECT_PATH \
51-
&& chown -R $PROJECT_USER:$PROJECT_GROUP $NPM_CONFIG_PREFIX
75+
COPY pyproject.toml poetry.lock .
5276

53-
RUN rm /etc/nginx/sites-enabled/default
77+
RUN --mount=type=cache,mode=0755,target=/pip_cache,id=pip pip install --cache-dir /pip_cache -U poetry=="${POETRY_VERSION}" \
78+
&& poetry cache clear -n --all pypi \
79+
&& pip install --cache-dir /pip_cache requests=="${REQUESTS_VERSION}" \
80+
&& poetry export --without-hashes --output requirements.txt
81+
# && poetry add -n --lock $(cat pip-requires.txt) \
5482

83+
FROM base as build
84+
85+
ARG BUILD_DEPS
86+
87+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
88+
--mount=type=cache,target=/var/lib/apt,sharing=locked \
89+
apt-get update \
90+
&& apt-get install --no-install-recommends --no-install-suggests -y ${BUILD_DEPS}
91+
5592
COPY --from=build-poetry /app/requirements.txt /tmp/dep/
56-
COPY ./docker/pip-freeze.txt /tmp/dep/
57-
COPY ./docker/nginx.site.conf /tmp/
58-
RUN pip install --no-cache-dir -r /tmp/dep/requirements.txt
93+
RUN --mount=type=cache,mode=0755,target=/pip_cache,id=pip pip install --cache-dir /pip_cache --prefix=/install -r /tmp/dep/requirements.txt
94+
95+
FROM base
5996

60-
RUN cp /tmp/nginx.site.conf /etc/nginx/sites-available/$PROJECT.conf \
61-
&& ln -s /etc/nginx/sites-available/$PROJECT.conf /etc/nginx/sites-enabled/$PROJECT.conf
97+
ARG BUILD_DEPS
98+
ARG RUNTIME_DEPS
6299

63-
COPY . $PROJECT_PATH
64-
RUN chown -R $PROJECT_USER:$PROJECT_GROUP $PROJECT_PATH
100+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
101+
--mount=type=cache,target=/var/lib/apt,sharing=locked \
102+
apt-get update \
103+
&& SUDO_FORCE_REMOVE=yes apt-get remove --purge -y ${BUILD_DEPS} \
104+
&& apt-get autoremove -y \
105+
&& apt-get install -y --no-install-recommends ${RUNTIME_DEPS} \
106+
&& rm -rf /usr/share/man /usr/share/doc
65107

66-
WORKDIR $PROJECT_PATH
108+
COPY --chown=${PROJECT_USER}:${PROJECT_GROUP} package.json package-lock.json ${PROJECT_PATH}
67109

68-
RUN su $PROJECT_USER -c "npm install --global \
110+
RUN --mount=type=cache,id=npm,target=/npm_cache \
111+
npm install --global --ignore-scripts --cache /npm_cache \
69112
coffeescript \
70113
less \
71-
yarn"
114+
yarn \
115+
&& npm install --ignore-scripts --cache /npm_cache
72116

73-
RUN su $PROJECT_USER -c "npm install"
117+
COPY --from=build /install /usr/local
118+
COPY --chown=${PROJECT_USER}:${PROJECT_GROUP} . ${PROJECT_PATH}
74119

75-
RUN su $PROJECT_USER -c "ln -s $PROJECT_PATH/temba/settings.py.prod $PROJECT_PATH/temba/settings.py"
120+
RUN ln -s "${PROJECT_PATH}/temba/settings.py.prod" "${PROJECT_PATH}/temba/settings.py"
76121

77-
EXPOSE 8000
122+
USER "${PROJECT_USER}:${PROJECT_USER}"
78123
EXPOSE 8001
79-
ENTRYPOINT ["sh", "./docker/start"]
124+
ENTRYPOINT ["bash", "./docker/start"]
125+
CMD ["start"]

docker/Dockerfile.varnish

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)