pipeline {
	triggers {
		cron( env.BRANCH_NAME.equals('master') ? 'H 1 * * *' : '')
	}
	agent {
		label 'docker-multiarch'
	}
	options {
		buildDiscarder(logRotator(numToKeepStr: '5'))
		disableConcurrentBuilds()
		ansiColor('xterm')
	}
	environment {
		DOCKERHUB_NAMESPACE = 'nginxproxymanager'
		IMAGE               = 'nginx-full'
		BUILDX_NAME         = "${IMAGE}_${GIT_BRANCH}"
		BRANCH_LOWER        = "${BRANCH_NAME.toLowerCase().replaceAll('/', '-')}"
		OPENRESTY_VERSION   = '1.29.2.4'
		LUA_VERSION         = '5.5.0'
		LUAROCKS_VERSION    = '3.13.0'
	}
	stages {
		stage('Environment') {
			parallel {
				stage('Master') {
					when {
						branch 'master'
					}
					steps {
						script {
							env.BASE_IMAGE                     = "${DOCKERHUB_NAMESPACE}/${IMAGE}:latest"
							env.BUILDX_PUSH_TAGS               = "-t ${BASE_IMAGE}"
							env.BUILDX_PUSH_TAGS_ACMESH        = "-t ${DOCKERHUB_NAMESPACE}/${IMAGE}:acmesh"
							env.BUILDX_PUSH_TAGS_CERTBOT       = "-t ${DOCKERHUB_NAMESPACE}/${IMAGE}:certbot"
							env.BUILDX_PUSH_TAGS_ACMESH_GOLANG = "-t ${DOCKERHUB_NAMESPACE}/${IMAGE}:acmesh-golang"
							env.BUILDX_PUSH_TAGS_CERTBOT_NODE  = "-t ${DOCKERHUB_NAMESPACE}/${IMAGE}:certbot-node"
						}
					}
				}
				stage('Other') {
					when {
						not {
							branch 'master'
						}
					}
					steps {
						script {
							// Defaults to the Branch name, which is applies to all branches AND pr's
							env.BASE_IMAGE                     = "${DOCKERHUB_NAMESPACE}/${IMAGE}:github-${BRANCH_LOWER}"
							env.ACMESH_IMAGE                   = "${BASE_IMAGE}-acmesh"
							env.CERTBOT_IMAGE                  = "${BASE_IMAGE}-certbot"
							env.BUILDX_PUSH_TAGS               = "-t ${BASE_IMAGE}"
							env.BUILDX_PUSH_TAGS_ACMESH        = "${BUILDX_PUSH_TAGS}-acmesh"
							env.BUILDX_PUSH_TAGS_CERTBOT       = "${BUILDX_PUSH_TAGS}-certbot"
							env.BUILDX_PUSH_TAGS_ACMESH_GOLANG = "${BUILDX_PUSH_TAGS}-acmesh-golang"
							env.BUILDX_PUSH_TAGS_CERTBOT_NODE  = "${BUILDX_PUSH_TAGS}-certbot-node"
						}
					}
				}
			}
		}
		stage('Base') {
			environment {
				BUILDX_NAME = "${IMAGE}_${GIT_BRANCH}_base"
			}
			steps {
				withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'DOCKER_PASS', usernameVariable: 'DOCKER_USER')]) {
					sh 'docker login -u "${DOCKER_USER}" -p "${DOCKER_PASS}"'
					sh "./scripts/buildx.sh --push -f docker/Dockerfile ${BUILDX_PUSH_TAGS}"
				}
			}
		}
		stage('Acme Clients') {
			environment {
				BUILDX_NAME = "${IMAGE}_${GIT_BRANCH}_node"
			}
			steps {
				withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'DOCKER_PASS', usernameVariable: 'DOCKER_USER')]) {
					sh 'docker login -u "${DOCKER_USER}" -p "${DOCKER_PASS}"'
					sh "./scripts/buildx.sh --push -f docker/Dockerfile.acmesh ${BUILDX_PUSH_TAGS_ACMESH}"
					sh "./scripts/buildx.sh --push -f docker/Dockerfile.certbot ${BUILDX_PUSH_TAGS_CERTBOT}"
				}
			}
		}
		stage('Dev Tools') {
			environment {
				BUILDX_NAME = "${IMAGE}_${GIT_BRANCH}_node"
			}
			steps {
				withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'DOCKER_PASS', usernameVariable: 'DOCKER_USER')]) {
					sh 'docker login -u "${DOCKER_USER}" -p "${DOCKER_PASS}"'
					sh "./scripts/buildx.sh --push -f docker/Dockerfile.acmesh-golang ${BUILDX_PUSH_TAGS_ACMESH_GOLANG}"
					sh "./scripts/buildx.sh --push -f docker/Dockerfile.certbot-node ${BUILDX_PUSH_TAGS_CERTBOT_NODE}"
				}
			}
		}
		stage('PR Comment') {
			when {
				allOf {
					changeRequest()
					not {
						equals expected: 'UNSTABLE', actual: currentBuild.result
					}
				}
			}
			steps {
				script {
					def comment = pullRequest.comment("""Docker Image for build ${BUILD_NUMBER} is available on [DockerHub](https://cloud.docker.com/repository/docker/${DOCKERHUB_NAMESPACE}/${IMAGE}) as:

- `${DOCKERHUB_NAMESPACE}/${IMAGE}:github-${BRANCH_LOWER}`
- `${DOCKERHUB_NAMESPACE}/${IMAGE}:github-${BRANCH_LOWER}-certbot`
- `${DOCKERHUB_NAMESPACE}/${IMAGE}:github-${BRANCH_LOWER}-certbot-node`
- `${DOCKERHUB_NAMESPACE}/${IMAGE}:github-${BRANCH_LOWER}-acmesh`
- `${DOCKERHUB_NAMESPACE}/${IMAGE}:github-${BRANCH_LOWER}-acmesh-golang`
""")
				}
			}
		}
	}
	post {
		always {
			printResult(true)
		}
	}
}
