diff --git a/.github/workflows/build-insights-webapp-push-tag-shared.yaml b/.github/workflows/build-insights-webapp-push-tag-shared.yaml index 6c48a960..66c3f737 100644 --- a/.github/workflows/build-insights-webapp-push-tag-shared.yaml +++ b/.github/workflows/build-insights-webapp-push-tag-shared.yaml @@ -17,12 +17,15 @@ jobs: if grep -qs -e '^.*.*-develop' <<< "${TAG}" ; then echo "Found environment: DEVELOP - ${TAG}" echo "MANIFESTS_ENVIRONMENT=develop" | tee "${GITHUB_ENV}" + echo "OLD_IMAGE=${{ secrets.ECR }}/insights:webapp-develop" | tee -a "${GITHUB_ENV}" elif grep -qs -e '^.*.*-staging' <<< "${TAG}" ; then echo "Found environment: STAGING - ${TAG}" echo "MANIFESTS_ENVIRONMENT=staging" | tee -a "${GITHUB_ENV}" + echo "OLD_IMAGE=${{ secrets.ECR }}/insights:webapp-staging" | tee -a "${GITHUB_ENV}" elif grep -qs -e '^.*.*' <<< "${TAG}" ; then echo "No environment found, assuming: PRODUCTION - ${TAG}" echo "MANIFESTS_ENVIRONMENT=production" | tee -a "${GITHUB_ENV}" + echo "OLD_IMAGE=${{ secrets.ECR }}/insights:webapp-production" | tee -a "${GITHUB_ENV}" else echo 'Not a valid tag. Skipping...' exit 1 @@ -65,9 +68,13 @@ jobs: tag=${{env.TAG}} commit=${{env.COMMIT_SHA}} repository=${{env.IMAGE_SOURCE_URL}} + build-args: | + OLD_IMAGE=${{env.OLD_IMAGE}} file: docker/Dockerfile push: true - tags: '${{env.IMAGE_TAG}}' + tags: | + ${{env.IMAGE_TAG}} + ${{env.OLD_IMAGE}} no-cache: true - name: Check out Kubernetes Manifests diff --git a/docker/Dockerfile b/docker/Dockerfile index e8567e9c..c08f9974 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -2,19 +2,25 @@ ARG NODE_VERSION="18.18.0" ARG BASE_VERSION="alpine3.17" +ARG OLD_IMAGE="insights-webapp:latest" +ARG KEEP_DAYS=60 +ARG VITE_FIREBASE_CONFIG +ARG VITE_HOTJAR_ID -FROM node:${NODE_VERSION}-${BASE_VERSION} as builder +FROM node:${NODE_VERSION}-${BASE_VERSION} AS builder WORKDIR /app -ARG VITE_FIREBASE_CONFIG +ARG KEEP_DAYS -ENV VITE_FIREBASE_CONFIG $VITE_FIREBASE_CONFIG -ENV VITE_HOTJAR_ID $VITE_HOTJAR_ID +ARG VITE_FIREBASE_CONFIG +ARG VITE_HOTJAR_ID -RUN apk --no-cache add git +ENV VITE_FIREBASE_CONFIG=$VITE_FIREBASE_CONFIG +ENV VITE_HOTJAR_ID=$VITE_HOTJAR_ID RUN apk add --no-cache \ + git \ build-base \ cairo-dev \ pango-dev \ @@ -31,15 +37,25 @@ COPY . ./ RUN yarn build +FROM ${OLD_IMAGE} AS old_css + FROM nginxinc/nginx-unprivileged:1.25-alpine +ARG OLD_IMAGE=${OLD_IMAGE} +ARG KEEP_DAYS COPY --chown=nginx:nginx docker/nginx/nginx.conf /etc/nginx/nginx.conf +COPY --chown=nginx:nginx docker/nginx/headers /usr/share/nginx/html/headers +COPY --chown=nginx:nginx docker/file_handler.sh / COPY --from=builder --chown=nginx:nginx /app/dist /usr/share/nginx/html/insights/ +COPY --from=old_css --chown=nginx:nginx /usr/share/nginx/html/insights/assets/all.tx[t] /usr/share/nginx/html/insights/assets/*.css /usr/share/nginx/html/insights/assets/ + COPY docker-entrypoint.sh / + RUN mv /usr/share/nginx/html/insights/index.html /usr/share/nginx/html/insights/index.html.tmpl \ && cd /usr/share/nginx/html/insights/ \ - && ln -s /tmp/index.html + && ln -s /tmp/index.html \ + && /file_handler.sh css EXPOSE 8080 ENTRYPOINT ["/docker-entrypoint.sh"] -CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file +CMD ["nginx", "-g", "daemon off;"] diff --git a/docker/file_handler.sh b/docker/file_handler.sh new file mode 100755 index 00000000..c4f68bac --- /dev/null +++ b/docker/file_handler.sh @@ -0,0 +1,114 @@ +#!/usr/bin/env sh + +FILES="" +CURRENT_TIME=$( date +%s ) +EXPIRE_TIME=$(( CURRENT_TIME-(30*24*60*60) )) +#EXPIRE_TIME=$(( CURRENT_TIME-1 )) + +dict_keys(){ + IFS="$( printf '\t' )" + echo "$1" | while read -r KEY VALUE ; do + echo "${KEY}" + done +} + +dict_values(){ + IFS="$( printf '\t' )" + echo "$1" | while read -r KEY VALUE ; do + echo "${VALUE}" + done +} + + +dict_set(){ + has_key="false" + IFS="$( printf '\t' )" + + while read -r KEY VALUE ; do + if [ "${KEY}" = "$2" ] ; then + printf '%s\t%s\n' "$2" "$3" + has_key='true' + else + printf '%s\t%s\n' "${KEY}" "${VALUE}" + fi + done <<-EOFDICT + $1 + EOFDICT + if [ "${has_key}" = 'false' ] ; then + printf '%s\t%s\n' "$2" "$3" + fi +} + +dict_get(){ + has_key="false" + IFS="$( printf '\t' )" + + while read -r KEY VALUE ; do + if [ "${KEY}" = "$2" ] ; then + echo "${VALUE}" + has_key='true' + break + fi + done <<-EOFDICT +$1 +EOFDICT + + if [ "${has_key}" = 'false' ] ; then + echo "$3" + fi +} + +load_files(){ + while read -r file_ctime filename ; do + if [ "${file_ctime}" -le "$( dict_get "${FILES}" "${filename}" "3199999999" )" ] ; then + FILES=$( dict_set "${FILES}" "${filename}" "${file_ctime}" ) + fi + done<&2 + rm -rf "${filename}" + fi + done +} + +generate_files(){ + while read -r filename ; do + if [ -r "${filename}" ] ; then + printf '%s\t%s\n' "${CURRENT_TIME}" "${filename}" + fi + done +} + +if [ "$1" = "delete_old" ]; then + shift + load_files "$@" + delete_old_files +elif [ "$1" = "print" ] ; then + shift + load_files "$@" + #echo "$FILES" + print_files +elif [ "$1" = "generate" ] ; then + generate_files +elif [ "$1" = "css" ] ; then + load_files < assets/all.txt +fi diff --git a/docker/nginx/file_handler.sh b/docker/nginx/file_handler.sh new file mode 100755 index 00000000..c4f68bac --- /dev/null +++ b/docker/nginx/file_handler.sh @@ -0,0 +1,114 @@ +#!/usr/bin/env sh + +FILES="" +CURRENT_TIME=$( date +%s ) +EXPIRE_TIME=$(( CURRENT_TIME-(30*24*60*60) )) +#EXPIRE_TIME=$(( CURRENT_TIME-1 )) + +dict_keys(){ + IFS="$( printf '\t' )" + echo "$1" | while read -r KEY VALUE ; do + echo "${KEY}" + done +} + +dict_values(){ + IFS="$( printf '\t' )" + echo "$1" | while read -r KEY VALUE ; do + echo "${VALUE}" + done +} + + +dict_set(){ + has_key="false" + IFS="$( printf '\t' )" + + while read -r KEY VALUE ; do + if [ "${KEY}" = "$2" ] ; then + printf '%s\t%s\n' "$2" "$3" + has_key='true' + else + printf '%s\t%s\n' "${KEY}" "${VALUE}" + fi + done <<-EOFDICT + $1 + EOFDICT + if [ "${has_key}" = 'false' ] ; then + printf '%s\t%s\n' "$2" "$3" + fi +} + +dict_get(){ + has_key="false" + IFS="$( printf '\t' )" + + while read -r KEY VALUE ; do + if [ "${KEY}" = "$2" ] ; then + echo "${VALUE}" + has_key='true' + break + fi + done <<-EOFDICT +$1 +EOFDICT + + if [ "${has_key}" = 'false' ] ; then + echo "$3" + fi +} + +load_files(){ + while read -r file_ctime filename ; do + if [ "${file_ctime}" -le "$( dict_get "${FILES}" "${filename}" "3199999999" )" ] ; then + FILES=$( dict_set "${FILES}" "${filename}" "${file_ctime}" ) + fi + done<&2 + rm -rf "${filename}" + fi + done +} + +generate_files(){ + while read -r filename ; do + if [ -r "${filename}" ] ; then + printf '%s\t%s\n' "${CURRENT_TIME}" "${filename}" + fi + done +} + +if [ "$1" = "delete_old" ]; then + shift + load_files "$@" + delete_old_files +elif [ "$1" = "print" ] ; then + shift + load_files "$@" + #echo "$FILES" + print_files +elif [ "$1" = "generate" ] ; then + generate_files +elif [ "$1" = "css" ] ; then + load_files < assets/all.txt +fi diff --git a/docker/nginx/headers b/docker/nginx/headers new file mode 100644 index 00000000..e69de29b