[chef] Re: Re: setting up a continuous integration system with Chef... (not going so well so far)


Chronological Thread 
  • From: Daniel DeLeo < >
  • To:
  • Subject: [chef] Re: Re: setting up a continuous integration system with Chef... (not going so well so far)
  • Date: Sat, 15 Mar 2014 08:51:12 -0700

I just wanted to say that this reply is amazing. The way people in our 
community step up to help each other is truly delightful.  

--  
Daniel DeLeo


On Saturday, March 15, 2014 at 4:39 AM, Zac Stevens wrote:

> Hi Phil,
>  
> On Fri, Mar 14, 2014 at 11:24 PM, phil swenson 
> <
>  
> (mailto: )>
>  wrote:
> > I posted about this yesterday, I’m going to post again - but this time 
> > with links to code.
> >  
> > Here is the code:
> >  
> > https://github.com/pswenson/JenkinsChefRecipe
>  
> Code always helps, so thanks for linking that up...
>  
> > My goal is to be able to install java, oracle DB, jenkins server, install 
> > jenkins slaves, create jobs, update jobs with Chef Solo on a system of 15 
> > servers. 1 server will be the jenkins master and the other 14 will be 
> > slaves.
> >  
> > I’m starting my recipe with java and jenkins installs.
> >  
> > I’m guessing I’m doing several things wrong:
> >  
> > I ended up configuring the java attributes in nodes/redstone.json as I 
> > couldn’t get them to work inside my recipe. It seems to me it would be 
> > better to do this in my recipe as this will not be node specific, I want 
> > it global.  
> >  
> > Here is what happens with the current code (even with include_recipe 
> > "java::default”  
> > as suggested by Christopher Armstrong)
> >  
> > Any help, suggestions, critiques would be greatly appreciated. Links to 
> > real-life projects would be great, almost everything I see is completely 
> > trivial or just doc on attributes for recipes. I’d love to see a real 
> > life project I could download and execute.  
>  
> Good cookbooks typically use the README file to document the attributes you 
> may want to manipulate - that's certainly true for the java coobkook (see 
> https://github.com/socrata-cookbooks/java/blob/master/README.md ;). As an 
> example of putting it all together, you might want to look at this cookbook 
> ( https://github.com/zts/cooking-with-jenkins ;) I wrote to experiment with 
> Jenkins configuration. It hasn't been updated to use the latest version of 
> the Jenkins cookbook, but it will show you how to make use of some 
> community cookbooks to achieve your goal.  
>  
> With that said, let's look at the problem you're having...
>  
> > here is the output for running the current code:  
> >  
> >  
> >  :~/dev/chef/myfirstcookbook
> >  (master)$ knife solo cook 
> > 
> > WARNING: solo.rb found, but since knife-solo v0.3.0 it is not used any 
> > more
> > WARNING: Please read the upgrade instructions: 
> > https://github.com/matschaffer/knife-solo/wiki/Upgrading-to-0.3.0
> > Running Chef on redstone...
> > Checking Chef version...
> > Installing Berkshelf cookbooks to 
> > '/Users/philswenson/.berkshelf/knife-solo/35c024dd80a9ab482eadf86b98a86fb90c9521d7'...
> > Using myfirstcookbook (0.1.0)
> > Using jenkins (2.0.2)
> > Using git (3.1.0)
> > Using java (1.20.0)
> > Using apt (2.3.8)
> > Using runit (1.5.10)
> > Using build-essential (2.0.0)
> > Using yum (3.1.4)
> > Using yum-epel (0.3.4)
> > Using dmg (2.2.0)
> > Using windows (1.30.0)
> > Using chef_handler (1.1.5)
> > Uploading the kitchen...
> > cannot delete non-empty directory: main
> > WARNING: Local role_path './roles' does not exist
> > WARNING: Local data_bag_path './data_bags' does not exist
> > WARNING: Local environment_path './environments' does not exist
> > Generating solo config...
> > Running Chef...
> > Starting Chef Client, version 11.10.4
> > [2014-03-14T19:07:47-04:00] WARN: unable to detect ip6address
> > Compiling Cookbooks...
> > HI PHIL HI PHIL
> >  
> > ================================================================================
> >   
> > Recipe Compile Error in 
> > /root/chef-solo/cookbooks-3/main/recipes/default.rb
> > ================================================================================
> >  
> >  
> > NoMethodError  
> > -------------
> > undefined method `[]' for nil:NilClass
> >  
> >  
> > Cookbook Trace:
> > ---------------
> > /root/chef-solo/cookbooks-2/java/recipes/oracle.rb:38:in `from_file'
> > /root/chef-solo/cookbooks-2/java/recipes/default.rb:22:in `from_file'
> > /root/chef-solo/cookbooks-3/main/recipes/default.rb:8:in `from_file'
> >  
> >  
> > Relevant File Content:  
> > ----------------------
> > /root/chef-solo/cookbooks-2/java/recipes/oracle.rb:
> >  
> > 31:
> > 32: case node['java']['jdk_version'].to_s
> > 33: when "6"
> > 34: tarball_url = node['java']['jdk']['6'][arch]['url']
> > 35: tarball_checksum = node['java']['jdk']['6'][arch]['checksum']
> > 36: bin_cmds = node['java']['jdk']['6']['bin_cmds']
> > 37: when "7"
> > 38>> tarball_url = node['java']['jdk']['7'][arch]['url']
> > 39: tarball_checksum = node['java']['jdk']['7'][arch]['checksum']
> > 40: bin_cmds = node['java']['jdk']['7']['bin_cmds']
> > 41: end
> > 42:
> > 43: if tarball_url =~ /example.com/ (http://example.com/)
> > 44: Chef::Application.fatal!("You must change the download link to your 
> > private repository. You can no longer download java directly from 
> > http://download.oracle.com without a web broswer";)
> > 45: end
> > 46:
> > 47: include_recipe "java::set_java_home"  
>  
>  
>  
> The error "undefined method `[]' for nil:NilClass" means that some code has 
> tried to look up a key - "item['key']" on an item that is set to nil (which 
> doesn't know how to look up keys. The error doesn't tell us exactly which 
> item was nil - it technically could be "node", but it almost certainly 
> isn't, so we can guess that it's one of the chain of attributes - 'java' -> 
> 'jdk' -> '7' -> 'arch'.  
>  
> If the 'java' attribute hasn't been set, node['java'] will equal nil. That 
> means that node['java']['jdk'] would equal nil['jdk'], which would cause 
> the error you saw. You do set the 'java' attribute in your node file, so 
> that's probably not the problem here. Let's look at the next one. If 
> node['java']['jdk'] is unset, that will equal nil - and 
> node['java']['jdk']['7'] will cause the error.  
>  
> The java cookbook's attributes file should be setting that attribute, so 
> why isn't this working? Daniel DeLeo explained this in your previous thread 
> - most likely, you haven't put "depends 'java'" in your cookbook's 
> metadata.rb. If you were using chef-client/server, this would cause an 
> error as soon as you tried to include_recipe "java" - because you're using 
> chef-solo, the include_recipe succeeds while the cookbook hasn't been 
> properly loaded.  
>  
> As Daniel noted, the solution is to add the dependency to your metadata.rb
>  
> Checking your code to confirm that, I see a metadata.rb in the root of your 
> git repository - but that repository doesn't look like a cookbook (I guess 
> it's your chef-repo for use with "knife solo"). You don't need a 
> metadata.rb in your chef-repo (it won't do anything), but you do need one 
> in every cookbook.  
>  
> I'd suggest installing the Foodcritic tool ( http://www.foodcritic.io/ ;), 
> which you can do with "gem install foodcritic". It checks your Chef code 
> for a bunch of different things, suggesting improvements for any problems 
> it finds. Let's check yours:  
>  
> $ pwd
> /Users/zts/code/JenkinsChefRecipe
> $ foodcritic cookbooks
> FC011: Missing README in markdown format: cookbooks/main/README.md:1 
> (http://README.md:1)
> FC031: Cookbook without metadata file: cookbooks/main/metadata.rb:1
> FC045: Consider setting cookbook name in metadata: 
> cookbooks/main/metadata.rb:1
>  
>  
> You don't need to fix everything it tells you, but you should make sure you 
> understand each issue before choosing to ignore it. The main problem it 
> reports here is that the cookbook "main" didn't have a metadata file. Let's 
> move the one from the root of your repository into cookbooks/main, and try 
> again:  
>  
> $ mv metadata.rb cookbooks/main/
> $ foodcritic cookbooks
> FC007: Ensure recipe dependencies are reflected in cookbook metadata: 
> cookbooks/main/recipes/default.rb:8
> FC007: Ensure recipe dependencies are reflected in cookbook metadata: 
> cookbooks/main/recipes/default.rb:16
> FC008: Generated cookbook metadata needs updating: 
> cookbooks/main/metadata.rb:3
> FC011: Missing README in markdown format: cookbooks/main/README.md:1 
> (http://README.md:1)
>  
>  
> Now we see that your recipe "main::default" depends on two cookbooks that 
> haven't been declared in your metadata.rb. Fix that up, then the attributes 
> from the 'java' and 'jenkins' cookbooks will be properly loaded, and you 
> should get a little bit further. You should also update the other fields in 
> metadata.rb (especially the cookbook name) to match your cookbook.  
>  
> Hope that helps,
>  
>  
> Zac  





Archive powered by MHonArc 2.6.16.

§