blob: 037f3e43ffd922c1228f6d1f0c9dfe114a08dd8d [file] [log] [blame]
#!/usr/bin/env groovy
def initSourceTree(boardName, needsNative = false) {
sh """
/opt/gcompute-tools/git-cookie-authdaemon
git config --global url.https://aiyprojects.googlesource.com/.insteadOf sso://aiyprojects/
mkdir -p .repo/local_manifests
mkdir -p cache
chmod 777 cache .repo/local_manifests
"""
timeout(time: 20, unit: 'MINUTES') {
checkout([$class: 'RepoScm',
currentBranch: true,
jobs: 24,
manifestRepositoryUrl: 'http://coral.googlesource.com/manifest',
manifestBranch: 'master',
manifestFile: "${boardName}.xml",
manifestGroup: "default,internal",
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.arm64', filter: '**/*.tgz')
copyArtifacts(projectName: 'global.pbuilder.armhf', filter: '**/*.tgz')
} else {
copyArtifacts(projectName: 'global.pbuilder.cross', filter: '**/*.tgz')
}
}
def buildTarget(targetName) {
def nprocs = sh(returnStdout: true, script: 'nproc').trim()
sh "bash -c 'source build/setup.sh; m -j${nprocs} prereqs ${targetName}; exit \$?'"
}
def nameFromRepoType(repoType, boardName) {
if (repoType == "core") {
return "core"
} else if (repoType == "bsp") {
return "bsp-${boardName}"
} else {
error 'Unknown repoType ${repoType}'
}
}
def uploadAllGeneratedPackages(repoType, boardName, packageNames, includeSources = true) {
def outPath = repoType
def repoName = nameFromRepoType(repoType, boardName)
echo 'Packages to upload are: ${packageNames}'
for (packageName in packageNames) {
def date = new Date()
String stamp = date.format("yyyyMMdd-HHmmss")
def packages = findFiles(glob: "out/**/${packageName}*.deb")
def sources = []
if (includeSources == true) {
sources = findFiles(glob: "out/**/${packageName}*.dsc")
}
def filenames = (packages + sources).each{entry -> entry.path}
if (filenames.size() == 0) {
error 'No packages were generated! Assuming failed build.'
}
sh """
aptly task run repo add -force-replace unstable-${repoName} ${filenames.join(' ')}, \
snapshot create unstable-${repoName}-${stamp} from repo unstable-${repoName}
"""
}
}
def buildPackagePipeline(boardName, repoType, targetName, packageNames, needsNative = false, includeSources = true) {
def workspacePath = "/home/jenkins/workspace"
def buildLabel = "${targetName}-${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: 'gcr.io/mendel-linux-cloud-infra/mendel-builder:latest',
command: 'cat',
args: '',
ttyEnabled: true,
privileged: true)
def aptlyVolume = persistentVolumeClaim(claimName: 'aptly-state', mountPath: '/var/lib/aptly')
podTemplate(label: buildLabel, containers: [jnlpContainer, debianContainer], volumes: [aptlyVolume], envVars: []) {
node(buildLabel) {
dir(sourcePath) {
container('debian') {
stage('Init') {
initSourceTree(boardName, needsNative)
}
stage('Build') {
buildTarget(targetName)
}
stage('Deploy') {
sh 'ls '
uploadAllGeneratedPackages(repoType, boardName, packageNames, includeSources)
}
}
}
}
}
}