pipeline {
	agent none
	environment {
		GLUON_SITEDIR = "contrib/ci/minimal-site"
		GLUON_TARGET = "x86-64"
		BUILD_LOG = "1"
	}
	stages {
		stage('lint') {
			parallel {
				stage('lint-lua') {
					agent { label 'gluon-docker' }
					steps {
						sh label: 'Identify runner', script: 'echo $SLAVE_NAME'
						sh 'make lint-lua'
					}
				}
				stage('lint-sh') {
					agent { label 'gluon-docker-v1' }
					steps {
						sh label: 'Identify runner', script: 'echo $SLAVE_NAME'
						sh 'make lint-sh'
					}
				}
			}
		}
		stage('docs') {
			agent { label 'gluon-docker' }
			steps {
				sh label: 'Identify runner', script: 'echo $SLAVE_NAME'
				sh 'make -C docs html'
			}
		}
		stage('build') {
			agent { label 'gluon-docker-v2' }
			steps {
				sh label: 'Identify runner', script: 'echo $SLAVE_NAME'
				sh 'make update'
				sh 'test -d /dl_cache && ln -s /dl_cache openwrt/dl || true'
				sh 'make -j$(nproc) V=s'
				stash includes: '**/output/images/factory/*-x86-64.img.gz', name: 'gluon-x86-64-factory'
			}
		}
		stage('test') {
			agent { label 'gluon-docker-v2' }
			environment {
				TMUX = "notmux"
			}
			steps {
				sh label: 'Identify runner', script: 'echo $SLAVE_NAME'
				unstash 'gluon-x86-64-factory'
				sh label: 'Unpack image', script: 'gunzip -cd ./output/images/factory/*x86-64*.img.gz > ./image.img'
				sh label: 'Print python environment', script: 'python3 -m pip freeze'
				script {
					for (f in findFiles(glob: 'tests/*.py')) {
						sh label: "Test ${f.name}", script: "python3 tests/${f.name} --use-tmp-workdir"
					}
				}
			}
		}
	}
}

/*
 api-history:

 Every time the build dependencies of gluon change, the version
 every container has to be rebuilt. Therefore, we use Jenkins
 labels which intoduce a version number which is documented here.
 As soon, as you properly rebuilt your docker container, you
 can notify lemoer, that you have updated your node.

 - gluon-docker-v1:
   - add shellcheck binary to the build environment
 - gluon-docker-v2:
   - add qemu-testlab testing, requires KVM virtualization support
   - require rsync dependency to be able to build the next branch
*/