Skip to content

Instantly share code, notes, and snippets.

@jlmonteiro
Created September 10, 2012 18:16
Show Gist options
  • Save jlmonteiro/3692673 to your computer and use it in GitHub Desktop.
Save jlmonteiro/3692673 to your computer and use it in GitHub Desktop.
pre-commit-hook
/**
* User: jorge.monteiro
* Date: 02/08/12
* Time: 09:52
*/
@Grapes([
@Grab(group = 'org.tmatesoft.svnkit', module = 'svnkit', version = '1.7.5'),
@Grab(group='log4j', module='log4j', version='1.2.17')
])
import org.tmatesoft.svn.core.wc.admin.SVNLookClient
import org.tmatesoft.svn.core.auth.BasicAuthenticationManager
import org.tmatesoft.svn.core.wc.SVNWCUtil
import org.tmatesoft.svn.core.wc.admin.ISVNChangeEntryHandler
import org.tmatesoft.svn.core.wc.admin.SVNChangeEntry
import org.tmatesoft.svn.core.wc.SVNRevision
import org.apache.log4j.Logger
import org.apache.log4j.PatternLayout
import org.apache.log4j.DailyRollingFileAppender
import org.apache.log4j.Level
// Constantes
// -----------------------------------------------------------------
// Diretório dos logs
LOG_OUTPUT_DIR = "c:/logs/svn/hooks/"
// Nome do arquivo de log
LOG_FILE_NAME = "pre-commit.log"
// Hostname ou IP do servidor onde o jenkins está instalado
JENKINS_SERVER = "localhost"
// Base URL do Jenkins
JENKINS_BASE_URL = "http://$JENKINS_SERVER:8080/"
// Nome do Projeto no Jenkins
JENKINS_JOB = "Teste"
// Username que acessará o Jenkins
JENKINS_USERNAME = "jorge.monteiro"
// API Token utilizado com o senha. Pode ser obtido em
// http://localhost:8080/user/USERNAME/configure
JENKINS_API_TOKEN = "d8e2a37dd929617efbc5934e8113c0fb"
// Configuramos o log
def root = Logger.rootLogger
def appender = new DailyRollingFileAppender(
new PatternLayout("[%d{dd/MM/yyyy HH:mm:ss}] %5p (%F:%L) - %m%n"),
"$LOG_OUTPUT_DIR/$LOG_FILE_NAME",
"'.'dd-MM-yyyy"
)
root.addAppender(appender)
root.level = Level.DEBUG
// Obtemos a URL do repositório e a transação de commit
def repoRoot = args[0]
def transaction = args[1]
// Revisão e repositório hard coded para testes. No hook será utilizada a transação.
//repoRoot = "c:/repo/jversion"
//revision = new SVNRevision(4)
// Criamos uma categoria por transação. Desta forma fica fácil consultar
// os logs por transação utilizando grep ou ferramenta similar.
log = Logger.getLogger("TX-$transaction")
log.info "Iniciando transação $transaction"
log.debug "Repositório: $repoRoot"
SVNLookClient client = new SVNLookClient(new BasicAuthenticationManager(null, null), SVNWCUtil.createDefaultOptions(true))
ChangesHandler changesHandler = new ChangesHandler();
client.doGetChanged(new File(repoRoot), transaction, changesHandler, true)
// Carregamos o comentário do commit...
// Com base em metadados informados no comentário, podemos iniciar ações customizadas.
// Exemplo: Fechamento de versão pode exigir um job ou parâmetros diferentes no Jenkins
def comment = client.doGetLog(new File(repoRoot), transaction)
log.debug "Comentário SVN: $comment"
//TODO carregar do arquivo properties a senha de acesso do usuário author para realizar o commit
// Carregamos o autor do commit
def author = client.doGetAuthor(new File(repoRoot), transaction)
log.debug "Autor SVN: $author"
// Carregamos a data do commit apenas para fins de log...
def date = client.doGetDate(new File(repoRoot), transaction)
log.debug "Data Commit: $date"
log.info "Commit iniciado por $author em $date."
// Se o commit não possuir comentário...
if (comment == '') {
log.error "Commit não possui comentário. Cancelando o commit."
// Esta mensagem será exibida no output do client SVN
System.err.println("O comentário do commit é obrigatório.")
log.error "Commit cancelado por falta de comentário"
// Exit diferente de 0 significa falha de excução.
System.exit(1)
} else {
log.debug "Comentário encontrado."
}
log.debug "Arquivos e Diretórios enviados no Commit:"
// Para cada mudança encontrada no SVN...
for (change in changesHandler.changes) {
//Aqui podemos dar algum tratamento a cada arquivo enviado...
log.debug "\t -> $change"
}
log.info "Iniciando Job $JENKINS_JOB no Jenkins..."
log.debug "URL Jenkins: $JENKINS_BASE_URL/job/$JENKINS_JOB/build?delay=0"
//TODO tratar caso de autenticação no Jenkins
def getURL = new URL("$JENKINS_BASE_URL/job/$JENKINS_JOB/build?delay=0")
def connection = getURL.openConnection()
connection.doOutput = true
connection.connect()
class ChangesHandler implements ISVNChangeEntryHandler {
List changes = new ArrayList()
@Override
void handleEntry(SVNChangeEntry svnChangeEntry) {
changes.add(new ChangedInfo(
path: svnChangeEntry.path,
type: svnChangeEntry.kind.toString(),
operation: svnChangeEntry.type.toString()
));
}
}
class ChangedInfo {
String path
String type
String operation
public String toString() {
return "[$path, $type, $operation]";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment