#!/usr/bin/env groovy

enum Repository {
    CORE, BSP

    String toOutDirName() {
        return this.name().toLowerCase()
    }

    String toRepoDirName(String boardName) {
        if (this == Repository.CORE) {
            return this.name().toLowerCase()
        } else {
            return "${this.name().toLowerCase()}-${boardName}"
        }
    }
};

def initSourceTree(boardName, needsNative = false) {
    sh """
       apt-get update
       apt-get -y install make python curl git qemu-user-static sudo
       curl https://storage.googleapis.com/git-repo-downloads/repo > /usr/local/bin/repo
       chmod a+x /usr/local/bin/repo
       mkdir -p .repo/local_manifests
       mkdir -p cache
       chmod 777 cache
       """

    timeout(time: 3, unit: 'MINUTES') {
        checkout([$class: 'RepoScm',
                  currentBranch: true,
                  jobs: 24,
                  manifestRepositoryUrl: 'http://coral.googlesource.com/manifest',
                  manifestBranch: 'master',
                  manifestFile: "${boardName}.xml",
                  depth: 1,
                  quiet: true])
    }

    // Bring in the pbuilder tarballs.
    //
    // archiveArtifacts includes the relative path to the
    // files we archive, so we don't have to specify cache/
    // here in the target.
    if (needsNative) {
        copyArtifacts(projectName: 'global.pbuilder.native', filter: '**/*.tgz')
    } else {
        copyArtifacts(projectName: 'global.pbuilder.cross', filter: '**/*.tgz')
    }
}

def buildTarget(targetName) {
    sh "bash -c 'source build/setup.sh; m prereqs ${targetName}; exit \$?'"
}

def archivePackage(boardName, packageName, repo = Repository.CORE) {
    def workspacePath = "/home/jenkins/workspace"
    def archivePath = "${workspacePath}/pool/${repo.toRepoDirName(boardName)}"

    sh """
       mkdir -p ${archivePath}
       cp src/out/target/product/*/packages/${repo.toOutDirName()}/${packageName}_* ${archivePath}
       """

    archiveArtifacts(
        artifacts: "${archivePath}/**",
        fingerprint: true)
}

def buildPackagePipeline(boardName, packageName, repo = Repository.CORE, needsNative = false) {
    def workspacePath = "/home/jenkins/workspace"
    def buildLabel = "build-${packageName}-${UUID.randomUUID().toString()}"
    def sourcePath = "${workspacePath}/src"

    // FIXME(jtgans): Get rid of privileged! This is a security risk!
    def jnlpContainer = containerTemplate(name: 'jnlp',
                                          image: 'jenkins/jnlp-slave:alpine')
    def debianContainer = containerTemplate(name: 'debian',
                                            image: 'debian:buster-slim',
                                            command: 'cat',
                                            ttyEnabled: true,
                                            privileged: true)

    podTemplate(label: buildLabel, containers: [jnlpContainer, debianContainer], envVars: []) {
        node(buildLabel) {
            dir(sourcePath) {
                stage('Init') {
                    container('debian') {
                        sh 'echo ==================== directory contents; ls'
                        deleteDir()
                        initSourceTree(boardName, needsNative)
                    }
                }

                stage('Build') {
                    container('debian') {
                        buildTarget(packageName)
                    }
                }
            }

            dir(workspacePath) {
                stage('Deploy') {
                    archivePackage(boardName, packageName, repo)
                }
            }
        }
    }
}
