SlideShare a Scribd company logo
GitBucket
Open source self-hosting Git server built by Scala
Naoki Takezoe
@takezoen
Who am I?
Naoki Takezoe
● Software Engineer at Treasure Data
○ Presto (Trino) and Spark
● 10 years experience with Scala
○ GitBucket, Scalatra, Apache PredictionIO, etc
○ Japanese edition of Scala Puzzlers
GitBucket is...
GitBucket is...
● Open source self-hosting Git server
● Initial commit was April 2013
● Built by Scala and Java technologies
Current status (Feb 6, 2021)
● 8266 stars
● 158 contributors
● 719 gitter users
● 98 releases
Start GitBucket right now!
● Download gitbucket.war from
○ https://github.com/gitbucket/gitbucket
● Run
● Official Docker image is available
$ java -jar gitbucket.war
$ docker run -d -p 8080:8080 gitbucket/gitbucket
Motivation
Motivation
● In-house Git repository
○ Due to company's security policy?
○ Due to contract with customers?
● Solutions
○ GitHub Enterprise was expensive
○ GitLab installation was awkward
I must make it myself! by
Why ?
From First Principles: Why Scala? by Li Haoyi
https://www.lihaoyi.com/post/FromFirstPrinciplesWhyScala.html
● "A Compiled Language that feels Dynamic"
○ Compiled language + Scripting launguage
○ Easy to write with safety
● "A Broad and Deep Ecosystem"
○ Existing Java resources can be leveraged
○ JGit: Pure Java Git implementation
○ Zero dependencies (except JVM) inspired by Jenkins
Personal reasons:
● Wanted to write a real-world applications in Scala
● Just for fun :-)
Tour of GitBucket
Repository viewer
Issues
Pull requests
Major Features
● Public and private repository hosting
● Dashboard includes activity timeline
● Repository viewer which supports online file editing
● Markdown available Wiki
● Issues and pull requests
● Comment on source code
● Notification via E-mail
● User and group management
● LDAP integration
● Gravator integration
● GitHub compatible Web API
● Plugin system
● External database support (MySQL and PostgreSQL)
Kanban and Gantt chart
Continuous Integration
Major plugins
Name Description
Gist plugin Add code snippet Gist-like functionality to GitBucket
Asciidoc plugin Add AsciiDoc support to GitBucket
Bugspots plugin Apply Google Bugspots to code in GitBucket repositories
Pages plugin Publish repository contents as web sites
Network plugin Add the commit graph view to GitBucket
Emoji plugin Emoji support in Wiki or Issues
RST plugin Add ReStructuredText support to GitBucket
Explorer plugin Add the tree view for repositories on GitBucket
PlantUML plugin Render PlantUML files on GitBucket
Jupyter plugin Render Jupyter or IPython files on GitBucket
Fess Plugin Add full text search capability to GitBucket
Maven repository plugin Host in-house maven repositories on GitBucket
Visit https://gitbucket-plugins.github.io/ to find other plugins!!
Technology
Technology stack
Git Repository
RDBMS
(H2 / MySQL / PostgreSQL)
JGit Slick
Apache MINA SSHD
Jetty
GitServlet (JGit) Scalatra + Twirl
Git Client Web Browser
SSH HTTP
Core technologies are Java components
● Jetty
● H2
● JGit
● Apache MINA SSHD
Technology stack (Java parts)
Git Repository
RDBMS
(H2 / MySQL / PostgreSQL)
JGit Slick
Apache MINA SSHD
Jetty
GitServlet (JGit) Scalatra + Twirl
Git Client Web Browser
SSH HTTP
Key to minimize development cost
Minimizing dev cost is very important for sustainability of
personal OSS projects
● Java interoperability
○ Scala has good Java interoperability
○ Benefit from existing Java software resources
● Plugin architecture
○ Keep core features minimum for maintainability
○ Leverage community resources
Because GitBucket users are not necessarily mature Scala users, we
avoid too much FP flavor in GitBucket in order to open the door to
contribution and plugin development to them.
Challenges in
long-life application with Scala
Upgrading Scala and libraries
Scala's source code level backward compatibility is great, but…
● Need to rebuild libraries for new Scala major version
● Abandoned or not-well maintained libraries can be blockers
● Some libraries changed its public interface significantly
(e.g. Slick2 -> Slick3)
Experienced Scala major upgrade 3 times
● 2.10 -> 2.11
● 2.11 -> 2.12
● 2.12 -> 2.13
The most painful upgrade!
Why upgrading to Scala 2.12 was so painful?
Git Repository
RDBMS
(H2 / MySQL / PostgreSQL)
JGit Slick
Apache MINA SSHD
Jetty
GitServlet (JGit) Scalatra + Twirl
Git Client Web Browser
SSH HTTP
Scalatra development was going down
Destructive change in Slick3
Scalatra
● Simple we framework for Scala inspired by Ruby's Sinatra
○ Traditional Java servlet based framework
○ Declarative input validation and mapping framework like Play2
○ json4s based JSON support
Scalatra development is going down
● Rise of reactive and functional programming in Scala
○ Emerge of new frameworks such as finagle, http4s and akka-http
○ Main Scalatra developers shifted to http4s
● Became a Scalatra committer
○ Boosted migration to Scala 2.12, and eventually Scala 2.13
● Reduced maintenance cost to make it sustainable
○ Dropped minor features and library dependencies
○ Forked abandoned libraries, took some into Scalatra source tree if
small enough
Slick
● Advanced Type-safe SQL builder (former Scala-Query)
○ Very powerful and flexible type-safe API
○ Sometimes generated SQL can cause performance issues,
especially on MySQL, though...
● Super painful upgrade in Slick2 -> Slick3
○ Monadic DBIO introduced in Slick3 affected all existing code
Slick2 -> Slick3 migration
● Amount of code that needs to be migrated
○ Affected all existing Slick2 based code including community
developed plugins
● Difficulty of DBIO for GitBucket users
○ GitBucket users are not mature Scala programmers
○ We wanted to keep the bar low
● Scala 2.12 version of Slick2 was not available back then
○ Eventually Scala 2.12 version of Slick2 was released, though
○ Scala 2.13 version has not been released
How we migrated to Slick3?
● Created blocking-slick library
○ Slick2 compatible blocking API on the top of Slick3
https://github.com/takezoe/blocking-slick
● We could migrate to Slick3 with minimum effort
https://github.com/gitbucket/gitbucket/pull/1381/files
○ Also, minimized the negative impact on plugin developers
Created Java libraries, not Scala libraries
● Markedj (GitHub flavored markdown parser, Java-port of marked.js)
● Solidbase (Multi-tenant and multi-database supported migration tool
based on Liquibase)
● If the library interface is simple enough, no benefit to write in Scala
for library users.
● We don't need to rebuild a library for each major Scala version.
Effective strategy for long-term maintenance
● Minimize library dependencies
● Use Java libraries if possible
● Fork or take over library maintenance if needed
These strategies would be effective even for migration to Scala3!
Try GitBucket!
● GitHub: https://github.com/gitbucket/gitbucket
● Demo site: https://gitbucket.herokuapp.com/
● Gitter: https://gitter.im/gitbucket/gitbucket
● Blog: https://gitbucket.github.io/gitbucket-news/
● Community Plugins: https://gitbucket-plugins.github.io/
Appendix:
How to create GitBucket plugin
Create project
● build.sbt
● project/plugins.sbt
This sbt plugin adds necessary library dependencies to the project
and provide configuration and sbt task useful for GitBucket plugin
development.
Define plugin manifest
● Plugin.scala (plugin manifest)
Register new controller via
extension point
Implement plugin
● HelloWorldController.scala (Typical Scalatra controller)
Bunch of extension points are available, such as:
● Add menus and tabs
● Inject JavaScript
● Register event hooks
● etc
Build and Test
● Create a package
● Install to local GitBucket
● Template project
○ https://github.com/gitbucket/gitbucket-plugin-template
● Tutorial
○ https://gitbucket.github.io/gitbucket-news/gitbucket/2015/06/29/ho
w-to-create-plugin.html
$ sbt assembly
$ sbt install

