| #!/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) { |
| sh "bash -c 'source build/setup.sh; m 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) { |
| def outPath = repoType |
| def repoName = nameFromRepoType(repoType, boardName) |
| |
| for (packageName in packageNames) { |
| def date = new Date() |
| String stamp = date.format("yyyyMMdd-HHmmss") |
| |
| def packages = findFiles(glob: "out/**/${packageName}*.deb") |
| def 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) { |
| 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') { |
| uploadAllGeneratedPackages(repoType, boardName, packageNames) |
| } |
| } |
| } |
| } |
| } |
| } |