[chef] Re: Re: Re: What is the cookbook development workflow in your team?


Chronological Thread 
  • From: Steffen Gebert < >
  • To:
  • Subject: [chef] Re: Re: Re: What is the cookbook development workflow in your team?
  • Date: Mon, 9 Jan 2012 10:58:38 +0100

Hi,

> someone in #chef irc pointed me to librarian [1], which solves this issue 
> by .gitignoring the cookbooks/ dir and pulling them in from another 
> location, e.g. a separate git repo.

You might want to have a look at git submodules for this (which does exactly 
that but doesn't require you to do anything with .gitignore or 3rd-party 
software.

Steffen

On 09.01.2012, at 09:34, Torben Knerr wrote:

> Hi James, Peter, Zuhaib,
> 
> thanks for sharing your experience and sorry for the delayed response.
> 
> One thing I noticed is that we also have our chef repo managed in a git 
> repository, which makes it natural the version the whole chef repo instead 
> of individual cookbooks (which is what James is doing). However, cookbooks 
> have a version in their metadata.rb, which brings up the urge in me to 
> version them separately, ideally in their own git repo. Someone in #chef 
> irc pointed me to librarian [1], which solves this issue by .gitignoring 
> the cookbooks/ dir and pulling them in from another location, e.g. a 
> separate git repo.
> I have also discussed with some other people, and my current gut feeling 
> tends to an approach like this:
> 
> - treat X.Y.Z versions with an odd Z as SNAPSHOT versions that might be 
> overridden in the Chef server without notice
> 
> - development and testing of SNAPSHOTs is done in a branch. Once it is 
> ready to release it gets an even Z, is merged back to master, uploaded to 
> the chef Server and frozen
> 
> - allow SNAPSHOTs only in lower environments, e.g. in dev env and for the 
> CI build they may be common, but in prod env you never have odd Z versions
> 
> - use librarian [1] so that cookbooks can be versioned independently in 
> their own git repos and can be pulled together as needed (e.g. branches for 
> CI build, tags for prod env)
> 
> - consider having developer private chef servers running in a local VM 
> while developing / testing a SNAPSHOT (if interference becomes an issue)
> 
> - some tooling would be required to automate the release process outlined 
> above (a la maven-release-plugin), and to check that cookbooks to be 
> released don't have dependencies to SNAPSHOT cookbooks, etc..
> 
> One thing that is different in maven is that you have SNAPSHOTs as an 
> explicit concept in the version number. Having this, you can easily tell 
> whether that thing is released or in development just by looking at the git 
> repo. In chef you have this concept only in the chef server (frozen vs not 
> frozen), but you can't tell from looking at the source. That's why you then 
> need to come up with conventions like odd Z ,versions etc...
> 
> Would introducing explicit SNAPSHOTs to Chef be an option? Or is this just 
> a special requirement which most people don't have in reality?
> 
> What do you think?
> 
> Cheers,
> Torben
> 
> [1] https://github.com/applicationsonline/librarian ;
> On Fri, Jan 6, 2012 at 12:26 AM, Zuhaib Siddique 
> < >
>  wrote:
> Peter,
> 
> Your idea sounds similar to what we at Oxygen Cloud use, which is changes 
> made to Chef cookbooks and checked in to git and at the same time uploaded 
> to our chef server (we have a small bash script that helps you do both at 
> the same time, saves a lot of time).  At which time using Jenkins we would 
> kick off an integration server to make sure it runs correctly and deploys 
> our code correctly.  If that passes I manually bump the version and we call 
> it stable till I make some changes/hack.  And then we have a script that 
> kills all old servers and clear their Node/Client.
> 
> The thing I would like to do is is stop deploying servers for quicker Chef 
> testing use Shef but from my short time testing the thing it seems only 
> good for unit testing blocks of code but it wont help you do a full test of 
> a cookbook or recipe.  If someone has some tips or guides on doing that I 
> am very much open to it.  Also it seems Shef is not sandbox which mean 
> changes it makes will apply to your system which is bad as you would need 
> to run it in a VM which from my point of view more of a PITA then spinning 
> up new servers and killing them.
> 
> Zuhaib
> On Jan 5, 2012, at 1:32 PM, Peter Norton wrote:
> 
> > I'm interested in using chef+gerrit+jenkins to test new cookbooks in
> > our environment.  I'm thinking of a workflow like this:
> >
> > git checkin of a cookbook.
> >
> > The cookbook will have an associated unit test suite that jenkins will
> > run by deploying to a VM (probably an amazon EC2 t1.micro unless a
> > particular architecture is needed).  The cookbook will be run and if
> > it checks out, the version will be recorded as a candidate to become
> > elevated to the next environment.  I'm thinking of:
> >
> > sandbox (least reliable)
> > dev (someone's at least looking at it, may get incorporated in
> > integration tests)
> > staging (will be used for pre-producting integration testing)
> > production (the real thing)
> >
> > My only question is how to inject version numbers into the metadata in
> > a sane manner.  I can create/manipulate metadata.rb, but I can't see
> > an easy and clean way to put basic assurances with the X.Y.Z
> > versioning.
> >
> > The closest I've gotten is something like this:
> >
> > checkin foo with metadata.rb's version == 0.1.1.  All X.Y.Z releases
> > where (X%2 == false) are submitted by the dev/user, so can never be
> > part of dev, staging, or production.
> >
> > When it's committed and pushed to the git/gerrit server a jenkins job
> > is kicked off which uploads the new cookbook and launches a server
> > with this cookbook version explicitly in the run list to verify that
> > the job passes.  If it passes, then the jenkins server increments the
> > metadata so that version = 0.2.1 (matching Z values) and commits that
> > to a branch that doesn't require review.  That branch then gets
> > uploaded to the chef server again, but now with the new version
> > number.
> >
> > When moving from unit test to integration tests (e.g. with
> > cluster_chef/metachef, doing an entire environment or facet build)
> > then the Y value will get incremented to 3, 4, or 5 as testing have 
> > created for veewee...
> > proceeds.
> >
> > The thing I'm trying to solve is being able to use the same chef
> > account for the life of the cookbook so that version X.Y.Z will always
> > be the same if called in any environment.  The issue I'm having is
> > that fencing off particular minor (Y) revision numbers seems to invite
> > mis-understandings and casual mistakes.
> >
> > Has anyone else dealt with this issue, or does anyone have a more
> > enlightened way of looking at the problem?
> >
> > -Peter
> >
> > On Thu, Jan 5, 2012 at 2:15 PM, James Litton 
> > < >
> >  wrote:
> >> The git repo clone on the host is not necessary. It could certainly be
> >> done from a dev box or build server. Doing that from a build server
> >> would make a lot of sense, actually. The reason has just been a matter
> >> of convenience. We don't have to run multi-knife or a similar system
> >> because dev boxes always push to dev, test to test and so on. This
> >> also prevents an accidental push to prod in the case that someone
> >> forgets to branch after push, etc.
> >>
> >> versioning of cookbooks has been entirely haphazard(at best) with no
> >> ill effects so far, but this approach has only been in place a month
> >> or so. none of our cookbook depends specify version numbers. The
> >> biggest problem with this approach has been that it makes it more
> >> difficult to commit back to public cookbooks.
> >>
> >> No, that situation has not come up. If it were to come up, we would
> >> roll back to that point in the git repository not just the cookbook.
> >>
> >> James
> >>
> >> On Thu, Jan 5, 2012 at 1:12 AM, Torben Knerr 
> >> < >
> >>  wrote:
> >>> Hi James,
> >>>
> >>> thanks for sharing! Interesting to see the different approaches you can 
> >>> go
> >>> for.
> >>>
> >>> Few questions about your approach:
> >>>
> >>> 1) as you describe you have a git repo clone of your chef repository on 
> >>> each
> >>> of your chef servers, then check out locally on the chef server and then
> >>> knife upload to localhost if i understood correctly. Why do you need a 
> >>> git
> >>> repo clone of your chef repository on the chef server? Wouldn't it be 
> >>> enough
> >>> to knife upload from an external box (e.g. developer's box, build 
> >>> server) to
> >>> either of your chef servers?
> >>>
> >>> 2) as far as i understand your cookbook dependencies are versionless 
> >>> during
> >>> delevopment/upload/test/fix cycles and you always release the whole chef
> >>> repo instead of single cookbooks. As soon as you do a release, does the
> >>> script you mention update the Version number of all your cookbooks? 
> >>> Does it
> >>> at this point in time also add this version number to the cookbook 
> >>> depends
> >>> statements (and remove it afterwards for the next dev/upload/test/fix
> >>> cycle)?
> >>>
> >>> 3) do you ever have the situation that you need to set up a node with an
> >>> older cookbook version (e.g. for regression testing)?
> >>>
> >>> Cheers,
> >>> Torben
> >>>
> >>>
> >>> On Thu, Jan 5, 2012 at 4:24 AM, James Litton 
> >>> < >
> >>>  wrote:
> >>>>
> >>>> Torben,
> >>>>
> >>>>  Thank you for bringing this up. I have also been puzzling about this
> >>>> recently.
> >>>>
> >>>> Right now the process that I am using involves 3 chef servers.
> >>>>
> >>>> Development:
> >>>> - Branch git
> >>>> - Test/Deploy on Chef Solo (dedicated dev box with separate role in
> >>>> prod chef server)
> >>>>
> >>>> Test:
> >>>> - Checkout branch on test chef server
> >>>> - Push entire configuration (via shell script that I wrote)
> >>>> - Force a chef-client run on a hosts in test by environment (Load
> >>>> Test, staging, preview)
> >>>> - Complete testing
> >>>>
> >>>> Code Review
> >>>> - Review the changes in the branch as well as the test cases
> >>>>
> >>>> Prod (hosts developer environment and production hosts):
> >>>> - Merge branch to master
> >>>> - git pull on prod
> >>>> - Push config via script
> >>>> - Force chef-client run here only if required due to external 
> >>>> requirement
> >>>>
> >>>> The only issue really is the Test Chef server sharing, but testing can
> >>>> generally be done quickly by maintaining smaller updates.
> >>>>
> >>>> cookbook versions number changes aren't as important due to re-upload
> >>>> of the cookbook with each push and splitting environments across chef
> >>>> servers
> >>>>
> >>>> The release process is not currently automated other than the script
> >>>> that updates all roles, environments, data bags and cookbooks with
> >>>> each release.
> >>>>
> >>>> Generally the entire chef repository is treated as a version/release
> >>>> in order to avoid version dependencies within each cycle.
> >>>>
> >>>> I'd also love to hear what other people are doing.
> >>>>
> >>>> James
> >>>> PagerDuty
> >>>>
> >>>> On Wed, Jan 4, 2012 at 11:58 AM, Torben Knerr 
> >>>> < >
> >>>>  wrote:
> >>>>> Hi everybody,
> >>>>>
> >>>>> Happy New Year! :-)
> >>>>>
> >>>>> This is my first post to this mailing list. I'm trying to implement a
> >>>>> proper
> >>>>> workflow for developing cookbooks within a small team. Coming from a
> >>>>> slightly different background (Java, Maven and the like) I'm looking 
> >>>>> for
> >>>>> some experience on how to implement a typical develop/test/release 
> >>>>> cycle
> >>>>> in
> >>>>> a Chef environment.
> >>>>>
> >>>>> So, assuming you are developing cookbooks in a team, how would you go
> >>>>> for
> >>>>> adding a new feature to a cookbook:
> >>>>>
> >>>>>  (a) develop -> test (using Vagrant/Chef Solo) -> repeat
> >>>>> develop/fix/test
> >>>>> cycle until done -> upload to team's chef server
> >>>>>  (b) develop -> test (upload to a private chef server) -> repeat
> >>>>> develop/fix/test cycle until done -> upload to team's chef server
> >>>>>  (c) develop -> test (upload directly to team's chef server) -> repeat
> >>>>> develop/fix/test cycle until done
> >>>>>
> >>>>>
> >>>>> I'm especially interested in:
> >>>>>
> >>>>>  1) at which point in time do you share your sources (git push)?
> >>>>>     - are you working on feature branches, then merge + push when 
> >>>>> done?
> >>>>>     - when do you increase the cookbook version? in the commit where 
> >>>>> you
> >>>>> merge back to master?
> >>>>>     - when do you create the tag? everytime you commit something on
> >>>>> master?
> >>>>>
> >>>>>  2) at which point in time do you upload the cookbook to the team's 
> >>>>> chef
> >>>>> server (knife upload)?
> >>>>>     - whenever you want to test something?
> >>>>>     - strictly only after creating a tag (i.e. releases only)?
> >>>>>     - do you always freeze uploaded cookbooks?
> >>>>>     - do you allow to overwrite cookbooks at all?
> >>>>>
> >>>>>  3) how do you handle releases?
> >>>>>     - is every upload to the chef repository automatically a (public?)
> >>>>> release for you?
> >>>>>     - do you have the release process (roughly: "run tests -> create 
> >>>>> tag
> >>>>> ->
> >>>>> upload cookbook") automated?
> >>>>>     - how do you handle cookbook dependencies when you release? do you
> >>>>> allow
> >>>>> for versionless cookbook depends?
> >>>>>
> >>>>>
> >>>>> Eager to hear your experiences. Any help is appreciated!
> >>>>>
> >>>>> Cheers,
> >>>>> Torben
> >>>
> >>>
> 
> 




Archive powered by MHonArc 2.6.16.

§