Created
September 10, 2012 18:16
-
-
Save jlmonteiro/3692673 to your computer and use it in GitHub Desktop.
pre-commit-hook
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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