Skip to content

Commit

Permalink
reworked rss publisher to keep status of a configurable number recent…
Browse files Browse the repository at this point in the history
… builds.

Converted over to using the ruby rss library.  There are better libraries
that could be used, but this one comes with ruby so it doesn't add new external
dependencies.

A configuration option 'keep' specifies how many total builds to retain in the feed.
The default is 1 to match the previous behavior.

The rss library really insists on building a valid feed, so I had to add
description and link elements that weren't present in the previous code.
The channel_link should be a url set in your config, or it will default to
using a file url pointed at the rss file being written.
The description is the string that used to be the title, and the new
title is now shorter.

The generated rss file will look slightly different to a human, but it
should be valid and it passes the Cerberus rss_publisher_test.rb
In some cases you might need to make adjustments in whatever scripts you
may have that parse the rss after it's generated.
  • Loading branch information
iconoclast committed Mar 20, 2010
1 parent 1a3490d commit 1f7176a
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 17 deletions.
2 changes: 2 additions & 0 deletions doc/site/src/options.page
Expand Up @@ -38,6 +38,8 @@ publisher:
on_event:
rss:
file:
channel_link:
keep:
on_event:
campfire:
url:
Expand Down
2 changes: 2 additions & 0 deletions lib/cerberus/config.example.yml
Expand Up @@ -23,6 +23,8 @@ publisher:
# url: http://someemail:password@cerberustool.campfirenow.com/room/51660
# rss:
# file: /usr/www/rss.xml
# channel_link: http://example.com/rss.xml
# keep: 1
# extra_subject: "#deployment #tags"
#builder:
# rake:
Expand Down
46 changes: 29 additions & 17 deletions lib/cerberus/publisher/rss.rb
@@ -1,29 +1,41 @@
require 'cerberus/publisher/base'
require 'time'
require 'builder'
require 'rss'

class Cerberus::Publisher::RSS < Cerberus::Publisher::Base
def self.publish(state, manager, options)
config = options[:publisher, :rss]
subject,body = Cerberus::Publisher::Base.formatted_message(state, manager, options)

pub_date = Time.now.iso8601
description = "<pre>#{body}</pre>".to_xs
result = <<-END
<rss version="2.0">
<channel>
<title>Cerberus build feed for #{options[:application_name].to_xs}</title>
<pubDate>#{pub_date}</pubDate>
<generator>http://rubyforge.org/projects/cerberus</generator>
<item>
<title>#{subject.to_xs}</title>
<pubDate>#{pub_date}</pubDate>
<description>#{description}</description>
</item>
</channel>
</rss>
END
pub_date = Time.now

IO.write(config[:file], result)
begin
feed = RSS::Parser.parse(File.read(config[:file]), false)
raise RSS::Error unless feed
keep = config[:keep] || 1
feed.items.slice!(keep -1 ..-1) # one less than keep value, to make room for the new build
rescue RSS::Error, Errno::ENOENT
# if there's no existing file or we can't parse it, start a new one from scratch
feed = RSS::Maker.make("2.0") do |new_rss|
new_rss.channel.title = "#{options[:application_name].to_xs} build status"
new_rss.channel.description = "Cerberus build feed for #{options[:application_name].to_xs}"
new_rss.channel.generator = "http://rubyforge.org/projects/cerberus"
new_rss.channel.link = config[:channel_link] || "file://#{config[:file]}"
end
end

# update channel link if we have it explicitly set, otherwise retain existing value
feed.channel.link = config[:channel_link] unless config[:channel_link].nil?
feed.channel.pubDate = pub_date

new_item = RSS::Rss::Channel::Item.new()
new_item.title = subject
new_item.pubDate = pub_date
new_item.description = "<pre>#{body}</pre>"

feed.items.unshift new_item

IO.write(config[:file], feed)
end
end

0 comments on commit 1f7176a

Please sign in to comment.