More Related Content

PPTX
7 - Industry archetypes and best practices v80
PPTX
The Brief History of Video Games
PDF
Part 1: Introduction to digital marketing technology
PDF
GitBucket: Git Centric Software Development Platform by Scala
PDF
GitBucket: The perfect Github clone by Scala
PDF
How to keep maintainability of long life Scala applications
KEY
Java to Scala: Why & How
KEY
The Why and How of Scala at Twitter
7 - Industry archetypes and best practices v80
The Brief History of Video Games
Part 1: Introduction to digital marketing technology
GitBucket: Git Centric Software Development Platform by Scala
GitBucket: The perfect Github clone by Scala
How to keep maintainability of long life Scala applications
Java to Scala: Why & How
The Why and How of Scala at Twitter

Similar to GitBucket: Open source self-hosting Git server built by Scala (20)

PDF
Tips For Maintaining OSS Projects
PDF
Bitbucket Pipelines
PPT
Evolving IGN’s New APIs with Scala
PPTX
Difference between Github vs Gitlab vs Bitbucket
PDF
My "Perfect" Toolchain Setup for Grails Projects
PPTX
Scala adoption by enterprises
PDF
Difference between gitlab vs github vs bitbucket
KEY
S2GX 2012 - Spring Projects Infrastructure
PDF
Spring Projects Infrastructure
PDF
Martin Odersky: What's next for Scala
ODP
Roundup presentation
PDF
Repository Management with JFrog Artifactory
PDF
Scalatra 2.2
KEY
Scala
ZIP
Why Scala Presentation
PPT
Contributing To The Mozilla Codebase
KEY
ZIP
Why Scala for Web 2.0?
PPTX
Spring Projects Infrastructure
PPTX
Spring Projects Infrastructure
Tips For Maintaining OSS Projects
Bitbucket Pipelines
Evolving IGN’s New APIs with Scala
Difference between Github vs Gitlab vs Bitbucket
My "Perfect" Toolchain Setup for Grails Projects
Scala adoption by enterprises
Difference between gitlab vs github vs bitbucket
S2GX 2012 - Spring Projects Infrastructure
Spring Projects Infrastructure
Martin Odersky: What's next for Scala
Roundup presentation
Repository Management with JFrog Artifactory
Scalatra 2.2
Scala
Why Scala Presentation
Contributing To The Mozilla Codebase
Why Scala for Web 2.0?
Spring Projects Infrastructure
Spring Projects Infrastructure
Ad

