diff --git a/vars/bakeAMI.groovy b/vars/bakeAMI.groovy index 352665d3..4e87b251 100644 --- a/vars/bakeAMI.groovy +++ b/vars/bakeAMI.groovy @@ -52,22 +52,26 @@ def call(body) { bakeEnv << "CB_BUILD_NO=${config.cookbookVersion}" bakeEnv << "BUCKET_REGION=${config.bucketRegion}" def skipCookbookUpload = config.get('skipCookbookUpload',false) + def cookbookBundle = config.get('cookbookBundle',false) def role = config.get('role').toUpperCase() node { println "bake config:${config}" deleteDir() - git(url: 'https://github.com/base2Services/ciinabox-bakery.git', branch: 'master') + git(url: 'https://github.com/base2Services/ciinabox-bakery.git', branch: config.get('ciinaboxBakeryBranch', 'master')) def sourceAMI = lookupAMI config def branchName = env.BRANCH_NAME.replaceAll("/", "-") bakeEnv << "SOURCE_AMI=${sourceAMI}" bakeEnv << "BRANCH=${branchName}" withEnv(bakeEnv) { - sh './configure $CIINABOX_NAME $REGION $AMI_USERS' - + ciinaboxVPC config + if(skipCookbookUpload) { sh 'mkdir -p cookbooks' + } else if(cookbookBundle) { + unstash 'chefbundle' + sh 'tar xvfz chef-bundle.tar.gz' } else { unstash 'cookbook' sh 'tar xvfz cookbooks.tar.gz' @@ -82,6 +86,7 @@ def call(body) { ''' sh '''#!/bin/bash AMI_BUILD_ID=${BRANCH}-${AMI_BUILD_NUMBER} + export OPT_VARS="-var ami_users=${AMI_USERS}" echo "===================================================" echo "Baking AMI: ${ROLE}" echo "AMI Build NO: ${AMI_BUILD_ID}" diff --git a/vars/chefspec.groovy b/vars/chefspec.groovy index e6271385..07feb2c7 100644 --- a/vars/chefspec.groovy +++ b/vars/chefspec.groovy @@ -17,6 +17,7 @@ def call(body) { echo "==========================================" cd $WORKSPACE/$COOKBOOK gem install version + gem install rspec_junit_formatter berks install if [ $? -ne 0 ]; then echo "Berkshelf install Failed!" diff --git a/vars/ciinaboxVPC.groovy b/vars/ciinaboxVPC.groovy new file mode 100644 index 00000000..eefe02f0 --- /dev/null +++ b/vars/ciinaboxVPC.groovy @@ -0,0 +1,77 @@ +/*********************************** + ciinabox VPC + + Lookups the output Params from the ciinabox vpc and writes them to a + json file in the workspace called base_params.json + + example usage + ciinaboxVPC( + ciinabox: 'ciinabox', + region: env.REGION, + availabilityZone: 'a' + ) + the optional az attribute allows you to override which availability zone is returned + ************************************/ + @Grab(group='com.amazonaws', module='aws-java-sdk-cloudformation', version='1.11.359') + +import com.amazonaws.services.cloudformation.* +import com.amazonaws.services.cloudformation.model.* + +def call(body) { + def config = body + + def az = config.get('availabilityZone', 'a').toUpperCase() + def ciinaboxName = config.get('ciinabox', 'ciinabox') + def ciinabox = ciinaboxStack(ciinaboxName, config.region) + if(ciinabox) { + def outputs = [:] + ciinabox.outputs.each { output -> + outputs[output.outputKey] = output.outputValue + } + println "ciinabox outputs:${outputs}" + def paramsFile = config.get('outputFile','base_params.json') + def exist = fileExists(paramsFile) + if(exist) { + new File(paramsFile).delete() + } + writeFile file: paramsFile, text: toJson(outputs, az) + } else { + throw new RuntimeException("no ciinabox stack ${ciinabox} found") + } + +} + +@NonCPS +def ciinaboxStack(stackName, region) { + try { + def cf = setupClient(region) + DescribeStacksResult result = cf.describeStacks(new DescribeStacksRequest().withStackName(stackName)) + return result.getStacks().get(0) + } catch (AmazonCloudFormationException ex) { + if(ex.message.contains("does not exist")) { + return null + } else { + throw ex + } + } +} + +@NonCPS +def toJson(outputs, az) { + subnet = "ECSPrivateSubnet${az}" + def json_text = """{ + "region": "${outputs['Region']}", + "vpc_id": "${outputs['VPCId']}", + "subnet_id": "${outputs[subnet]}", + "security_group": "${outputs['SecurityGroup']}", + "packer_role": "${outputs['ECSRole']}", + "packer_instance_profile": "${outputs['ECSInstanceProfile']}" + }""" + return json_text +} + +@NonCPS +def setupClient(region) { + def cb = AmazonCloudFormationClientBuilder.standard().withRegion(region) + return cb.build() +} diff --git a/vars/verifyAMI.groovy b/vars/verifyAMI.groovy index a6d018e7..9377a6f4 100644 --- a/vars/verifyAMI.groovy +++ b/vars/verifyAMI.groovy @@ -12,7 +12,7 @@ def call(body) { node { deleteDir() unstash 'cookbook' - withEnv(["REGION=${config.get('region')}", "VERIFY_AMI=${config.get('ami')}", "ROLE=${config.get('role')}", "COOKBOOK=${config.get('cookbook')}"]) { + withEnv(["REGION=${config.get('region')}", "VERIFY_AMI=${config.get('ami')}", "ROLE=${config.get('role')}", "COOKBOOK=${config.get('cookbook')}", "INSTANCE_TYPE=${config.get('instance_type')}"]) { withAWSKeyPair(config.get('region')) { sh '''#!/bin/bash eval "$(/opt/chefdk/bin/chef shell-init bash)" @@ -27,6 +27,7 @@ cat < .kitchen.local.yml driver: aws_ssh_key_id: ${KEYNAME} user_data: userdata.sh + instance_type: ${INSTANCE_TYPE} verifier: name: inspec