pipeline {
        agent {
              dockerfile { filename 'Jenkinsfiles/ubuntu-18.04.dockerfile' }
        }
        stages {
                stage('Lint') {
                    steps {
                        sh '''
                            ./.ci/run-pylint -f text || :
                            ./.ci/run-pylint -f json | ./.ci/prfilter

                            ./.ci/run-shellcheck || :
                            ./.ci/run-shellcheck -f json | ./.ci/prfilter
                        '''
                    }
                }
                stage('Build') {
                    steps {
                        sh '''
                            ./Scripts/clean-check-prepare
                            make -j 8 DEBUG=1 WERROR=1
                            make -j 8 DEBUG=1 WERROR=1 test
                           '''
                    }
                }
                stage('Test') {
                    steps {
                        sh '''
                            cd Pal/regression
                            make regression
                            '''
                        sh '''
                            cd LibOS/shim/test/regression
                            make regression
                            '''
                        sh '''
                            cd LibOS/shim/test/fs
                            make test
                            '''
                        sh '''
                            cd LibOS/shim/test/apps/ltp
                            make
                            make ltp.xml
                            '''
                        timeout(time: 5, unit: 'MINUTES') {
                            sh '''
                                cd LibOS/shim/test/apps/python-simple
                                PYTHONVERSION=python3.6 make check
                            '''
                        }
                        timeout(time: 5, unit: 'MINUTES') {
                            sh '''
                                cd LibOS/shim/test/apps/python-scipy-insecure
                                PYTHONVERSION=python3.6 make check
                            '''
                        }
                        timeout(time: 5, unit: 'MINUTES') {
                            sh '''
                                cd LibOS/shim/test/apps/bash
                                make regression
                            '''
                        }
                        timeout(time: 5, unit: 'MINUTES') {
                            sh '''
                                cd LibOS/shim/test/apps/curl
                                make check
                           '''
                        }
                        timeout(time: 5, unit: 'MINUTES') {
                            sh '''
                                cd LibOS/shim/test/apps/gcc
                                make check
                           '''
                        }
                        timeout(time: 20, unit: 'MINUTES') {
                            sh '''
                                cd LibOS/shim/test/apps/lmbench
                                make test N_RUNS=1 ENOUGH=100
                            '''
                        }
                        timeout(time: 10, unit: 'MINUTES') {
                            sh '''
                                cd LibOS/shim/test/apps/redis
                                make
                                make start-graphene-server &
                                sleep 1
                                ./src/src/redis-benchmark
                            '''
                        }
                        timeout(time: 10, unit: 'MINUTES') {
                            sh '''
                                cd LibOS/shim/test/apps/lighttpd
                                make
                                make start-graphene-server &
                                sleep 1
                                LOOP=1 CONCURRENCY_LIST="1 32" ./benchmark-http.sh 127.0.0.1:8003
                            '''
                        }
                        timeout(time: 10, unit: 'MINUTES') {
                            sh '''
                                cd LibOS/shim/test/apps/nginx
                                make
                                make start-graphene-server &
                                sleep 1
                                LOOP=1 CONCURRENCY_LIST="1 32" ./benchmark-http.sh 127.0.0.1:8002
                            '''
                        }
                        timeout(time: 20, unit: 'MINUTES') {
                            sh '''
                                cd LibOS/shim/test/apps/apache
                                make
                                make start-graphene-server &
                                sleep 1
                                LOOP=1 CONCURRENCY_LIST="1 32" ./benchmark-http.sh 127.0.0.1:8001
                                LOOP=1 CONCURRENCY_LIST="1 32" ./benchmark-http.sh https://127.0.0.1:8443
                            '''
                        }
                        sh '''
                           # Workaround LTP bug (see https://github.com/linux-test-project/ltp/issues/560 for upstream fix):
                           git -C LibOS/shim/test/apps/ltp/src checkout -- utils/ffsb-6.0-rc2/config.h.in utils/ffsb-6.0-rc2/configure

                           ./Scripts/gitignore-test
                        '''
                        sh '''
                           cd "$(./Scripts/clean-check-test-copy)"

                           make distclean
                           make -C LibOS/shim/test/regression clean

                           make -C LibOS/shim/test/apps/ltp clean
                           # LTP's make clean is broken, see https://github.com/linux-test-project/ltp/issues/559
                           rm -rf /tmp/graphene-debug-18.04.clean-check.clean/LibOS/shim/test/apps/ltp/src
                           rm -rf LibOS/shim/test/apps/ltp/src

                           make -C LibOS/shim/test/apps/python-simple clean
                           make -C LibOS/shim/test/apps/python-scipy-insecure clean
                           make -C LibOS/shim/test/apps/bash clean
                           make -C LibOS/shim/test/apps/curl clean
                           make -C LibOS/shim/test/apps/gcc clean
                           make -C LibOS/shim/test/apps/lmbench distclean
                           make -C LibOS/shim/test/apps/redis distclean
                           make -C LibOS/shim/test/apps/lighttpd distclean
                           make -C LibOS/shim/test/apps/nginx distclean
                           make -C LibOS/shim/test/apps/apache distclean

                           ./Scripts/clean-check
                        '''
                    }
                    post {
                        always {
                            archiveArtifacts 'LibOS/shim/test/apps/ltp/ltp.xml'

                            junit 'Pal/regression/pal-regression.xml'
                            junit 'LibOS/shim/test/regression/libos-regression.xml'
                            junit 'LibOS/shim/test/apps/ltp/ltp.xml'
                        }
                    }
                }
                stage('Deploy') {
                    steps {
                        sh 'echo Deploying code'
                    }
                }
        }
        post {
                success {
                        echo 'Deployment successful'
                }
                failure {
                        echo 'Failure while on the pipeline'
                }
                unstable {
                        echo 'Pipeline marked as "unstable"'
                }
        }
}