pipeline {
	triggers {
		cron( env.BRANCH_NAME.equals('master') ? 'H 1 * * *' : '')
	}
	agent {
		label 'docker-multiarch'
	}
	options {
		buildDiscarder(logRotator(numToKeepStr: '5'))
		disableConcurrentBuilds()
		ansiColor('xterm')
	}
	environment {
		IMAGE        = 'nginx-full'
		BUILDX_NAME  = "${IMAGE}_${GIT_BRANCH}"
		BRANCH_LOWER = "${BRANCH_NAME.toLowerCase().replaceAll('/', '-')}"
		// Software versions; OpenResty does not support Lua >= 5.2
		OPENRESTY_VERSION = '1.21.4.2'
		CROWDSEC_OPENRESTY_BOUNCER_VERSION = '0.1.7'
		LUA_VERSION       = '5.1.5'
		LUAROCKS_VERSION  = '3.3.1'
	}
	stages {
		stage('Environment') {
			parallel {
				stage('Master') {
					when {
						branch 'master'
					}
					steps {
						script {
							env.BASE_TAG                       = 'latest'
							env.BUILDX_PUSH_TAGS               = "-t docker.io/jc21/${IMAGE}:${BASE_TAG}"
							env.BUILDX_PUSH_TAGS_ACMESH        = "-t docker.io/jc21/${IMAGE}:acmesh"
							env.BUILDX_PUSH_TAGS_CERTBOT       = "-t docker.io/jc21/${IMAGE}:certbot"
							env.BUILDX_PUSH_TAGS_ACMESH_GOLANG = "-t docker.io/jc21/${IMAGE}:acmesh-golang"
							env.BUILDX_PUSH_TAGS_CERTBOT_NODE  = "-t docker.io/jc21/${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_TAG                       = "github-${BRANCH_LOWER}"
							env.ACMESH_BASE_TAG                = "github-${BRANCH_LOWER}-acmesh"
							env.CERTBOT_BASE_TAG               = "github-${BRANCH_LOWER}-certbot"
							env.BUILDX_PUSH_TAGS               = "-t docker.io/jc21/${IMAGE}:${BASE_TAG}"
							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 --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 --push -f docker/Dockerfile.acmesh ${BUILDX_PUSH_TAGS_ACMESH}"
					sh "./scripts/buildx --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 --push -f docker/Dockerfile.acmesh-golang ${BUILDX_PUSH_TAGS_ACMESH_GOLANG}"
					sh "./scripts/buildx --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/jc21/${IMAGE}) as:

- `jc21/${IMAGE}:github-${BRANCH_LOWER}`
- `jc21/${IMAGE}:github-${BRANCH_LOWER}-certbot`
- `jc21/${IMAGE}:github-${BRANCH_LOWER}-certbot-node`
- `jc21/${IMAGE}:github-${BRANCH_LOWER}-acmesh`
- `jc21/${IMAGE}:github-${BRANCH_LOWER}-acmesh-golang`
""")
				}
			}
		}
	}
	post {
		success {
			juxtapose event: 'success'
			sh 'figlet "SUCCESS"'
		}
		failure {
			juxtapose event: 'failure'
			sh 'figlet "FAILURE"'
		}
		unstable {
			juxtapose event: 'unstable'
			sh 'figlet "UNSTABLE"'
		}
	}
}
