Platinum Partner
agile,version control,git

Git Pre Recieve Hook For Integrity

I’m getting married rather soon so time has been somewhat short (in a good way) for just hacking on stuff, but I’ve finally found a little bit of time to play with something I’ve been mulling over for a while. Namely a continuous deployment workflow using the integrity continous integration server.

I’m hoping to have an incredibly simple but fully operation example available at some point – mainly to act as a good discussion point. For now here’s my current pre-receive hook.

#!/usr/bin/env ruby

require 'rubygems'
require 'grit'
require 'nokogiri'
require 'open-uri'

# This is a pre-receive git hook designed to be part of a continuous
# deployment workflow using the Integrity continuous integration server

INTEGRITY = 'http://localhost:9292'
PROJECT = 'site'

# 1. Check if the build is currently broken
# 2. If it's broken check if the commit messages starts with
# [BUILD] and if so trigger a build
# 3. If it's broken and all messages don't have the prefix
# then stop the push
# 4. If the build is fine then let everything through

doc = Nokogiri::HTML(open("#{INTEGRITY}/#{PROJECT}"))
doc.css('div#last_build h1').each do |heading|
  content = heading.content.split
  @status = content[-1]
end

if @status == "failed"
  puts "Build currently broken, to force use the [BUILD] commit message prefix"
  old_rev, new_rev, ref_name = STDIN.gets.split

  repo = Grit::Repo.new(".")

  commits = repo.commits_between(old_rev, new_rev)

  commits.reverse.each do |c|
    short, long = c.message.split(/\n+/, 2)
    if short.slice(0..7) != "[BUILD]
puts "Cancelling push"
exit 1
end
end
end

 

Published at DZone with permission of {{ articles[0].authors[0].realName }}, DZone MVB. (source)

Opinions expressed by DZone contributors are their own.

{{ tag }}, {{tag}},

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}
{{ parent.authors[0].realName || parent.author}}

{{ parent.authors[0].tagline || parent.tagline }}

{{ parent.views }} ViewsClicks
Tweet

{{parent.nComments}}