Subversion/Hooks: Unterschied zwischen den Versionen

Aus schokokeks.org Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
K (typo)
 
(8 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
<pre>#! /usr/bin/ruby
Subversion-Hooks lassen sich dazu verwenden, Benutzern über Jabber oder Mail über Veränderungen in Repositories zu informieren. ''Hooks'' sind allgemein gesprochen Einstiegspunkte, die eine bestimmte Software bietet.


$:.unshift '../../../../../lib'
=Implementation=


require 'optparse'
Das zentrale Script ''commit-notification.rb'' ist, wie man unschwer an der Dateiendung erkennt, ein Ruby-Script. Es versteht die vier Argumente ''-r'' (''--revision''), ''-d'' (''--repos''), ''-c'' (''--config''), ''-u'' (''--user'') und ''-p'' (''--password''). Die Parameter sind zwingend notwendig, ohne sie funktioniert es nicht. Der verwendete Hook ''post-commit'' wird in der Datei ''/path/to/repository/hooks/post-commit'' spezifiziert und muss folgenden Inhalt haben:
require 'xmpp4r'
#! /bin/sh
require 'inifile'
REPOS="$1"
require 'optparse'
REV="$2"
require 'net/smtp'
/usr/local/bin/subversion/commit-notification.rb \
include Jabber
    --revision "$REV" \
    --repos "$REPOS" \
    --config /home/user/path/to/file.ini \
    --user 'jabberuser' \
    --password 'jabbersecret'


=Jabber=


revision = nil
Damit Nachrichten per Jabber versandt werden können, muss man dem Script sowohl den Benutzer als auch das Passwort mitgeben. Der Benutzer wird im Format ''username@server.com/Resource'' angegeben. Man kann dazu entweder einen existierenden Benutzer angeben oder auch einen neuen registrieren. Letzteres sollte mit den Administratoren abgesprochen werden.
repository = String.new


OptionParser::new do |opts|
==Konfiguration==
opts.banner = "notification.rb: Sends notifcation about svn commits via mail and jabber"
''commit-notification.rb'' ist so implementiert, dass jeder User die von ihm gewünschten Einstellungen vornehmen kann. Dazu gehört sowohl die Angabe der Mail- und Jabberadresse, als auch die Art der Benachrichtigung (derzeitig: Jabber oder Mail). Die Einstellungen werden in der Datei ''datei.ini'' vorgenommen. Wie sich auch hier an der Dateiendung erkennen lässt, handelt es sich bei der Datei um ein Ini-File, die wie folgt aufgebaut ist:
opts.banner << "\n\n"
[mmustermann]
opts.banner << 'Usage: notification.rb --revision \'revision\' --repository \'repository\''
name = Max Mustermann
opts.separator ''
mail = mmustermann@nu2m.de
opts.on( '-r', '--revision REVISION',     'revision of the project' ) { |r| revision  = r }
jabber = max@example.org
opts.on( '-d', '--repository REPOSITORY', 'path to the repository' ) { |d| repository = d }
project = repos_name,
opts.on_tail('-h', '--help', 'Show this message') do
  notification = mail,jabber
puts opts
Wichtig ist dabei, dass die die Direktive ''project'' dem Namen des Repositories entspricht. Ebenso darf der Username (in eckigen Klammern notiert) nicht doppelt notiert sein.
exit 2
  end
  opts.parse!(ARGV)
end


 
[[Kategorie:Webserver]]
if revision.nil? or repository == ""
[[Kategorie:Subversion]]
exit 1
end
 
class SVNLook
def initialize( repository, revision)
@repository = repository
@revision = revision
end
def GetAttrib( function )
return `/usr/bin/svnlook #{function} #{@repository} -r #{@revision}`
end
end
 
 
def SendJabberNotification( address, message )
myJID = JID::new('bot@strojny.net/CaptainHook')
myPassword = 'foobarfoobar'
JID::new(address)
cl = Client::new(myJID, false)
cl.connect
cl.auth(myPassword)
m = Message::new(address, message).set_type(:chat).set_id('1')
cl.send(m)
cl.close
end
 
 
def GetAddress( project, type, short = false)
ini = IniFile::new( )
ini.load( "/svn/usermap.ini" )
ret = Array.new
ini.sections do |username|
if ini[username]['project'].split(",").find {|p| project.strip == p.strip }
if type == "jabber" and  ini[username]['notification'].split(",").find {|v| v.strip == "jabber"}
ret.push( ini[username]["jabber"] )
elsif type == "mail" and ini[username]['notification'].split(",").find {|v| v.strip == "mail"}
if short == true
ret.push( ini[username]["mail"] )
else
ret.push( ini[username]["name"].to_s << " <" << ini[username]["mail"].to_s << ">")
end
end
end
end
return ret
end
 
def SendMailNotification( receiver, subject, message )
Net::SMTP.start('localhost', 25) do |smtp|
smtp.open_message_stream( "no-reply@dev.nu2m.de", receiver ) do |stream|
stream.puts "Subject: #{subject}"
stream.puts
stream.puts "#{message}"
end
end
end
 
svnlook = SVNLook::new( repository, revision )
diff = svnlook.GetAttrib( "diff" )
log = svnlook.GetAttrib( "log" )
author = svnlook.GetAttrib( "author" )
changed = svnlook.GetAttrib( "changed" )
project = repository.split("/").last
address_jabber = GetAddress( project, "jabber" )
 
message =  "-------------------------------------------------------------------------\n"
message << "Project: #{project} | New Revision #{revision} | Author:  #{author}"
message << "-------------------------------------------------------------------------\n"
message << "Log: #{log}"
message << "-------------------------------------------------------------------------\n"
message << "Files:\n"
message << "#{changed}"
message << "-------------------------------------------------------------------------\n"
 
subject = "[Nu2M-commits] " << project << " "
mail_message = message + diff
jabber_message = "\n" + message
 
SendMailNotification( GetAddress( project, "mail", true ), subject, mail_message)
GetAddress( project, "jabber" ).each { |address| SendJabberNotification( address, jabber_message ) }</pre>

Aktuelle Version vom 11. September 2008, 17:30 Uhr

Subversion-Hooks lassen sich dazu verwenden, Benutzern über Jabber oder Mail über Veränderungen in Repositories zu informieren. Hooks sind allgemein gesprochen Einstiegspunkte, die eine bestimmte Software bietet.

Implementation

Das zentrale Script commit-notification.rb ist, wie man unschwer an der Dateiendung erkennt, ein Ruby-Script. Es versteht die vier Argumente -r (--revision), -d (--repos), -c (--config), -u (--user) und -p (--password). Die Parameter sind zwingend notwendig, ohne sie funktioniert es nicht. Der verwendete Hook post-commit wird in der Datei /path/to/repository/hooks/post-commit spezifiziert und muss folgenden Inhalt haben:

#! /bin/sh
REPOS="$1"
REV="$2"
/usr/local/bin/subversion/commit-notification.rb \
   --revision "$REV" \
   --repos "$REPOS" \
   --config /home/user/path/to/file.ini \
   --user 'jabberuser' \
   --password 'jabbersecret'

Jabber

Damit Nachrichten per Jabber versandt werden können, muss man dem Script sowohl den Benutzer als auch das Passwort mitgeben. Der Benutzer wird im Format username@server.com/Resource angegeben. Man kann dazu entweder einen existierenden Benutzer angeben oder auch einen neuen registrieren. Letzteres sollte mit den Administratoren abgesprochen werden.

Konfiguration

commit-notification.rb ist so implementiert, dass jeder User die von ihm gewünschten Einstellungen vornehmen kann. Dazu gehört sowohl die Angabe der Mail- und Jabberadresse, als auch die Art der Benachrichtigung (derzeitig: Jabber oder Mail). Die Einstellungen werden in der Datei datei.ini vorgenommen. Wie sich auch hier an der Dateiendung erkennen lässt, handelt es sich bei der Datei um ein Ini-File, die wie folgt aufgebaut ist:

[mmustermann]
name = Max Mustermann
mail = mmustermann@nu2m.de
jabber = max@example.org
project = repos_name,
notification = mail,jabber

Wichtig ist dabei, dass die die Direktive project dem Namen des Repositories entspricht. Ebenso darf der Username (in eckigen Klammern notiert) nicht doppelt notiert sein.