diff --git a/.gitignore b/.gitignore index 9aa823673..4a65dedc4 100644 --- a/.gitignore +++ b/.gitignore @@ -354,3 +354,5 @@ $RECYCLE.BIN/ .vite # End of https://www.toptal.com/developers/gitignore/api/java,linux,macos,maven,eclipse,windows,visualstudiocode,node + +celements-admin-frontend/public/config.js diff --git a/celements-admin-frontend/.dockerignore b/celements-admin-frontend/.dockerignore new file mode 100644 index 000000000..ac9e20154 --- /dev/null +++ b/celements-admin-frontend/.dockerignore @@ -0,0 +1,8 @@ +node_modules +dist +.git +.gitignore +.env +.env.* +*.log +public/config.js diff --git a/celements-admin-frontend/.env.celdev b/celements-admin-frontend/.env.celdev new file mode 100644 index 000000000..99a4bf9f5 --- /dev/null +++ b/celements-admin-frontend/.env.celdev @@ -0,0 +1,14 @@ +VITE_ENABLE_LOCAL_DEVELOPMENT=false + +# url settings +VITE_APP_BASE_URL=https://bellis.celdev.sneakapeek.ch +VITE_CEL_API_URL=https://bellis.celdev.sneakapeek.ch + +# keycloak configuration +VITE_KEYCLOAK_BASE_URL=https://iam.demospace.ch +VITE_KEYCLOAK_REALM=celdev +VITE_KEYCLOAK_CLIENT_ID=celdev + +# cel access +VITE_CEL_USER= +VITE_CEL_TOKEN= diff --git a/celements-admin-frontend/.env.int b/celements-admin-frontend/.env.celint similarity index 80% rename from celements-admin-frontend/.env.int rename to celements-admin-frontend/.env.celint index 3be772ea5..5b17c76ba 100644 --- a/celements-admin-frontend/.env.int +++ b/celements-admin-frontend/.env.celint @@ -2,7 +2,7 @@ VITE_ENABLE_LOCAL_DEVELOPMENT=false # url settings VITE_APP_BASE_URL=https://bellis.celint.demospace.ch -VITE_CEL_API_URL=https://bellis.celint.sneakapeek.ch +VITE_CEL_API_URL=https://bellis.celint.demospace.ch # keycloak configuration VITE_KEYCLOAK_BASE_URL=https://iam.demospace.ch diff --git a/celements-admin-frontend/Caddyfile b/celements-admin-frontend/Caddyfile deleted file mode 100644 index d1f1c6457..000000000 --- a/celements-admin-frontend/Caddyfile +++ /dev/null @@ -1,4 +0,0 @@ -:80 { - root * /srv - file_server -} diff --git a/celements-admin-frontend/Dockerfile b/celements-admin-frontend/Dockerfile index 69adb069d..437133376 100644 --- a/celements-admin-frontend/Dockerfile +++ b/celements-admin-frontend/Dockerfile @@ -20,18 +20,26 @@ RUN npm install --legacy-peer-deps # Layer: package COPY . . -ARG PROFILE_ACTIVE=dev -RUN mv .env.${PROFILE_ACTIVE} .env; \ - npm run build +RUN npm run build ## Stage: execute FROM caddy:2 AS execute +ARG VERSION +ARG REVISION + +LABEL org.opencontainers.image.source="https://github.com/celements/celements-web" \ + org.opencontainers.image.description="Celements admin frontend" \ + org.opencontainers.image.version="${VERSION}" \ + org.opencontainers.image.revision="${REVISION}" + WORKDIR /srv COPY --from=build /app/dist /srv -COPY Caddyfile /etc/caddy/Caddyfile +COPY docker/Caddyfile /etc/caddy/Caddyfile +COPY --chmod=755 docker/entrypoint.sh /usr/local/bin/start RUN caddy fmt /etc/caddy/Caddyfile --overwrite EXPOSE 80 +ENTRYPOINT ["start"] CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile"] diff --git a/celements-admin-frontend/Jenkinsfile b/celements-admin-frontend/Jenkinsfile new file mode 100644 index 000000000..25e2da4ef --- /dev/null +++ b/celements-admin-frontend/Jenkinsfile @@ -0,0 +1,63 @@ +def appImage + +pipeline { + agent { label 'docker' } + environment { + REGISTRY = 'ghcr.io' + ORG_NAME = 'celements' + APP_DIR = 'celements-admin-frontend' + IMAGE_NAME = 'celements-admin-frontend' + DOCKER_BUILDKIT = '1' + } + options { + disableConcurrentBuilds() + skipDefaultCheckout(true) + timestamps() + } + stages { + stage('Checkout') { + steps { + checkout scm + } + } + stage('Prepare Build') { + steps { + dir(APP_DIR) { + script { + env.GIT_REV = sh(script: 'git rev-parse HEAD', returnStdout: true).trim() + env.GIT_SHA = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim() + env.VERSION = sh( + script: 'node -p "require(\'./package.json\').version"', + returnStdout: true + ).trim() + env.IMAGE_REF = "${REGISTRY}/${ORG_NAME}/${IMAGE_NAME}:${VERSION}" + } + } + } + } + stage('Build Frontend Docker Image') { + steps { + dir(APP_DIR) { + script { + appImage = docker.build( + IMAGE_REF, + "--build-arg VERSION=${VERSION} " + + "--build-arg REVISION=${GIT_REV} " + + "--load ." + ) + } + } + } + } + stage('Push to GHCR') { + steps { + script { + docker.withRegistry("https://${REGISTRY}", 'ghcr-credentials') { + appImage.push() + appImage.push("${VERSION}-${GIT_SHA}") + } + } + } + } + } +} diff --git a/celements-admin-frontend/docker/Caddyfile b/celements-admin-frontend/docker/Caddyfile new file mode 100644 index 000000000..53f7a22df --- /dev/null +++ b/celements-admin-frontend/docker/Caddyfile @@ -0,0 +1,13 @@ +:80 { + root * /srv + + handle /config.js { + header Cache-Control "no-store, no-cache, must-revalidate" + file_server + } + + handle { + try_files {path} /index.html + file_server + } +} diff --git a/celements-admin-frontend/docker/entrypoint.sh b/celements-admin-frontend/docker/entrypoint.sh new file mode 100755 index 000000000..90f40b0b6 --- /dev/null +++ b/celements-admin-frontend/docker/entrypoint.sh @@ -0,0 +1,22 @@ +#!/bin/sh +set -eu + +escape_js_string() { + printf '%s' "$1" | sed \ + -e 's/\\/\\\\/g' \ + -e "s/'/\\\\'/g" +} + +cat > /srv/config.js <