This plugin allows for the abstraction of building, uploading, and promoting habitat packages. ## Pre-Reqs \- Must have Jenkins setup for building habitat packages - A designated origin and the corresponding keys uploaded to slaves to run job - Habitat Auth Token specified as a Jenkins credential ## Usage ### Tasks Currently the available tasks are: \* \`build\`: executes a build of a habitat package \* \`upload\`: uploads a habitat hart file \* \`promote\`: promotes a habitat package \* \`demote\`: demotes a habitat package \* \`channels\`: lists channels of a specific habitat package \* \`export\`: exports a habitat package to a specific format \* valid formats: \`aci\`, \`cf\`, \`docker\`, \`kubernetes\`, \`mesos\`, \`tar\` \* \`search\`: searches the builder API for a specific string \* \`config\`: gets the default configuration from the specified habitat package ident \* \`exec\`: executes a command in the context of a habitat package \* \`binlink\`: installs and links the habitat package ### Options ### Example Build and Upload Job pipeline { agent any environment { HAB_NOCOLORING = true HAB_BLDR_URL = 'https://bldr.habitat.sh/' HAB_ORIGIN = 'skylerto' } stages { stage('scm') { steps { git url: 'https://github.com/skylerto/nexus-habitat.git', branch: 'master' } } stage('build') { steps { habitat task: 'build', directory: '.', origin: "${env.HAB_ORIGIN}", docker: true } } stage('upload') { steps { withCredentials([string(credentialsId: 'depot-token', variable: 'HAB_AUTH_TOKEN')]) { habitat task: 'upload', authToken: env.HAB_AUTH_TOKEN, lastBuildFile: "${workspace}/results/last_build.env", bldrUrl: "${env.HAB_BLDR_URL}" } } } } } ### Example Promotion/Release Job pipeline { agent any environment { HAB_NOCOLORING = true HAB_BLDR_URL = 'https://bldr.habitat.sh/' } stages { stage('promote') { steps { script { env.HAB_CHANNEL = input message: 'Please provide a channel', parameters: [ string(description: 'Habitat Channel', name: 'channel') ] } script { env.HAB_PKG = input message: 'Please provide an artifact', parameters: [ string(description: 'Habitat Package', name: 'package') ] } //Hard-coding your "${env.HAB_CHANNEL}" removes the need to ask for it (improved automation) //You could also set env.HAB_PKG programatically, like so: /* script { env.HAB_PKG = sh ( script: "ls -t "{$workspace}"/results | grep hart | head -n 1", returnStdout: true ).trim() } */ withCredentials([string(credentialsId: 'depot-token', variable: 'HAB_AUTH_TOKEN')]) { habitat task: 'promote', channel: "${env.HAB_CHANNEL}", authToken: "${env.HAB_AUTH_TOKEN}", artifact: "${env.HAB_PKG}", bldrUrl: "${env.HAB_BLDR_URL}" } } } } } ### Other Shiny New Features \`\`\` pipeline { agent any environment { HAB\_NOCOLORING = true HAB\_BLDR\_URL = '' HAB\_AUTH\_TOKEN = 'my-hab-auth-token-name' HAB\_PKG = 'core/googlemock/1.8.0/20180609191841' } stages { stage('instantiate\_variable'){ steps { script { env.PKG\_FILE\_NAME = sh( script: "ls -t ${workspace}/results/ \| grep hart \| head -n 1", returnStdout: true ).trim() } script { env.TMP\_PKG\_NAME = sh( script: "echo ${env.PKG\_FILE\_NAME} \| sed 's/-x86\_64-linux.hart//' \| cut -d '-' -f 2-20 \| sed 's/\\\\(.\*\\\\)-/\\\\1\\\\//' \| sed 's/\\\\(.\*\\\\)-/\\\\1\\\\//'", returnStdout: true ).trim() } script { env.DOCKER\_IMG\_NAME = sh( script: "echo ${env.TMP\_PKG\_NAME} \| cut -d '/' -f 1", returnStdout: true ).trim() } script { env.PKG\_NAME = "${env.HAB\_ORIGIN}" + '/' + "${env.TMP\_PKG\_NAME}" } } } stage('demote') { //demotes habitat pkg from specified channel in builder habitat task: 'demote', channel: 'development', authToken: "${env.HAB\_AUTH\_TOKEN}", artifact: "${env.HAB\_PKG}", bldrUrl: "${env.HAB\_BLDR\_URL}" } stage('channels') { //lists channels specified habitat pkg belongs to habitat task: 'channels', authToken: "${env.HAB\_AUTH\_TOKEN}", artifact: "${env.HAB\_PKG}", bldrUrl: "${env.HAB\_BLDR\_URL}" } stage('config') { //lists configuration options build into package habitat task: 'config', artifact: "${env.PKG\_NAME}", authToken: "${env.HAB\_AUTH\_TOKEN}", bldrUrl: "${env.HAB\_BLDR\_URL}" } stage('export') { //export hart file to any format ("aci", "cf", "docker", "kubernetes", "mesos", "tar") //must provide a hart file instead of full pkg origin/name/path habitat task: 'export', format: "docker", lastBuildFile: "${workspace}/results/last\_build.env", bldrUrl: "${env.HAB\_BLDR\_URL}" } stage('search') { //search an origin for all packages matching search string habitat task: 'search', searchString: '\', authToken: "${env.HAB\_AUTH\_TOKEN}", bldrUrl: "${env.HAB\_BLDR\_URL}" } stage('exec') { //execute commands within context of habitat pkg habitat task: 'exec', artifact: "${env.PKG\_NAME}", command: '\' } stage('binlink') { //link habitat pkg to local system's bin executeable habitat task: 'binlink', path: '/usr/local/bin', binary 'bash', artifact: "${env.PKG\_NAME}", authToken: "${env.HAB\_AUTH\_TOKEN}", bldrUrl: "${env.HAB\_BLDR\_URL}" } } } } \`\`\` The directory for the \`build\` task must be local to the repository as the studio is created under the root of the repository.