From e3ed216a7042b48cb5bd3dd97bc9c4b1e140da3c Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Mon, 18 Feb 2019 21:12:41 +1000 Subject: [PATCH 1/9] Added arm64 build --- Dockerfile.arm64 | 38 +++++++++++++++++++++++++++++++ Jenkinsfile | 59 +++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 Dockerfile.arm64 diff --git a/Dockerfile.arm64 b/Dockerfile.arm64 new file mode 100644 index 00000000..a1b1d901 --- /dev/null +++ b/Dockerfile.arm64 @@ -0,0 +1,38 @@ +FROM jc21/nginx-proxy-manager-base:latest-arm64 + +MAINTAINER Jamie Curnow +LABEL maintainer="Jamie Curnow " + +ENV SUPPRESS_NO_CONFIG_WARNING=1 +ENV S6_FIX_ATTRS_HIDDEN=1 +RUN echo "fs.file-max = 65535" > /etc/sysctl.conf + +# Nginx, Node and required packages should already be installed from the base image + +# root filesystem +COPY rootfs / + +# s6 overlay +RUN curl -L -o /tmp/s6-overlay-aarch64.tar.gz "https://github.com/just-containers/s6-overlay/releases/download/v1.21.8.0/s6-overlay-aarch64.tar.gz" \ + && tar xzf /tmp/s6-overlay-aarch64.tar.gz -C / + +# App +ENV NODE_ENV=production + +ADD dist /app/dist +ADD node_modules /app/node_modules +ADD src/backend /app/src/backend +ADD package.json /app/package.json +ADD knexfile.js /app/knexfile.js + +# Volumes +VOLUME [ "/data", "/etc/letsencrypt" ] +CMD [ "/init" ] + +# Ports +EXPOSE 80 +EXPOSE 81 +EXPOSE 443 +EXPOSE 9876 + +HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://localhost:9876/health || exit 1 diff --git a/Jenkinsfile b/Jenkinsfile index 00639584..aa2d4967 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,12 +5,13 @@ pipeline { } agent any environment { - IMAGE_NAME = "nginx-proxy-manager" - BASE_IMAGE_NAME = "jc21/nginx-proxy-manager-base:latest" - TEMP_IMAGE_NAME = "nginx-proxy-manager-build_${BUILD_NUMBER}" - TEMP_IMAGE_NAME_ARM = "nginx-proxy-manager-arm-build_${BUILD_NUMBER}" - TAG_VERSION = getPackageVersion() - MAJOR_VERSION = "2" + IMAGE_NAME = "nginx-proxy-manager" + BASE_IMAGE_NAME = "jc21/nginx-proxy-manager-base:latest" + TEMP_IMAGE_NAME = "nginx-proxy-manager-build_${BUILD_NUMBER}" + TEMP_IMAGE_NAME_ARM = "nginx-proxy-manager-arm-build_${BUILD_NUMBER}" + TEMP_IMAGE_NAME_ARM64 = "nginx-proxy-manager-arm64-build_${BUILD_NUMBER}" + TAG_VERSION = getPackageVersion() + MAJOR_VERSION = "2" } stages { stage('Prepare') { @@ -144,6 +145,52 @@ pipeline { } } } + stage('arm64') { + when { + branch 'master' + } + agent { + label 'arm64' + } + steps { + ansiColor('xterm') { + // Codebase + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-arm64 yarn install' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-arm64 npm run-script build' + sh 'rm -rf node_modules' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-arm64 yarn install --prod' + + // Docker Build + sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME_ARM64 -f Dockerfile.arm64 .' + + // Dockerhub + sh 'docker tag $TEMP_IMAGE_NAME_ARM64 docker.io/jc21/$IMAGE_NAME:$TAG_VERSION-arm64' + sh 'docker tag $TEMP_IMAGE_NAME_ARM64 docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION-arm64' + sh 'docker tag $TEMP_IMAGE_NAME_ARM64 docker.io/jc21/$IMAGE_NAME:latest-arm64' + + withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { + sh "docker login -u '${duser}' -p '$dpass'" + sh 'docker push docker.io/jc21/$IMAGE_NAME:$TAG_VERSION-arm64' + sh 'docker push docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION-arm64' + sh 'docker push docker.io/jc21/$IMAGE_NAME:latest-arm64' + } + + // Private Registry + sh 'docker tag $TEMP_IMAGE_NAME_ARM64 $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION-arm64' + sh 'docker tag $TEMP_IMAGE_NAME_ARM64 $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION-arm64' + sh 'docker tag $TEMP_IMAGE_NAME_ARM64 $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest-arm64' + + withCredentials([usernamePassword(credentialsId: 'jc21-private-registry', passwordVariable: 'dpass', usernameVariable: 'duser')]) { + sh "docker login -u '${duser}' -p '$dpass' $DOCKER_PRIVATE_REGISTRY" + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION-arm64' + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION-arm64' + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest-arm64' + } + + sh 'docker rmi $TEMP_IMAGE_NAME_ARM64' + } + } + } } } } From 7d86fd223e052e702b04927ef3da852c39e7eb6f Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Mon, 18 Feb 2019 21:12:46 +1000 Subject: [PATCH 2/9] Fix base docker images for arm packages --- Dockerfile.arm64 | 2 +- Dockerfile.armhf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile.arm64 b/Dockerfile.arm64 index a1b1d901..897a5fa8 100644 --- a/Dockerfile.arm64 +++ b/Dockerfile.arm64 @@ -1,4 +1,4 @@ -FROM jc21/nginx-proxy-manager-base:latest-arm64 +FROM jc21/nginx-proxy-manager-base:arm64 MAINTAINER Jamie Curnow LABEL maintainer="Jamie Curnow " diff --git a/Dockerfile.armhf b/Dockerfile.armhf index ec62e44c..af6b82a1 100644 --- a/Dockerfile.armhf +++ b/Dockerfile.armhf @@ -1,4 +1,4 @@ -FROM jc21/nginx-proxy-manager-base:latest-armhf +FROM jc21/nginx-proxy-manager-base:armhf MAINTAINER Jamie Curnow LABEL maintainer="Jamie Curnow " From 4f60d3e7df3d84b9d2aef567ecf82013339190f6 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Mon, 18 Feb 2019 21:14:26 +1000 Subject: [PATCH 3/9] Fix CI now that tags are changes --- Jenkinsfile | 134 ++++++++++++++++++++++++++-------------------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index aa2d4967..be237f9e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,13 +5,13 @@ pipeline { } agent any environment { - IMAGE_NAME = "nginx-proxy-manager" - BASE_IMAGE_NAME = "jc21/nginx-proxy-manager-base:latest" - TEMP_IMAGE_NAME = "nginx-proxy-manager-build_${BUILD_NUMBER}" - TEMP_IMAGE_NAME_ARM = "nginx-proxy-manager-arm-build_${BUILD_NUMBER}" - TEMP_IMAGE_NAME_ARM64 = "nginx-proxy-manager-arm64-build_${BUILD_NUMBER}" - TAG_VERSION = getPackageVersion() - MAJOR_VERSION = "2" + IMAGE = "nginx-proxy-manager" + BASE_IMAGE = "jc21/nginx-proxy-manager-base" + TEMP_IMAGE = "nginx-proxy-manager-build_${BUILD_NUMBER}" + TEMP_IMAGE_ARM = "nginx-proxy-manager-arm-build_${BUILD_NUMBER}" + TEMP_IMAGE_ARM64 = "nginx-proxy-manager-arm64-build_${BUILD_NUMBER}" + TAG_VERSION = getPackageVersion() + MAJOR_VERSION = "2" } stages { stage('Prepare') { @@ -26,30 +26,30 @@ pipeline { steps { ansiColor('xterm') { // Codebase - sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME yarn install' - sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME npm run-script build' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE yarn install' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE npm run-script build' sh 'rm -rf node_modules' - sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME yarn install --prod' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE yarn install --prod' sh 'docker run --rm -v $(pwd):/data $DOCKER_CI_TOOLS node-prune' // Docker Build - sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME .' + sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE .' // Dockerhub - sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:develop' + sh 'docker tag $TEMP_IMAGE docker.io/jc21/$IMAGE:develop' withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { sh "docker login -u '${duser}' -p '$dpass'" - sh 'docker push docker.io/jc21/$IMAGE_NAME:develop' + sh 'docker push docker.io/jc21/$IMAGE:develop' } // Private Registry - sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:develop' + sh 'docker tag $TEMP_IMAGE $DOCKER_PRIVATE_REGISTRY/$IMAGE:develop' withCredentials([usernamePassword(credentialsId: 'jc21-private-registry', passwordVariable: 'dpass', usernameVariable: 'duser')]) { sh "docker login -u '${duser}' -p '$dpass' $DOCKER_PRIVATE_REGISTRY" - sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:develop' + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE:develop' } - sh 'docker rmi $TEMP_IMAGE_NAME' + sh 'docker rmi $TEMP_IMAGE' } } } @@ -62,40 +62,40 @@ pipeline { steps { ansiColor('xterm') { // Codebase - sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME yarn install' - sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME npm run-script build' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE yarn install' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE npm run-script build' sh 'rm -rf node_modules' - sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME yarn install --prod' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE yarn install --prod' sh 'docker run --rm -v $(pwd):/data $DOCKER_CI_TOOLS node-prune' // Docker Build - sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME .' + sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE .' // Dockerhub - sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:$TAG_VERSION' - sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION' - sh 'docker tag $TEMP_IMAGE_NAME docker.io/jc21/$IMAGE_NAME:latest' + sh 'docker tag $TEMP_IMAGE docker.io/jc21/$IMAGE:$TAG_VERSION' + sh 'docker tag $TEMP_IMAGE docker.io/jc21/$IMAGE:$MAJOR_VERSION' + sh 'docker tag $TEMP_IMAGE docker.io/jc21/$IMAGE:latest' withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { sh "docker login -u '${duser}' -p '$dpass'" - sh 'docker push docker.io/jc21/$IMAGE_NAME:$TAG_VERSION' - sh 'docker push docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION' - sh 'docker push docker.io/jc21/$IMAGE_NAME:latest' + sh 'docker push docker.io/jc21/$IMAGE:$TAG_VERSION' + sh 'docker push docker.io/jc21/$IMAGE:$MAJOR_VERSION' + sh 'docker push docker.io/jc21/$IMAGE:latest' } // Private Registry - sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION' - sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION' - sh 'docker tag $TEMP_IMAGE_NAME $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest' + sh 'docker tag $TEMP_IMAGE $DOCKER_PRIVATE_REGISTRY/$IMAGE:$TAG_VERSION' + sh 'docker tag $TEMP_IMAGE $DOCKER_PRIVATE_REGISTRY/$IMAGE:$MAJOR_VERSION' + sh 'docker tag $TEMP_IMAGE $DOCKER_PRIVATE_REGISTRY/$IMAGE:latest' withCredentials([usernamePassword(credentialsId: 'jc21-private-registry', passwordVariable: 'dpass', usernameVariable: 'duser')]) { sh "docker login -u '${duser}' -p '$dpass' $DOCKER_PRIVATE_REGISTRY" - sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION' - sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION' - sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest' + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE:$TAG_VERSION' + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE:$MAJOR_VERSION' + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE:latest' } - sh 'docker rmi $TEMP_IMAGE_NAME' + sh 'docker rmi $TEMP_IMAGE' } } } @@ -109,39 +109,39 @@ pipeline { steps { ansiColor('xterm') { // Codebase - sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-armhf yarn install' - sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-armhf npm run-script build' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE:armhf yarn install' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE:armhf npm run-script build' sh 'rm -rf node_modules' - sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-armhf yarn install --prod' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE:armhf yarn install --prod' // Docker Build - sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME_ARM -f Dockerfile.armhf .' + sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_ARM -f Dockerfile.armhf .' // Dockerhub - sh 'docker tag $TEMP_IMAGE_NAME_ARM docker.io/jc21/$IMAGE_NAME:$TAG_VERSION-armhf' - sh 'docker tag $TEMP_IMAGE_NAME_ARM docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION-armhf' - sh 'docker tag $TEMP_IMAGE_NAME_ARM docker.io/jc21/$IMAGE_NAME:latest-armhf' + sh 'docker tag $TEMP_IMAGE_ARM docker.io/jc21/$IMAGE:$TAG_VERSION-armhf' + sh 'docker tag $TEMP_IMAGE_ARM docker.io/jc21/$IMAGE:$MAJOR_VERSION-armhf' + sh 'docker tag $TEMP_IMAGE_ARM docker.io/jc21/$IMAGE:latest-armhf' withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { sh "docker login -u '${duser}' -p '$dpass'" - sh 'docker push docker.io/jc21/$IMAGE_NAME:$TAG_VERSION-armhf' - sh 'docker push docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION-armhf' - sh 'docker push docker.io/jc21/$IMAGE_NAME:latest-armhf' + sh 'docker push docker.io/jc21/$IMAGE:$TAG_VERSION-armhf' + sh 'docker push docker.io/jc21/$IMAGE:$MAJOR_VERSION-armhf' + sh 'docker push docker.io/jc21/$IMAGE:latest-armhf' } // Private Registry - sh 'docker tag $TEMP_IMAGE_NAME_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION-armhf' - sh 'docker tag $TEMP_IMAGE_NAME_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION-armhf' - sh 'docker tag $TEMP_IMAGE_NAME_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest-armhf' + sh 'docker tag $TEMP_IMAGE_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE:$TAG_VERSION-armhf' + sh 'docker tag $TEMP_IMAGE_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE:$MAJOR_VERSION-armhf' + sh 'docker tag $TEMP_IMAGE_ARM $DOCKER_PRIVATE_REGISTRY/$IMAGE:latest-armhf' withCredentials([usernamePassword(credentialsId: 'jc21-private-registry', passwordVariable: 'dpass', usernameVariable: 'duser')]) { sh "docker login -u '${duser}' -p '$dpass' $DOCKER_PRIVATE_REGISTRY" - sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION-armhf' - sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION-armhf' - sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest-armhf' + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE:$TAG_VERSION-armhf' + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE:$MAJOR_VERSION-armhf' + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE:latest-armhf' } - sh 'docker rmi $TEMP_IMAGE_NAME_ARM' + sh 'docker rmi $TEMP_IMAGE_ARM' } } } @@ -155,39 +155,39 @@ pipeline { steps { ansiColor('xterm') { // Codebase - sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-arm64 yarn install' - sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-arm64 npm run-script build' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE:arm64 yarn install' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE:arm64 npm run-script build' sh 'rm -rf node_modules' - sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE_NAME-arm64 yarn install --prod' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE:arm64 yarn install --prod' // Docker Build - sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_NAME_ARM64 -f Dockerfile.arm64 .' + sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE_ARM64 -f Dockerfile.arm64 .' // Dockerhub - sh 'docker tag $TEMP_IMAGE_NAME_ARM64 docker.io/jc21/$IMAGE_NAME:$TAG_VERSION-arm64' - sh 'docker tag $TEMP_IMAGE_NAME_ARM64 docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION-arm64' - sh 'docker tag $TEMP_IMAGE_NAME_ARM64 docker.io/jc21/$IMAGE_NAME:latest-arm64' + sh 'docker tag $TEMP_IMAGE_ARM64 docker.io/jc21/$IMAGE:$TAG_VERSION-arm64' + sh 'docker tag $TEMP_IMAGE_ARM64 docker.io/jc21/$IMAGE:$MAJOR_VERSION-arm64' + sh 'docker tag $TEMP_IMAGE_ARM64 docker.io/jc21/$IMAGE:latest-arm64' withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { sh "docker login -u '${duser}' -p '$dpass'" - sh 'docker push docker.io/jc21/$IMAGE_NAME:$TAG_VERSION-arm64' - sh 'docker push docker.io/jc21/$IMAGE_NAME:$MAJOR_VERSION-arm64' - sh 'docker push docker.io/jc21/$IMAGE_NAME:latest-arm64' + sh 'docker push docker.io/jc21/$IMAGE:$TAG_VERSION-arm64' + sh 'docker push docker.io/jc21/$IMAGE:$MAJOR_VERSION-arm64' + sh 'docker push docker.io/jc21/$IMAGE:latest-arm64' } // Private Registry - sh 'docker tag $TEMP_IMAGE_NAME_ARM64 $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION-arm64' - sh 'docker tag $TEMP_IMAGE_NAME_ARM64 $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION-arm64' - sh 'docker tag $TEMP_IMAGE_NAME_ARM64 $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest-arm64' + sh 'docker tag $TEMP_IMAGE_ARM64 $DOCKER_PRIVATE_REGISTRY/$IMAGE:$TAG_VERSION-arm64' + sh 'docker tag $TEMP_IMAGE_ARM64 $DOCKER_PRIVATE_REGISTRY/$IMAGE:$MAJOR_VERSION-arm64' + sh 'docker tag $TEMP_IMAGE_ARM64 $DOCKER_PRIVATE_REGISTRY/$IMAGE:latest-arm64' withCredentials([usernamePassword(credentialsId: 'jc21-private-registry', passwordVariable: 'dpass', usernameVariable: 'duser')]) { sh "docker login -u '${duser}' -p '$dpass' $DOCKER_PRIVATE_REGISTRY" - sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$TAG_VERSION-arm64' - sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:$MAJOR_VERSION-arm64' - sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE_NAME:latest-arm64' + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE:$TAG_VERSION-arm64' + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE:$MAJOR_VERSION-arm64' + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE:latest-arm64' } - sh 'docker rmi $TEMP_IMAGE_NAME_ARM64' + sh 'docker rmi $TEMP_IMAGE_ARM64' } } } From ecbc41b622d9a4eb6aabc4843d5737060669558a Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Mon, 18 Feb 2019 21:14:26 +1000 Subject: [PATCH 4/9] Arm64 build process doesn't run as root --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index be237f9e..2e4f1e69 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -157,7 +157,7 @@ pipeline { // Codebase sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE:arm64 yarn install' sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE:arm64 npm run-script build' - sh 'rm -rf node_modules' + sh 'sudo rm -rf node_modules' sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE:arm64 yarn install --prod' // Docker Build From f76c9226c80b443bd16e5c636648cb276fe01d46 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Mon, 18 Feb 2019 21:14:26 +1000 Subject: [PATCH 5/9] Fix workdir perms for subsequent builds --- Jenkinsfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 2e4f1e69..58ec0124 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -188,6 +188,9 @@ pipeline { } sh 'docker rmi $TEMP_IMAGE_ARM64' + + // Hack to clean up ec2 instance for next build + sh 'sudo chown -R ec2-user:ec2-user *' } } } From 6d2f532806749abee2fd07015b1825f928f20b42 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Mon, 18 Feb 2019 21:14:26 +1000 Subject: [PATCH 6/9] Updated arm instructions --- doc/INSTALL.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/doc/INSTALL.md b/doc/INSTALL.md index e68c6995..b7e16056 100644 --- a/doc/INSTALL.md +++ b/doc/INSTALL.md @@ -44,7 +44,7 @@ It's easy to use another docker container for your database also and link it as version: "3" services: app: - image: jc21/nginx-proxy-manager:2 + image: jc21/nginx-proxy-manager:latest restart: always ports: - 80:80 @@ -77,7 +77,7 @@ Via `docker-compose`: version: "3" services: app: - image: jc21/nginx-proxy-manager:2 + image: jc21/nginx-proxy-manager:latest restart: always ports: - 80:80 @@ -100,15 +100,17 @@ docker run -d \ -v /path/to/config.json:/app/config/production.json \ -v /path/to/data:/data \ -v /path/to/letsencrypt:/etc/letsencrypt \ - jc21/nginx-proxy-manager:2 + jc21/nginx-proxy-manager:latest ``` ### Running on Raspberry PI / `armhf` -I have created a `armhf` docker container just for you. There may be issues with it, +I have created `armhf` and `arm64` docker containers just for you. There may be issues with it, if you have issues please report them here. +Note: Rpi v2 and below won't work with these images. + ```bash docker run -d \ --name nginx-proxy-manager-app \ @@ -118,7 +120,7 @@ docker run -d \ -v /path/to/config.json:/app/config/production.json \ -v /path/to/data:/data \ -v /path/to/letsencrypt:/etc/letsencrypt \ - jc21/nginx-proxy-manager:2-armhf + jc21/nginx-proxy-manager:latest-armhf ``` From 733d7d9583e4183b938af0becc6a68c75796a55d Mon Sep 17 00:00:00 2001 From: jc21 Date: Tue, 19 Feb 2019 17:05:26 +1000 Subject: [PATCH 7/9] Update DOCKERHUB.md --- doc/DOCKERHUB.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/DOCKERHUB.md b/doc/DOCKERHUB.md index 72e3c3c2..b7f017ca 100644 --- a/doc/DOCKERHUB.md +++ b/doc/DOCKERHUB.md @@ -16,6 +16,7 @@ running at home or otherwise, including free SSL, without having to know too muc * latest 2, 2.x.x ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/master/Dockerfile)) * latest-armhf, 2-armhf, 2.x.x-armhf ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/master/Dockerfile.armhf)) +* latest-arm64, 2-arm64, 2.x.x-arm64 ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/master/Dockerfile.arm64)) * 1, 1.x.x ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/1.1.2/Dockerfile)) * 1-armhf, 1.x.x-armhf ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/1.1.2/Dockerfile.armhf)) From 5c7fb7b6985bb39e20b92f5c172f188676a8805d Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Wed, 20 Feb 2019 08:25:12 +1000 Subject: [PATCH 8/9] Added armv6 Dockerfile --- Dockerfile.armv6 | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Dockerfile.armv6 diff --git a/Dockerfile.armv6 b/Dockerfile.armv6 new file mode 100644 index 00000000..c08d09b4 --- /dev/null +++ b/Dockerfile.armv6 @@ -0,0 +1,38 @@ +FROM jc21/nginx-proxy-manager-base:armv6 + +MAINTAINER Jamie Curnow +LABEL maintainer="Jamie Curnow " + +ENV SUPPRESS_NO_CONFIG_WARNING=1 +ENV S6_FIX_ATTRS_HIDDEN=1 +RUN echo "fs.file-max = 65535" > /etc/sysctl.conf + +# Nginx, Node and required packages should already be installed from the base image + +# root filesystem +COPY rootfs / + +# s6 overlay +RUN curl -L -o /tmp/s6-overlay-arm.tar.gz "https://github.com/just-containers/s6-overlay/releases/download/v1.21.8.0/s6-overlay-arm.tar.gz" \ + && tar xzf /tmp/s6-overlay-arm.tar.gz -C / + +# App +ENV NODE_ENV=production + +ADD dist /app/dist +ADD node_modules /app/node_modules +ADD src/backend /app/src/backend +ADD package.json /app/package.json +ADD knexfile.js /app/knexfile.js + +# Volumes +VOLUME [ "/data", "/etc/letsencrypt" ] +CMD [ "/init" ] + +# Ports +EXPOSE 80 +EXPOSE 81 +EXPOSE 443 +EXPOSE 9876 + +HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://localhost:9876/health || exit 1 From 444dbd5160815a01d19eea1cf63ed1274ae4145b Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Wed, 20 Feb 2019 08:25:12 +1000 Subject: [PATCH 9/9] Added PR build steps to CI --- Jenkinsfile | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 58ec0124..b92e09e9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -14,9 +14,31 @@ pipeline { MAJOR_VERSION = "2" } stages { - stage('Prepare') { + stage('Build PR') { + when { + changeRequest() + } steps { - sh 'docker pull $DOCKER_CI_TOOLS' + ansiColor('xterm') { + // Codebase + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE yarn install' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE npm run-script build' + sh 'rm -rf node_modules' + sh 'docker run --rm -v $(pwd):/app -w /app $BASE_IMAGE yarn install --prod' + sh 'docker run --rm -v $(pwd):/data $DOCKER_CI_TOOLS node-prune' + + // Docker Build + sh 'docker build --pull --no-cache --squash --compress -t $TEMP_IMAGE .' + + // Private Registry + sh 'docker tag $TEMP_IMAGE $DOCKER_PRIVATE_REGISTRY/$IMAGE:$BRANCH_NAME' + withCredentials([usernamePassword(credentialsId: 'jc21-private-registry', passwordVariable: 'dpass', usernameVariable: 'duser')]) { + sh "docker login -u '${duser}' -p '$dpass' $DOCKER_PRIVATE_REGISTRY" + sh 'docker push $DOCKER_PRIVATE_REGISTRY/$IMAGE:$BRANCH_NAME' + } + + sh 'docker rmi $TEMP_IMAGE' + } } } stage('Build Develop') {