class git { package { 'git': ensure => installed, } define repository($project = $name, $cwd, $dir = "$cwd/${project}", $repo = "githost:${project}.git", $no_ensure = 0) { $require = $no_ensure ? { 1 => [Package['git']], default => [Package['git'], File[$cwd]], } include git exec { "git-clone-${name}": require => $require, command => "git clone ${repo} ${dir}", cwd => $cwd, user => root, creates => $dir, } } define web_project($project = $name, $basedir = "/var/www", $dir = undef) { $mydir = "$dir" ? { /./ => $dir, default => "${basedir}/${project}", } git::repository { $project: } exec { "git-web-reset-${name}": logoutput => on_failure, require => Git::Repository[$project], command => "git reset --hard HEAD", cwd => $mydir, user => root, } exec { "git-web-clean-${name}": logoutput => on_failure, require => Exec["git-web-reset-${name}"], command => "git clean -f", cwd => $mydir, user => root, } exec { "git-web-fetch-${name}": logoutput => on_failure, require => Exec["git-web-clean-${name}"], command => "git fetch origin", cwd => $mydir, user => root, } exec { "git-web-tag-${name}": logoutput => on_failure, require => Exec["git-web-fetch-${name}"], command => "git checkout \"release-\$(git tag | cut -d\\- -f2 | sort -rn | head -n1)\"", cwd => $mydir, user => root, } file { "git-web-conf-${name}": owner => root, group => root, mode => 0644, require => Exec["git-web-tag-${name}"], ensure => link, path => "/etc/httpd/conf.d/${project}.conf", target => "$mydir/conf/${project}.conf", } } }