More from takezoe (20)

PDF
Journey of Migrating Millions of Queries on The Cloud
PDF
Testing Distributed Query Engine as a Service
PDF
Revisit Dependency Injection in scala
PDF
頑張りすぎないScala
PDF
Non-Functional Programming in Scala
PDF
Scala警察のすすめ
PDF
Scala製機械学習サーバ「Apache PredictionIO」
PDF
The best of AltJava is Xtend
PDF
Scala Warrior and type-safe front-end development with Scala.js
PDF
Tracing Microservices with Zipkin
PDF
Type-safe front-end development with Scala
PDF
Scala Frameworks for Web Application 2016
PDF
Macro in Scala
PDF
Java9 and Project Jigsaw
PDF
Reactive database access with Slick3
PDF
markedj: The best of markdown processor on JVM
PDF
ネタじゃないScala.js
PDF
Excel方眼紙を支えるJava技術 2015
PDF
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
PDF
Play2実践tips集
Journey of Migrating Millions of Queries on The Cloud
Testing Distributed Query Engine as a Service
Revisit Dependency Injection in scala
頑張りすぎないScala
Non-Functional Programming in Scala
Scala警察のすすめ
Scala製機械学習サーバ「Apache PredictionIO」
The best of AltJava is Xtend
Scala Warrior and type-safe front-end development with Scala.js
Tracing Microservices with Zipkin
Type-safe front-end development with Scala
Scala Frameworks for Web Application 2016
Macro in Scala
Java9 and Project Jigsaw
Reactive database access with Slick3
markedj: The best of markdown processor on JVM
ネタじゃないScala.js
Excel方眼紙を支えるJava技術 2015
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
Play2実践tips集
Ad

Recently uploaded (20)

PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PPTX
Introduction to Artificial Intelligence
PPTX
L1 - Introduction to python Backend.pptx
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PPTX
Essential Infomation Tech presentation.pptx
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
AI in Product Development-omnex systems
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PPTX
Odoo POS Development Services by CandidRoot Solutions
PDF
Odoo Companies in India – Driving Business Transformation.pdf
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Introduction to Artificial Intelligence
L1 - Introduction to python Backend.pptx
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
Essential Infomation Tech presentation.pptx
Which alternative to Crystal Reports is best for small or large businesses.pdf
VVF-Customer-Presentation2025-Ver1.9.pptx
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Softaken Excel to vCard Converter Software.pdf
Wondershare Filmora 15 Crack With Activation Key [2025
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Adobe Illustrator 28.6 Crack My Vision of Vector Design
How to Choose the Right IT Partner for Your Business in Malaysia
2025 Textile ERP Trends: SAP, Odoo & Oracle
Design an Analysis of Algorithms II-SECS-1021-03
AI in Product Development-omnex systems
Navsoft: AI-Powered Business Solutions & Custom Software Development
Odoo POS Development Services by CandidRoot Solutions
Odoo Companies in India – Driving Business Transformation.pdf

GitBucket: Open source self-hosting Git server built by Scala

  • 1. GitBucket Open source self-hosting Git server built by Scala Naoki Takezoe @takezoen
  • 2. Who am I? Naoki Takezoe ● Software Engineer at Treasure Data ○ Presto (Trino) and Spark ● 10 years experience with Scala ○ GitBucket, Scalatra, Apache PredictionIO, etc ○ Japanese edition of Scala Puzzlers
  • 4. GitBucket is... ● Open source self-hosting Git server ● Initial commit was April 2013 ● Built by Scala and Java technologies
  • 5. Current status (Feb 6, 2021) ● 8266 stars ● 158 contributors ● 719 gitter users ● 98 releases
  • 6. Start GitBucket right now! ● Download gitbucket.war from ○ https://github.com/gitbucket/gitbucket ● Run ● Official Docker image is available $ java -jar gitbucket.war $ docker run -d -p 8080:8080 gitbucket/gitbucket
  • 8. Motivation ● In-house Git repository ○ Due to company's security policy? ○ Due to contract with customers? ● Solutions ○ GitHub Enterprise was expensive ○ GitLab installation was awkward I must make it myself! by
  • 9. Why ? From First Principles: Why Scala? by Li Haoyi https://www.lihaoyi.com/post/FromFirstPrinciplesWhyScala.html ● "A Compiled Language that feels Dynamic" ○ Compiled language + Scripting launguage ○ Easy to write with safety ● "A Broad and Deep Ecosystem" ○ Existing Java resources can be leveraged ○ JGit: Pure Java Git implementation ○ Zero dependencies (except JVM) inspired by Jenkins Personal reasons: ● Wanted to write a real-world applications in Scala ● Just for fun :-)
  • 14. Major Features ● Public and private repository hosting ● Dashboard includes activity timeline ● Repository viewer which supports online file editing ● Markdown available Wiki ● Issues and pull requests ● Comment on source code ● Notification via E-mail ● User and group management ● LDAP integration ● Gravator integration ● GitHub compatible Web API ● Plugin system ● External database support (MySQL and PostgreSQL)
  • 17. Major plugins Name Description Gist plugin Add code snippet Gist-like functionality to GitBucket Asciidoc plugin Add AsciiDoc support to GitBucket Bugspots plugin Apply Google Bugspots to code in GitBucket repositories Pages plugin Publish repository contents as web sites Network plugin Add the commit graph view to GitBucket Emoji plugin Emoji support in Wiki or Issues RST plugin Add ReStructuredText support to GitBucket Explorer plugin Add the tree view for repositories on GitBucket PlantUML plugin Render PlantUML files on GitBucket Jupyter plugin Render Jupyter or IPython files on GitBucket Fess Plugin Add full text search capability to GitBucket Maven repository plugin Host in-house maven repositories on GitBucket Visit https://gitbucket-plugins.github.io/ to find other plugins!!
  • 19. Technology stack Git Repository RDBMS (H2 / MySQL / PostgreSQL) JGit Slick Apache MINA SSHD Jetty GitServlet (JGit) Scalatra + Twirl Git Client Web Browser SSH HTTP
  • 20. Core technologies are Java components ● Jetty ● H2 ● JGit ● Apache MINA SSHD
  • 21. Technology stack (Java parts) Git Repository RDBMS (H2 / MySQL / PostgreSQL) JGit Slick Apache MINA SSHD Jetty GitServlet (JGit) Scalatra + Twirl Git Client Web Browser SSH HTTP
  • 22. Key to minimize development cost Minimizing dev cost is very important for sustainability of personal OSS projects ● Java interoperability ○ Scala has good Java interoperability ○ Benefit from existing Java software resources ● Plugin architecture ○ Keep core features minimum for maintainability ○ Leverage community resources Because GitBucket users are not necessarily mature Scala users, we avoid too much FP flavor in GitBucket in order to open the door to contribution and plugin development to them.
  • 24. Upgrading Scala and libraries Scala's source code level backward compatibility is great, but… ● Need to rebuild libraries for new Scala major version ● Abandoned or not-well maintained libraries can be blockers ● Some libraries changed its public interface significantly (e.g. Slick2 -> Slick3)
  • 25. Experienced Scala major upgrade 3 times ● 2.10 -> 2.11 ● 2.11 -> 2.12 ● 2.12 -> 2.13 The most painful upgrade!
  • 26. Why upgrading to Scala 2.12 was so painful? Git Repository RDBMS (H2 / MySQL / PostgreSQL) JGit Slick Apache MINA SSHD Jetty GitServlet (JGit) Scalatra + Twirl Git Client Web Browser SSH HTTP Scalatra development was going down Destructive change in Slick3
  • 27. Scalatra ● Simple we framework for Scala inspired by Ruby's Sinatra ○ Traditional Java servlet based framework ○ Declarative input validation and mapping framework like Play2 ○ json4s based JSON support
  • 28. Scalatra development is going down ● Rise of reactive and functional programming in Scala ○ Emerge of new frameworks such as finagle, http4s and akka-http ○ Main Scalatra developers shifted to http4s ● Became a Scalatra committer ○ Boosted migration to Scala 2.12, and eventually Scala 2.13 ● Reduced maintenance cost to make it sustainable ○ Dropped minor features and library dependencies ○ Forked abandoned libraries, took some into Scalatra source tree if small enough
  • 29. Slick ● Advanced Type-safe SQL builder (former Scala-Query) ○ Very powerful and flexible type-safe API ○ Sometimes generated SQL can cause performance issues, especially on MySQL, though... ● Super painful upgrade in Slick2 -> Slick3 ○ Monadic DBIO introduced in Slick3 affected all existing code
  • 30. Slick2 -> Slick3 migration ● Amount of code that needs to be migrated ○ Affected all existing Slick2 based code including community developed plugins ● Difficulty of DBIO for GitBucket users ○ GitBucket users are not mature Scala programmers ○ We wanted to keep the bar low ● Scala 2.12 version of Slick2 was not available back then ○ Eventually Scala 2.12 version of Slick2 was released, though ○ Scala 2.13 version has not been released
  • 31. How we migrated to Slick3? ● Created blocking-slick library ○ Slick2 compatible blocking API on the top of Slick3 https://github.com/takezoe/blocking-slick ● We could migrate to Slick3 with minimum effort https://github.com/gitbucket/gitbucket/pull/1381/files ○ Also, minimized the negative impact on plugin developers
  • 32. Created Java libraries, not Scala libraries ● Markedj (GitHub flavored markdown parser, Java-port of marked.js) ● Solidbase (Multi-tenant and multi-database supported migration tool based on Liquibase) ● If the library interface is simple enough, no benefit to write in Scala for library users. ● We don't need to rebuild a library for each major Scala version.
  • 33. Effective strategy for long-term maintenance ● Minimize library dependencies ● Use Java libraries if possible ● Fork or take over library maintenance if needed These strategies would be effective even for migration to Scala3!
  • 34. Try GitBucket! ● GitHub: https://github.com/gitbucket/gitbucket ● Demo site: https://gitbucket.herokuapp.com/ ● Gitter: https://gitter.im/gitbucket/gitbucket ● Blog: https://gitbucket.github.io/gitbucket-news/ ● Community Plugins: https://gitbucket-plugins.github.io/
  • 35. Appendix: How to create GitBucket plugin
  • 36. Create project ● build.sbt ● project/plugins.sbt This sbt plugin adds necessary library dependencies to the project and provide configuration and sbt task useful for GitBucket plugin development.
  • 37. Define plugin manifest ● Plugin.scala (plugin manifest) Register new controller via extension point
  • 38. Implement plugin ● HelloWorldController.scala (Typical Scalatra controller) Bunch of extension points are available, such as: ● Add menus and tabs ● Inject JavaScript ● Register event hooks ● etc
  • 39. Build and Test ● Create a package ● Install to local GitBucket ● Template project ○ https://github.com/gitbucket/gitbucket-plugin-template ● Tutorial ○ https://gitbucket.github.io/gitbucket-news/gitbucket/2015/06/29/ho w-to-create-plugin.html $ sbt assembly $ sbt install