SlideShare a Scribd company logo
1 of 26
How to cook a Plugin

Luca Milanesio
GerritForge LLP

Luca@gerritforge.com
http://www.gerritforge.com
Base ingredients
       1. Gerrit code-review source
           Ver. 2.5 or later
       2. Maven 3.x and Internet
          connectivity
           Dependencies and Gerrit Plug-in API
       3. Focus for your plug-in ?
           HTTP/HTML ?
           SSH command ?
           Init step ?
           Gerrit GUI ?
           Gerrit internals ?

      Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                     gerrit
                                                                                                                                     User Summit 2012
Step-1: get Gerrit 2.5 source

$ git clone -b v2.5 https://gerrit-review.googlesource.com/gerrit
Cloning into 'gerrit'...
remote: Counting objects: 5622, done
remote: Finding sources: 100% (3294/3294)
remote: Getting sizes: 100% (2224/2224)
remote: Compressing objects: 100% (2224/2224)
remote: Total 73349 (delta 39481), reused 72619 (delta 39381)
Receiving objects: 100% (73349/73349), 14.30 MiB | 348 KiB/s, done.
Resolving deltas: 100% (39939/39939), done.
Note: checking out 'b465b6d753559781bcc44adf1077b09d820d09a5'.




                Needed for getting Gerrit plug-in APIs archetypes and
                sources (NOT yet on Maven public repos)




         Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                        gerrit
                                                                                                                                        User Summit 2012
Step-2: build Gerrit plug-in archetype
$ cd gerrit/gerrit-plugin-archetype && mvn install && cd ../..
[INFO] -----------------------------------------------------------------
[INFO] Building Gerrit Code Review - Plugin Archetype 2.5-SNAPSHOT
[INFO] -----------------------------------------------------------------
[...lots of Maven rubbish ...]
[INFO] Installing /Users/lucamilanesio/GerritUserSummit/gerrit/gerrit-
plugin-archetype/target/gerrit-plugin-archetype-2.5-SNAPSHOT.jar to
/Users/lucamilanesio/.m2/repository/com/google/gerrit/gerrit-plugin-
archetype/2.5-SNAPSHOT/gerrit-plugin-archetype-2.5-SNAPSHOT.jar
[INFO] Installing /Users/lucamilanesio/GerritUserSummit/gerrit/gerrit-
plugin-archetype/pom.xml to
/Users/lucamilanesio/.m2/repository/com/google/gerrit/gerrit-plugin-
archetype/2.5-SNAPSHOT/gerrit-plugin-archetype-2.5-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------




         Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                        gerrit
                                                                                                                                        User Summit 2012
Step-3: create your plug-in project
$ mvn archetype:generate -DarchetypeGroupId=com.google.gerrit 
    -DarchetypeArtifactId=gerrit-plugin-archetype 
    -DarchetypeVersion=2.5-SNAPSHOT 
    -DgerritApiVersion=2.5 
    -DgroupId=com.gerritforge -Dversion=1.0-SNAPSHOT 
    -DImplementation-Url=http://gerritforge.com 
    -DImplementation-Vendor=GerritForge 
    -DartifactId=plugin10mins -DpluginName=plugin10mins
[...]
Confirm properties configuration:
[...]
gerritApiType: plugin
gerritApiVersion: 2.5-SNAPSHOT
pluginName: plugin10mins
 Y: :
[INFO] -------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] -------------------------------------------------------------


         Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                        gerrit
                                                                                                                                        User Summit 2012
Step-4: build and install plugin
$ cd plugin10mins && mvn package && cp target/plugin10mins*jar
$GERRIT_SITE/plugins/plugin10mins.jar
[INFO] ---------------------------------------------------------------
[INFO] Building plugin10mins 1.0-SNAPSHOT
[INFO] ---------------------------------------------------------------
[...lots of Maven rubbish ...]
[INFO] Building jar:
/Users/lucamilanesio/GerritUserSummit/plugin10mins/target/plugin10mins-
1.0-SNAPSHOT.jar
[INFO] ---------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ---------------------------------------------------------------




         Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                        gerrit
                                                                                                                                        User Summit 2012
Step-5: Ready to Go  … starter is served
Gerrit plugins hot-deploy
   No need to restart: plugins are automatically scanned and loaded
$ tail -1 $GERRIT_SITE/logs/error_log
[2012-11-09 12:05:33,838] INFO
com.google.gerrit.server.plugins.PluginLoader : Loaded plugin plugin10mins


http://<<GerritURL>>/#/admin/plugins/




         Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                        gerrit
                                                                                                                                        User Summit 2012
First course: let's add some initial code
First goal: adding HTTP/HTML features
    New Server-side feature: show Gerrit server date/time

