| #!/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) |
| } |
| } |
| } |
| } |
| } |