summaryrefslogtreecommitdiffstats
path: root/groovy
diff options
context:
space:
mode:
authorJames Moger <james.moger@gitblit.com>2011-12-16 21:14:48 -0500
committerJames Moger <james.moger@gitblit.com>2011-12-16 21:16:48 -0500
commitfa54bec1d90ff0baa8a509bc68acb6a92bb817a8 (patch)
tree32b6d4521961757f6b60ab7d8a0ea0066f35d125 /groovy
parentb4573fc1fc4c71ef620b0473a503bde9a8fd3578 (diff)
downloadgitblit-fa54bec1d90ff0baa8a509bc68acb6a92bb817a8.tar.gz
gitblit-fa54bec1d90ff0baa8a509bc68acb6a92bb817a8.zip
Groovy push hooks
Diffstat (limited to 'groovy')
-rw-r--r--groovy/blockpush.groovy88
-rw-r--r--groovy/jenkins.groovy71
-rw-r--r--groovy/sendemail.groovy134
3 files changed, 293 insertions, 0 deletions
diff --git a/groovy/blockpush.groovy b/groovy/blockpush.groovy
new file mode 100644
index 00000000..eac7d3f5
--- /dev/null
+++ b/groovy/blockpush.groovy
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2011 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import java.text.MessageFormat;
+
+import com.gitblit.GitBlit
+import com.gitblit.models.RepositoryModel
+import com.gitblit.models.UserModel
+import org.eclipse.jgit.transport.ReceiveCommand
+import org.eclipse.jgit.transport.ReceiveCommand.Result
+import org.slf4j.Logger
+
+/**
+ * Sample Gitblit Pre-Receive Hook: blockpush
+ *
+ * This script could and perhaps should be further developed to provide
+ * a full repository-branch permissions system similar to gitolite or gitosis.
+ *
+ * The Pre-Receive hook is executed after an incoming push has been parsed,
+ * validated, and objects have been written but BEFORE the refs are updated.
+ * This is the appropriate point to block a push for some reason.
+ *
+ * This script is only executed when pushing to *Gitblit*, not to other Git
+ * tooling you may be using.
+ *
+ * If this script is specified in *groovy.preReceiveScripts* of gitblit.properties
+ * or web.xml then it will be executed by any repository when it receives a
+ * push. If you choose to share your script then you may have to consider
+ * tailoring control-flow based on repository access restrictions.
+ *
+ * Scripts may also be specified per-repository in the repository settings page.
+ * Shared scripts will be excluded from this list of available scripts.
+ *
+ * This script is dynamically reloaded and it is executed within it's own
+ * exception handler so it will not crash another script nor crash Gitblit.
+ *
+ * If you want this hook script to fail and abort all subsequent scripts in the
+ * chain, "return false" at the appropriate failure points.
+ *
+ * Bound Variables:
+ * gitblit Gitblit Server com.gitblit.GitBlit
+ * repository Gitblit Repository com.gitblit.models.RepositoryModel
+ * user Gitblit User com.gitblit.models.UserModel
+ * commands JGit commands Collection<org.eclipse.jgit.transport.ReceiveCommand>
+ * url Base url for Gitblit String
+ * log Logger instance org.slf4j.Logger
+ *
+ */
+
+// Indicate we have started the script
+logger.info("blockpush hook triggered by ${user.username} for ${repository.name}: checking ${commands.size} commands")
+
+/*
+ * Example rejection of pushes to the master branch of example.git
+ */
+def blocked = false
+switch (repository.name) {
+ case "ex@mple.git":
+ for (ReceiveCommand command : commands) {
+ def updatedRef = command.refName
+ if (updatedRef.equals("refs/heads/master")) {
+ // to reject a command set it's result to anything other than Result.NOT_ATTEMPTED
+ command.setResult(Result.REJECTED_OTHER_REASON, "You are not permitted to write to ${repository.name}:${updatedRef}")
+ blocked = true
+ }
+ }
+ break
+
+ default:
+ break
+}
+
+if (blocked) {
+ // return false to break the push hook chain
+ return false
+} \ No newline at end of file
diff --git a/groovy/jenkins.groovy b/groovy/jenkins.groovy
new file mode 100644
index 00000000..df4e588f
--- /dev/null
+++ b/groovy/jenkins.groovy
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2011 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import com.gitblit.GitBlit
+import com.gitblit.Keys
+import com.gitblit.models.RepositoryModel
+import com.gitblit.models.UserModel
+import com.gitblit.utils.JGitUtils
+import org.eclipse.jgit.lib.Repository
+import org.eclipse.jgit.revwalk.RevCommit
+import org.eclipse.jgit.transport.ReceiveCommand
+import org.eclipse.jgit.transport.ReceiveCommand.Result
+import org.slf4j.Logger
+
+/**
+ * Sample Gitblit Post-Receive Hook: jenkins
+ *
+ * The Post-Receive hook is executed AFTER the pushed commits have been applied
+ * to the Git repository. This is the appropriate point to trigger an
+ * integration build or to send a notification.
+ *
+ * This script is only executed when pushing to *Gitblit*, not to other Git
+ * tooling you may be using.
+ *
+ * If this script is specified in *groovy.postReceiveScripts* of gitblit.properties
+ * or web.xml then it will be executed by any repository when it receives a
+ * push. If you choose to share your script then you may have to consider
+ * tailoring control-flow based on repository access restrictions.
+ *
+ * Scripts may also be specified per-repository in the repository settings page.
+ * Shared scripts will be excluded from this list of available scripts.
+ *
+ * This script is dynamically reloaded and it is executed within it's own
+ * exception handler so it will not crash another script nor crash Gitblit.
+ *
+ * Bound Variables:
+ * gitblit Gitblit Server com.gitblit.GitBlit
+ * repository Gitblit Repository com.gitblit.models.RepositoryModel
+ * user Gitblit User com.gitblit.models.UserModel
+ * commands JGit commands Collection<org.eclipse.jgit.transport.ReceiveCommand>
+ * url Base url for Gitblit String
+ * logger Logger instance org.slf4j.Logger
+ *
+ */
+// Indicate we have started the script
+logger.info("jenkins hook triggered by ${user.username} for ${repository.name}")
+
+// This script requires Jenkins Git plugin 1.1.14 or later
+// http://kohsuke.org/2011/12/01/polling-must-die-triggering-jenkins-builds-from-a-git-hook/
+
+// define your jenkins url here or set groovy.jenkinsServer in
+// gitblit.properties or web.xml
+def jenkinsUrl = gitblit.getString("groovy.jenkinsServer", "http://yourserver/jenkins")
+
+// define the trigger url
+def triggerUrl = jenkinsUrl + "/git/notifyCommit?url=" + url + "/git/" + repository.name
+
+// trigger the build
+new URL(triggerUrl).getContent()
diff --git a/groovy/sendemail.groovy b/groovy/sendemail.groovy
new file mode 100644
index 00000000..1ba72a8a
--- /dev/null
+++ b/groovy/sendemail.groovy
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2011 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import com.gitblit.GitBlit
+import com.gitblit.Keys
+import com.gitblit.models.RepositoryModel
+import com.gitblit.models.UserModel
+import com.gitblit.utils.JGitUtils
+import org.eclipse.jgit.lib.Repository
+import org.eclipse.jgit.lib.Config
+import org.eclipse.jgit.revwalk.RevCommit
+import org.eclipse.jgit.transport.ReceiveCommand
+import org.eclipse.jgit.transport.ReceiveCommand.Result
+import org.slf4j.Logger
+
+/**
+ * Sample Gitblit Post-Receive Hook: sendemail
+ *
+ * The Post-Receive hook is executed AFTER the pushed commits have been applied
+ * to the Git repository. This is the appropriate point to trigger an
+ * integration build or to send a notification.
+ *
+ * This script is only executed when pushing to *Gitblit*, not to other Git
+ * tooling you may be using.
+ *
+ * If this script is specified in *groovy.postReceiveScripts* of gitblit.properties
+ * or web.xml then it will be executed by any repository when it receives a
+ * push. If you choose to share your script then you may have to consider
+ * tailoring control-flow based on repository access restrictions.
+ *
+ * Scripts may also be specified per-repository in the repository settings page.
+ * Shared scripts will be excluded from this list of available scripts.
+ *
+ * This script is dynamically reloaded and it is executed within it's own
+ * exception handler so it will not crash another script nor crash Gitblit.
+ *
+ * If you want this hook script to fail and abort all subsequent scripts in the
+ * chain, "return false" at the appropriate failure points.
+ *
+ * Bound Variables:
+ * gitblit Gitblit Server com.gitblit.GitBlit
+ * repository Gitblit Repository com.gitblit.models.RepositoryModel
+ * user Gitblit User com.gitblit.models.UserModel
+ * commands JGit commands Collection<org.eclipse.jgit.transport.ReceiveCommand>
+ * url Base url for Gitblit String
+ * logger Logger instance org.slf4j.Logger
+ *
+ */
+
+// Indicate we have started the script
+logger.info("sendemail hook triggered by ${user.username} for ${repository.name}")
+
+/*
+ * Primitive example email notification with example repository-specific checks.
+ * This requires the mail settings to be properly configured in Gitblit.
+ */
+
+Repository r = gitblit.getRepository(repository.name)
+
+// reuse some existing repository config settings, if available
+Config config = r.getConfig()
+def mailinglist = config.getString("hooks", null, "mailinglist")
+def emailprefix = config.getString("hooks", null, "emailprefix")
+
+// set default values
+def toAddresses = []
+if (emailprefix == null)
+ emailprefix = "[Gitblit]"
+
+if (mailinglist != null) {
+ def addrs = mailinglist.split("(,|\\s)")
+ toAddresses.addAll(addrs)
+}
+
+// add all mailing lists defined in gitblit.properties or web.xml
+toAddresses.addAll(gitblit.getStrings(Keys.mail.mailingLists))
+
+// special custom cases
+switch(repository.name) {
+ case "ex@mple.git":
+ toAddresses.add "dev-team@somewhere.com"
+ toAddresses.add "qa-team@somewhere.com"
+ break
+ default:
+ break
+}
+
+// get the create/update commits from the repository to build message content
+def commits = []
+for (ReceiveCommand command:commands) {
+ switch (command.type) {
+ case ReceiveCommand.Type.UPDATE:
+ case ReceiveCommand.Type.CREATE:
+ RevCommit commit = JGitUtils.getCommit(r, command.newId.name)
+ commits.add(commit)
+ break
+
+ default:
+ break
+ }
+}
+// close the repository reference
+r.close()
+
+// build a link to the summary page, either mounted or parameterized
+def summaryUrl
+if (gitblit.getBoolean(Keys.web.mountParameters, true))
+ summaryUrl = url + "/summary/" + repository.name.replace("/", gitblit.getString(Keys.web.forwardSlashCharacter, "/"))
+else
+ summaryUrl = url + "/summary?r=" + repository.name
+
+// create a simple commits table
+def table = commits.collect { it.id.name[0..8] + " " + it.authorIdent.name.padRight(20, " ") + it.shortMessage }.join("\n")
+
+// create the message body
+def msg = """${user.username} pushed ${commits.size} commits to ${repository.name}
+${summaryUrl}
+
+${table}"""
+
+// tell Gitblit to send the message (Gitblit filters duplicate addresses)
+gitblit.notifyUsers("${emailprefix} ${user.username} pushed ${commits.size} commits => ${repository.name}", msg, toAddresses) \ No newline at end of file