Gerrit HTTP plug-ins have the ability to:
   Define new HTTP Servlets
   Map Servlets to plugin URLs paths automatically
   Define static resources mapped over HTTP
       (i.e. CSS, images, other)




        Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                       gerrit
                                                                                                                                       User Summit 2012
Step-1: Disable Guice modules in MF
Plug-in archetype has created Guice Modules
We will use auto-registration: comment out modules in pom.xml




       Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                      gerrit
                                                                                                                                      User Summit 2012
Step-2: Define the ServerTime servlet
                                              Automatically register this Servlet to
                                              <gerrit-url>/plugins/<plugin-name>/servertime


                                                                                                                      Plug-ins inherit
                                                                                                                      Gerrit class loader:
                                                                                                                      Servlet-API is
                                                                                                                      covered by PlugIn
                                                                                                                      API




      Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                     gerrit
                                                                                                                                     User Summit 2012
Step-3: add static resources
 We use bootstrap.css in our generated HTML page
 /static folder is automatically managed by Gerrit and mapped to
  <<gerrit-url>>/plugins/<plugin-name>/static


$ mkdir src/main/resources/static/

$ curl http://gitblit.com/bootstrap/css/bootstrap.css 
  -o src/main/resources/static/bootstrap.css
 % Total    % Received % Xferd Average Speed    Time    Time   Time
Current
                                 Dload Upload    Total   Spent  Left Speed
100 99896 100 99896     0     0 49384       0 0:00:02 0:00:02 --:--:--
98033




          Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                         gerrit
                                                                                                                                         User Summit 2012
Step-4: Rebuild and install
$ cd mvn package && cp target/plugin10mins*jar
$GERRIT_SITE/plugins/plugin10mins.jar
[...lots of Maven rubbish ...]
[INFO] Building jar:
/Users/lucamilanesio/GerritUserSummit/plugin10mins/target/plugin10mins-1.0-
SNAPSHOT.jar
[INFO] ---------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ---------------------------------------------------------------
Gerrit automatically scans for changes in $GERRIT_SITE/plugins: wait
for your plugin getting reloaded

$ tail -f -1 $GERRIT_SITE/logs/error_log
[2012-11-09 15:49:09,082] INFO
com.google.gerrit.server.plugins.PluginLoader : Reloading plugin
plugin10mins



         Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                        gerrit
                                                                                                                                        User Summit 2012
Step-5: First course is on the table 
http://<<GerritURL>>/plugins/plugin10mins/servertime




        Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                       gerrit
                                                                                                                                       User Summit 2012
Main course now: get injected by Gerrit
Let's make it useful: extend Gerrit functionality
   Get injected the same objects available in Gerrit (well, almost)
   Access Gerrit DB and JGit backend
   Display my commit from a repository

Our HTTP plug-in will have now the ability to:
   Current user identity
   Check if user has access that the repository
   Open the repository and get latest commit



        Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                       gerrit
                                                                                                                                       User Summit 2012
Step-1: New Servlet "LastCommit"
Define a new Servlet mapped to /lastcommit path




        Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                       gerrit
                                                                                                                                       User Summit 2012
Step-2: Gerrit injected objects
We need access to accounts, project access and Git repositories
 let's get them injected in the constructor




        Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                       gerrit
                                                                                                                                       User Summit 2012
Step-3: Get project and check access
Get project name in 'p' Servlet URL parameter; Gerrit ProjectControl
provides access control info




        Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                       gerrit
                                                                                                                                       User Summit 2012
Step-4: Get my current identity
We get the current Gerrit user and display his accounts details
(user full name and preferred e-mail)




        Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                       gerrit
                                                                                                                                       User Summit 2012
Step-5: Get latest commit from repo
Using Gerrit's own repo manager, we get our last commit in the repo




        Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                       gerrit
                                                                                                                                       User Summit 2012
Main course is served 
http://<<GerritURL>>/plugins/plugin10mins/lastcommit?p=gerritsummit




        Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                       gerrit
                                                                                                                                       User Summit 2012
Does it really work with Gerrit security ?
Logging out from Gerrit and coming back to the plug-in page …




        Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                       gerrit
                                                                                                                                       User Summit 2012
There's much more …
Gerrit plug-ins are much more than just Servlet 
   Provide your own SSH commands
   Listen to Gerrit events for audit-trail purposes
   Implement Gerrit group backends
  … and much more coming over in Gerrit 2.6 !!!!

Plugins are just "dynamic" Guice Modules
    Gerrit load and bind plug-ins modules
    No modules specified  self-discovery (the one we used)



        Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                       gerrit
                                                                                                                                       User Summit 2012
Step-1: New SSH command
Create a new SshCommand exported as "servertime" command




                                                                                                         Automatically assigned to
                                                                                                         remote command:
                                                                                                         <plugin-name> servertime




       Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                      gerrit
                                                                                                                                      User Summit 2012
Step-2: Gerrit injected objects
Similarly to HTTP plug-in, we can inject Gerrit objects
 get current connected user identity




        Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                       gerrit
                                                                                                                                       User Summit 2012
Et voilà le dessert !
$ mvn package && cp target/plugin10mins*jar
$GERRIT_SITE/plugins/plugin10mins.jar
[...lots of Maven rubbish ...]
[INFO] Building jar:
/Users/lucamilanesio/GerritUserSummit/plugin10mins/target/plugin10mins-
1.0-SNAPSHOT.jar
[INFO] ---------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ---------------------------------------------------------------

… wait for hot-deploy … and your new plugin command is there !
$ ssh -p 29418 administrator@localhost plugin10mins servertime
Current date/time: Fri Nov 09 21:08:41 PST 2012
Current user: administrator <admin@mycompany.com>




         Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                        gerrit
                                                                                                                                        User Summit 2012
Still hungry ?

Making a group system plugin (Colby Ranger, Google)
  Trombone room – Saturday Nov 10th - 11:30 AM

What’s coming in Gerrit 2.6 (Shawn Pearce, 2.6 Lead)
  Tambourine room – Sunday Nov 11th – 9:45 AM

JavaScript plugins (Dariusz Łuksza, CollabNet)
   Trombone room – Sunday Nov 11th – 1:30 PM

You can see these slides again at: www.slideshare.net/lucamilanesio



         Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
                                                                                                                                        gerrit
                                                                                                                                        User Summit 2012

More Related Content

What's hot

Introduction to Gitlab
Introduction to GitlabIntroduction to Gitlab
Introduction to Gitlab
Julien Pivotto
 
DevOps Interview Questions Part - 1 | Devops Interview Questions And Answers ...
DevOps Interview Questions Part - 1 | Devops Interview Questions And Answers ...DevOps Interview Questions Part - 1 | Devops Interview Questions And Answers ...
DevOps Interview Questions Part - 1 | Devops Interview Questions And Answers ...
Simplilearn
 

What's hot (20)

[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...
 
Introduction to Gitlab
Introduction to GitlabIntroduction to Gitlab
Introduction to Gitlab
 
Gerrit Code Review: how to script a plugin with Scala and Groovy
Gerrit Code Review: how to script a plugin with Scala and GroovyGerrit Code Review: how to script a plugin with Scala and Groovy
Gerrit Code Review: how to script a plugin with Scala and Groovy
 
CI/CD (DevOps) 101
CI/CD (DevOps) 101CI/CD (DevOps) 101
CI/CD (DevOps) 101
 
Présentation de git
Présentation de gitPrésentation de git
Présentation de git
 
Docker - un outil pour faciliter le développement et le déploiement informatique
Docker - un outil pour faciliter le développement et le déploiement informatiqueDocker - un outil pour faciliter le développement et le déploiement informatique
Docker - un outil pour faciliter le développement et le déploiement informatique
 
Git and github 101
Git and github 101Git and github 101
Git and github 101
 
Continuous Delivery, Continuous Integration
Continuous Delivery, Continuous Integration Continuous Delivery, Continuous Integration
Continuous Delivery, Continuous Integration
 
Gitlab ci-cd
Gitlab ci-cdGitlab ci-cd
Gitlab ci-cd
 
DevOps Interview Questions Part - 1 | Devops Interview Questions And Answers ...
DevOps Interview Questions Part - 1 | Devops Interview Questions And Answers ...DevOps Interview Questions Part - 1 | Devops Interview Questions And Answers ...
DevOps Interview Questions Part - 1 | Devops Interview Questions And Answers ...
 
Using GitLab CI
Using GitLab CIUsing GitLab CI
Using GitLab CI
 
.NET 7 家族新成員: Microsoft Orleans v7
.NET 7 家族新成員:Microsoft Orleans v7.NET 7 家族新成員:Microsoft Orleans v7
.NET 7 家族新成員: Microsoft Orleans v7
 
Introduzione a Git
Introduzione a GitIntroduzione a Git
Introduzione a Git
 
Git and Github Session
Git and Github SessionGit and Github Session
Git and Github Session
 
Git - Basic Crash Course
Git - Basic Crash CourseGit - Basic Crash Course
Git - Basic Crash Course
 
Liferay as a Microservice Platform
Liferay as a Microservice PlatformLiferay as a Microservice Platform
Liferay as a Microservice Platform
 
Achieving CI/CD with Kubernetes
Achieving CI/CD with KubernetesAchieving CI/CD with Kubernetes
Achieving CI/CD with Kubernetes
 
Working with kubernetes
Working with kubernetesWorking with kubernetes
Working with kubernetes
 
Github basics
Github basicsGithub basics
Github basics
 
Git and github
Git and githubGit and github
Git and github
 

Viewers also liked

Viewers also liked (7)

GerritHub.io - present, past, future
GerritHub.io - present, past, futureGerritHub.io - present, past, future
GerritHub.io - present, past, future
 
Gerrit Code Review Analytics
Gerrit Code Review AnalyticsGerrit Code Review Analytics
Gerrit Code Review Analytics
 
Factors de conversio
Factors de conversioFactors de conversio
Factors de conversio
 
Git workshop 33degree 2011 krakow
Git workshop 33degree 2011 krakowGit workshop 33degree 2011 krakow
Git workshop 33degree 2011 krakow
 
Gerrit JavaScript Plugins
Gerrit JavaScript PluginsGerrit JavaScript Plugins
Gerrit JavaScript Plugins
 
Code review process with JetBrains UpSource
Code review process with JetBrains UpSourceCode review process with JetBrains UpSource
Code review process with JetBrains UpSource
 
Gerrit Code Review
Gerrit Code ReviewGerrit Code Review
Gerrit Code Review
 

Similar to Gerrit: how to cook a plugin in only 10 mins

Guiding Diffy to the Enterprise land
Guiding Diffy to the Enterprise landGuiding Diffy to the Enterprise land
Guiding Diffy to the Enterprise land
Dariusz Łuksza
 
2015-ghci-presentation-git_gerritJenkins_final
2015-ghci-presentation-git_gerritJenkins_final2015-ghci-presentation-git_gerritJenkins_final
2015-ghci-presentation-git_gerritJenkins_final
Mythri P K
 

Similar to Gerrit: how to cook a plugin in only 10 mins (20)

Gerrit tutorial
Gerrit tutorialGerrit tutorial
Gerrit tutorial
 
Gerrit Code Review v3.2 and v3.3
Gerrit Code Review v3.2 and v3.3Gerrit Code Review v3.2 and v3.3
Gerrit Code Review v3.2 and v3.3
 
What's new in Gerrit Code Review v3.1 and beyond
What's new in Gerrit Code Review v3.1 and beyondWhat's new in Gerrit Code Review v3.1 and beyond
What's new in Gerrit Code Review v3.1 and beyond
 
Build Your Own HiveMQ Extension
Build Your Own HiveMQ ExtensionBuild Your Own HiveMQ Extension
Build Your Own HiveMQ Extension
 
Drone CI/CD Platform
Drone CI/CD PlatformDrone CI/CD Platform
Drone CI/CD Platform
 
Exploring the GitHub Service Universe
Exploring the GitHub Service UniverseExploring the GitHub Service Universe
Exploring the GitHub Service Universe
 
Github By Nyros Developer
Github By Nyros DeveloperGithub By Nyros Developer
Github By Nyros Developer
 
Gerrit is Getting Native with RPM, Deb and Docker
Gerrit is Getting Native with RPM, Deb and DockerGerrit is Getting Native with RPM, Deb and Docker
Gerrit is Getting Native with RPM, Deb and Docker
 
Plugin development
Plugin developmentPlugin development
Plugin development
 
Guiding Diffy to the Enterprise land
Guiding Diffy to the Enterprise landGuiding Diffy to the Enterprise land
Guiding Diffy to the Enterprise land
 
Raspberry pi and Google Cloud
Raspberry pi and Google CloudRaspberry pi and Google Cloud
Raspberry pi and Google Cloud
 
2015-ghci-presentation-git_gerritJenkins_final
2015-ghci-presentation-git_gerritJenkins_final2015-ghci-presentation-git_gerritJenkins_final
2015-ghci-presentation-git_gerritJenkins_final
 
GIT training - advanced for software projects
GIT training - advanced for software projectsGIT training - advanced for software projects
GIT training - advanced for software projects
 
Git - Boost Your DEV Team Speed and Productivity
Git - Boost Your DEV Team Speed and ProductivityGit - Boost Your DEV Team Speed and Productivity
Git - Boost Your DEV Team Speed and Productivity
 
GIT By Sivakrishna
GIT By SivakrishnaGIT By Sivakrishna
GIT By Sivakrishna
 
git-commands-cheat-sheet-infopediya-com.pdf
git-commands-cheat-sheet-infopediya-com.pdfgit-commands-cheat-sheet-infopediya-com.pdf
git-commands-cheat-sheet-infopediya-com.pdf
 
Introduction to git and Github
Introduction to git and GithubIntroduction to git and Github
Introduction to git and Github
 
git github PPT_GDSCIIITK.pptx
git github PPT_GDSCIIITK.pptxgit github PPT_GDSCIIITK.pptx
git github PPT_GDSCIIITK.pptx
 
Gerrit linuxtag2011
Gerrit linuxtag2011Gerrit linuxtag2011
Gerrit linuxtag2011
 
Development with Git and Gerrit - Eclipse DemoCamp Stuttgart - 2010-11-23
Development with Git and Gerrit - Eclipse DemoCamp Stuttgart - 2010-11-23Development with Git and Gerrit - Eclipse DemoCamp Stuttgart - 2010-11-23
Development with Git and Gerrit - Eclipse DemoCamp Stuttgart - 2010-11-23
 

More from Luca Milanesio

More from Luca Milanesio (20)

Gerrit Analytics applied to Android source code
Gerrit Analytics applied to Android source codeGerrit Analytics applied to Android source code
Gerrit Analytics applied to Android source code
 
Cloud-native Gerrit Code Review
Cloud-native Gerrit Code ReviewCloud-native Gerrit Code Review
Cloud-native Gerrit Code Review
 
Gerrit Code Review migrations step-by-step
Gerrit Code Review migrations step-by-stepGerrit Code Review migrations step-by-step
Gerrit Code Review migrations step-by-step
 
ChronicleMap non-blocking cache for Gerrit v3.3
ChronicleMap non-blocking cache for Gerrit v3.3ChronicleMap non-blocking cache for Gerrit v3.3
ChronicleMap non-blocking cache for Gerrit v3.3
 
Gerrit Code Review multi-site
Gerrit Code Review multi-siteGerrit Code Review multi-site
Gerrit Code Review multi-site
 
Gerrit User Summit 2019 Keynote
Gerrit User Summit 2019 KeynoteGerrit User Summit 2019 Keynote
Gerrit User Summit 2019 Keynote
 
Gerrit multi-master / multi-site at GerritHub
Gerrit multi-master / multi-site at GerritHubGerrit multi-master / multi-site at GerritHub
Gerrit multi-master / multi-site at GerritHub
 
GerritHub a true Gerrit migration story to v2.15
GerritHub a true Gerrit migration story to v2.15GerritHub a true Gerrit migration story to v2.15
GerritHub a true Gerrit migration story to v2.15
 
Gerrit User Summit 2018 - Keynote
Gerrit User Summit 2018 - Keynote Gerrit User Summit 2018 - Keynote
Gerrit User Summit 2018 - Keynote
 
Jenkins plugin for Gerrit Code Review pipelines
Jenkins plugin for Gerrit Code Review pipelinesJenkins plugin for Gerrit Code Review pipelines
Jenkins plugin for Gerrit Code Review pipelines
 
Gerrit User Summit 2017 Keynote
Gerrit User Summit 2017 KeynoteGerrit User Summit 2017 Keynote
Gerrit User Summit 2017 Keynote
 
How to keep Jenkins logs forever without performance issues
How to keep Jenkins logs forever without performance issuesHow to keep Jenkins logs forever without performance issues
How to keep Jenkins logs forever without performance issues
 
Jenkins Pipeline on your Local Box to Reduce Cycle Time
Jenkins Pipeline on your Local Box to Reduce Cycle TimeJenkins Pipeline on your Local Box to Reduce Cycle Time
Jenkins Pipeline on your Local Box to Reduce Cycle Time
 
Jenkins world 2017 - Data-Driven CI Pipeline with Gerrit Code Review
Jenkins world 2017 - Data-Driven CI Pipeline with Gerrit Code ReviewJenkins world 2017 - Data-Driven CI Pipeline with Gerrit Code Review
Jenkins world 2017 - Data-Driven CI Pipeline with Gerrit Code Review
 
Stable master workflow with Gerrit Code Review
Stable master workflow with Gerrit Code ReviewStable master workflow with Gerrit Code Review
Stable master workflow with Gerrit Code Review
 
Zero-Downtime Gerrit Code Review Upgrade
Zero-Downtime Gerrit Code Review UpgradeZero-Downtime Gerrit Code Review Upgrade
Zero-Downtime Gerrit Code Review Upgrade
 
Speed up Continuous Delivery with BigData Analytics
Speed up Continuous Delivery with BigData AnalyticsSpeed up Continuous Delivery with BigData Analytics
Speed up Continuous Delivery with BigData Analytics
 
Devoxx 2016 Using Jenkins, Gerrit and Spark for Continuous Delivery Analytics
Devoxx 2016 Using Jenkins, Gerrit and Spark for Continuous Delivery AnalyticsDevoxx 2016 Using Jenkins, Gerrit and Spark for Continuous Delivery Analytics
Devoxx 2016 Using Jenkins, Gerrit and Spark for Continuous Delivery Analytics
 
Gerrit jenkins-big data-continuous-delivery
Gerrit jenkins-big data-continuous-deliveryGerrit jenkins-big data-continuous-delivery
Gerrit jenkins-big data-continuous-delivery
 
Is TDD dead or alive?
Is TDD dead or alive?Is TDD dead or alive?
Is TDD dead or alive?
 

Recently uploaded

Salient Features of India constitution especially power and functions
Salient Features of India constitution especially power and functionsSalient Features of India constitution especially power and functions
Salient Features of India constitution especially power and functions
KarakKing
 
1029-Danh muc Sach Giao Khoa khoi 6.pdf
1029-Danh muc Sach Giao Khoa khoi  6.pdf1029-Danh muc Sach Giao Khoa khoi  6.pdf
1029-Danh muc Sach Giao Khoa khoi 6.pdf
QucHHunhnh
 
The basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptxThe basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptx
heathfieldcps1
 

Recently uploaded (20)

On National Teacher Day, meet the 2024-25 Kenan Fellows
On National Teacher Day, meet the 2024-25 Kenan FellowsOn National Teacher Day, meet the 2024-25 Kenan Fellows
On National Teacher Day, meet the 2024-25 Kenan Fellows
 
Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024Mehran University Newsletter Vol-X, Issue-I, 2024
Mehran University Newsletter Vol-X, Issue-I, 2024
 
Unit-IV; Professional Sales Representative (PSR).pptx
Unit-IV; Professional Sales Representative (PSR).pptxUnit-IV; Professional Sales Representative (PSR).pptx
Unit-IV; Professional Sales Representative (PSR).pptx
 
Salient Features of India constitution especially power and functions
Salient Features of India constitution especially power and functionsSalient Features of India constitution especially power and functions
Salient Features of India constitution especially power and functions
 
Python Notes for mca i year students osmania university.docx
Python Notes for mca i year students osmania university.docxPython Notes for mca i year students osmania university.docx
Python Notes for mca i year students osmania university.docx
 
This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.
 
Making communications land - Are they received and understood as intended? we...
Making communications land - Are they received and understood as intended? we...Making communications land - Are they received and understood as intended? we...
Making communications land - Are they received and understood as intended? we...
 
How to Manage Global Discount in Odoo 17 POS
How to Manage Global Discount in Odoo 17 POSHow to Manage Global Discount in Odoo 17 POS
How to Manage Global Discount in Odoo 17 POS
 
How to Create and Manage Wizard in Odoo 17
How to Create and Manage Wizard in Odoo 17How to Create and Manage Wizard in Odoo 17
How to Create and Manage Wizard in Odoo 17
 
Graduate Outcomes Presentation Slides - English
Graduate Outcomes Presentation Slides - EnglishGraduate Outcomes Presentation Slides - English
Graduate Outcomes Presentation Slides - English
 
1029-Danh muc Sach Giao Khoa khoi 6.pdf
1029-Danh muc Sach Giao Khoa khoi  6.pdf1029-Danh muc Sach Giao Khoa khoi  6.pdf
1029-Danh muc Sach Giao Khoa khoi 6.pdf
 
Unit-V; Pricing (Pharma Marketing Management).pptx
Unit-V; Pricing (Pharma Marketing Management).pptxUnit-V; Pricing (Pharma Marketing Management).pptx
Unit-V; Pricing (Pharma Marketing Management).pptx
 
ICT role in 21st century education and it's challenges.
ICT role in 21st century education and it's challenges.ICT role in 21st century education and it's challenges.
ICT role in 21st century education and it's challenges.
 
General Principles of Intellectual Property: Concepts of Intellectual Proper...
General Principles of Intellectual Property: Concepts of Intellectual  Proper...General Principles of Intellectual Property: Concepts of Intellectual  Proper...
General Principles of Intellectual Property: Concepts of Intellectual Proper...
 
The basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptxThe basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptx
 
TỔNG ÔN TẬP THI VÀO LỚP 10 MÔN TIẾNG ANH NĂM HỌC 2023 - 2024 CÓ ĐÁP ÁN (NGỮ Â...
TỔNG ÔN TẬP THI VÀO LỚP 10 MÔN TIẾNG ANH NĂM HỌC 2023 - 2024 CÓ ĐÁP ÁN (NGỮ Â...TỔNG ÔN TẬP THI VÀO LỚP 10 MÔN TIẾNG ANH NĂM HỌC 2023 - 2024 CÓ ĐÁP ÁN (NGỮ Â...
TỔNG ÔN TẬP THI VÀO LỚP 10 MÔN TIẾNG ANH NĂM HỌC 2023 - 2024 CÓ ĐÁP ÁN (NGỮ Â...
 
Spatium Project Simulation student brief
Spatium Project Simulation student briefSpatium Project Simulation student brief
Spatium Project Simulation student brief
 
Understanding Accommodations and Modifications
Understanding  Accommodations and ModificationsUnderstanding  Accommodations and Modifications
Understanding Accommodations and Modifications
 
Holdier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdfHoldier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdf
 
How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17
 

Gerrit: how to cook a plugin in only 10 mins

  • 1. How to cook a Plugin Luca Milanesio GerritForge LLP Luca@gerritforge.com http://www.gerritforge.com
  • 2. Base ingredients 1. Gerrit code-review source  Ver. 2.5 or later 2. Maven 3.x and Internet connectivity  Dependencies and Gerrit Plug-in API 3. Focus for your plug-in ?  HTTP/HTML ?  SSH command ?  Init step ?  Gerrit GUI ?  Gerrit internals ? Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 3. Step-1: get Gerrit 2.5 source $ git clone -b v2.5 https://gerrit-review.googlesource.com/gerrit Cloning into 'gerrit'... remote: Counting objects: 5622, done remote: Finding sources: 100% (3294/3294) remote: Getting sizes: 100% (2224/2224) remote: Compressing objects: 100% (2224/2224) remote: Total 73349 (delta 39481), reused 72619 (delta 39381) Receiving objects: 100% (73349/73349), 14.30 MiB | 348 KiB/s, done. Resolving deltas: 100% (39939/39939), done. Note: checking out 'b465b6d753559781bcc44adf1077b09d820d09a5'. Needed for getting Gerrit plug-in APIs archetypes and sources (NOT yet on Maven public repos) Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 4. Step-2: build Gerrit plug-in archetype $ cd gerrit/gerrit-plugin-archetype && mvn install && cd ../.. [INFO] ----------------------------------------------------------------- [INFO] Building Gerrit Code Review - Plugin Archetype 2.5-SNAPSHOT [INFO] ----------------------------------------------------------------- [...lots of Maven rubbish ...] [INFO] Installing /Users/lucamilanesio/GerritUserSummit/gerrit/gerrit- plugin-archetype/target/gerrit-plugin-archetype-2.5-SNAPSHOT.jar to /Users/lucamilanesio/.m2/repository/com/google/gerrit/gerrit-plugin- archetype/2.5-SNAPSHOT/gerrit-plugin-archetype-2.5-SNAPSHOT.jar [INFO] Installing /Users/lucamilanesio/GerritUserSummit/gerrit/gerrit- plugin-archetype/pom.xml to /Users/lucamilanesio/.m2/repository/com/google/gerrit/gerrit-plugin- archetype/2.5-SNAPSHOT/gerrit-plugin-archetype-2.5-SNAPSHOT.pom [INFO] ------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------ Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 5. Step-3: create your plug-in project $ mvn archetype:generate -DarchetypeGroupId=com.google.gerrit -DarchetypeArtifactId=gerrit-plugin-archetype -DarchetypeVersion=2.5-SNAPSHOT -DgerritApiVersion=2.5 -DgroupId=com.gerritforge -Dversion=1.0-SNAPSHOT -DImplementation-Url=http://gerritforge.com -DImplementation-Vendor=GerritForge -DartifactId=plugin10mins -DpluginName=plugin10mins [...] Confirm properties configuration: [...] gerritApiType: plugin gerritApiVersion: 2.5-SNAPSHOT pluginName: plugin10mins Y: : [INFO] ------------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------- Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 6. Step-4: build and install plugin $ cd plugin10mins && mvn package && cp target/plugin10mins*jar $GERRIT_SITE/plugins/plugin10mins.jar [INFO] --------------------------------------------------------------- [INFO] Building plugin10mins 1.0-SNAPSHOT [INFO] --------------------------------------------------------------- [...lots of Maven rubbish ...] [INFO] Building jar: /Users/lucamilanesio/GerritUserSummit/plugin10mins/target/plugin10mins- 1.0-SNAPSHOT.jar [INFO] --------------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] --------------------------------------------------------------- Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 7. Step-5: Ready to Go  … starter is served Gerrit plugins hot-deploy  No need to restart: plugins are automatically scanned and loaded $ tail -1 $GERRIT_SITE/logs/error_log [2012-11-09 12:05:33,838] INFO com.google.gerrit.server.plugins.PluginLoader : Loaded plugin plugin10mins http://<<GerritURL>>/#/admin/plugins/ Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 8. First course: let's add some initial code First goal: adding HTTP/HTML features  New Server-side feature: show Gerrit server date/time Gerrit HTTP plug-ins have the ability to:  Define new HTTP Servlets  Map Servlets to plugin URLs paths automatically  Define static resources mapped over HTTP (i.e. CSS, images, other) Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 9. Step-1: Disable Guice modules in MF Plug-in archetype has created Guice Modules We will use auto-registration: comment out modules in pom.xml Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 10. Step-2: Define the ServerTime servlet Automatically register this Servlet to <gerrit-url>/plugins/<plugin-name>/servertime Plug-ins inherit Gerrit class loader: Servlet-API is covered by PlugIn API Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 11. Step-3: add static resources We use bootstrap.css in our generated HTML page /static folder is automatically managed by Gerrit and mapped to <<gerrit-url>>/plugins/<plugin-name>/static $ mkdir src/main/resources/static/ $ curl http://gitblit.com/bootstrap/css/bootstrap.css -o src/main/resources/static/bootstrap.css % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 99896 100 99896 0 0 49384 0 0:00:02 0:00:02 --:--:-- 98033 Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 12. Step-4: Rebuild and install $ cd mvn package && cp target/plugin10mins*jar $GERRIT_SITE/plugins/plugin10mins.jar [...lots of Maven rubbish ...] [INFO] Building jar: /Users/lucamilanesio/GerritUserSummit/plugin10mins/target/plugin10mins-1.0- SNAPSHOT.jar [INFO] --------------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] --------------------------------------------------------------- Gerrit automatically scans for changes in $GERRIT_SITE/plugins: wait for your plugin getting reloaded $ tail -f -1 $GERRIT_SITE/logs/error_log [2012-11-09 15:49:09,082] INFO com.google.gerrit.server.plugins.PluginLoader : Reloading plugin plugin10mins Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 13. Step-5: First course is on the table  http://<<GerritURL>>/plugins/plugin10mins/servertime Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 14. Main course now: get injected by Gerrit Let's make it useful: extend Gerrit functionality  Get injected the same objects available in Gerrit (well, almost)  Access Gerrit DB and JGit backend  Display my commit from a repository Our HTTP plug-in will have now the ability to:  Current user identity  Check if user has access that the repository  Open the repository and get latest commit Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 15. Step-1: New Servlet "LastCommit" Define a new Servlet mapped to /lastcommit path Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 16. Step-2: Gerrit injected objects We need access to accounts, project access and Git repositories  let's get them injected in the constructor Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 17. Step-3: Get project and check access Get project name in 'p' Servlet URL parameter; Gerrit ProjectControl provides access control info Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 18. Step-4: Get my current identity We get the current Gerrit user and display his accounts details (user full name and preferred e-mail) Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 19. Step-5: Get latest commit from repo Using Gerrit's own repo manager, we get our last commit in the repo Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 20. Main course is served  http://<<GerritURL>>/plugins/plugin10mins/lastcommit?p=gerritsummit Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 21. Does it really work with Gerrit security ? Logging out from Gerrit and coming back to the plug-in page … Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 22. There's much more … Gerrit plug-ins are much more than just Servlet   Provide your own SSH commands  Listen to Gerrit events for audit-trail purposes  Implement Gerrit group backends … and much more coming over in Gerrit 2.6 !!!! Plugins are just "dynamic" Guice Modules  Gerrit load and bind plug-ins modules  No modules specified  self-discovery (the one we used) Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 23. Step-1: New SSH command Create a new SshCommand exported as "servertime" command Automatically assigned to remote command: <plugin-name> servertime Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 24. Step-2: Gerrit injected objects Similarly to HTTP plug-in, we can inject Gerrit objects  get current connected user identity Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 25. Et voilà le dessert ! $ mvn package && cp target/plugin10mins*jar $GERRIT_SITE/plugins/plugin10mins.jar [...lots of Maven rubbish ...] [INFO] Building jar: /Users/lucamilanesio/GerritUserSummit/plugin10mins/target/plugin10mins- 1.0-SNAPSHOT.jar [INFO] --------------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] --------------------------------------------------------------- … wait for hot-deploy … and your new plugin command is there ! $ ssh -p 29418 administrator@localhost plugin10mins servertime Current date/time: Fri Nov 09 21:08:41 PST 2012 Current user: administrator <admin@mycompany.com> Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012
  • 26. Still hungry ? Making a group system plugin (Colby Ranger, Google) Trombone room – Saturday Nov 10th - 11:30 AM What’s coming in Gerrit 2.6 (Shawn Pearce, 2.6 Lead) Tambourine room – Sunday Nov 11th – 9:45 AM JavaScript plugins (Dariusz Łuksza, CollabNet) Trombone room – Sunday Nov 11th – 1:30 PM You can see these slides again at: www.slideshare.net/lucamilanesio Gerrit plugin in 10 mins by Luca Milanesio is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. gerrit User Summit 2012