SlideShare a Scribd company logo
T R E A S U R E D A T A
Tips for Maintaining Open Source Projects
Lunch Session @ Treasure Data Tokyo Office
1
Taro L. Saito - GitHub:@xerial
Ph.D., Software Engineer at Treasure Data, Inc.
Target Scope
• OSS projects that can be maintained by a single person = You!
• Middle/Large size OSS projects
• TD’s OSS projects: fluentd, embulk, digdag, etc.
• Sada’s strategy:
• Build a pluggable framework
• Quickly delegate the future extension and maintenance to other people
• Apache projects: Hadoop, Spark, etc.
• Need some funding
• Need to find paid contributors
• Big projects essentially require company support = out of scope of this talk.
2
3
sqlite-jdbc
• JDBC driver for using SQLite in Java
• SQLite: tiny database engine. 1 database = 1 file
• Maintaining for more than 10 years
• Why?
• There was no handy database for Genome Science data management.
• Installing PostgreSQL, MySQL was conversome
• OS differences
• Windows (development) / Linux (production)
• How?
• Embed pre-compiled SQLite binaries into a JAR file
• For multiple CPU architectures
• JDBC + SQLite + JNI + Runtime BinaryLoader
4
snappy-java
• Snappy compressor/decompressor for Java
• Released just 1 week after Google open-sourced Snappy (C++)
• Used the same techniques in sqlite-jdbc: pre-compile snappy -> embed to JAR
• Used in Parquet => Apache Spark, Presto, etc. => 1.6M+ downloads / month
• Building native libraries for 20+ CPU architecture x OS type combination
• os.arch: x86, x86_64, arm, ppc, os.name: Windows, Mac, Linux, etc.
• Previously VMWare was used to run native/cross-compilers
• Now:
• Using Docker
• Linux images for cross compilers
• Custom built GCC
• Building native libraries in a single command
5
Tip 1: Automate Release Process
6
Traditional Release Process
• Release Steps for JVM projects
• Binary releases to Maven Central (hosted by Sonatype)
• Compile -> Test -> Package + GPG Sign -> Deploy to Maven Central (staging) -> Check
Maven Central Requirements -> Promote from staging to release
• Java: mvn release
• Don’t do that. It ruins your life. Instead, use:
• mvn deploy -DperformRelease=true
• Scala: sbt release
• Follow the same practice with mvn release.
• This also waists your life
• It sequentially run: compile -> test -> publish steps
• Too slow especially for cross-building + multi-module projects for Scala 2.11, 2.12,
2.13, etc.
7
Deploying to Maven Central (Sonatype)
• Painful Operation at Sonatype UI
• Upload artifacts -> Close -> Release -> Drop
• Need to login to Nexus Web UI
• Many manual steps
• Using Bintray?
• Uploading to Bintray -> Automatic sync to Maven Central
• Suffered from many incidents
8
sbt-sonatype plugin
• Enables one-command release to Maven Central
• Using REST APIs of Sonatype NEXUS Repository Manager
• Developed at 2015 New Year holiday
• Jan 5: Test Nexus REST API
• Jan 20: First release (Just 1 day effort)
• Released sbt-sonatype using sbt-sonatype
• 3,500+ projects are using sbt-sonatype
• Can be used for Java project release
• Maven Central sync is faster now
• Less than 10 minutes (Since June 2017)
9
Full Release Automation
• Triggering a release process with git tag
• Automatic versioning (sbt-dynver)
• 0.51+3-99dc3f68 (snapshot)
• 0.52 (release)
• Separate test and release processes
• Tagging only CI passed commits
• Run release process on TravisCI
• Packaging
• GPG signature
• Publishing to Maven Central
• with sbt-sonatype
• Finishes in about 10 minutes.
• Scala 2.11, 2.12, 2.13-M3, Scala.js cross build for more than 15+ modules
• with sbt-release, it took more than 2~3 hours
• Airframe has 3 or more releases every month
10
sbt-pack
• Plugin for Packaging JVM Projects
• With command line launch scripts
• Collect all dependencies into a folder
• Good for building Docker images
• Folder Structure
• bin/ - launch scripts
• lib/ - Scala/Java libraries
• Used for TD internal Scala projects
• prestobase, prestop, presto-conductor, etc.
11
Tip 2: Think Your Project Maintenance as
Learning Opportunities
12
Airframe
• Lightweight library collection for Scala
• Logging
• App Configuration
• Dependency Injection (DI)
• Object Serialization
• msgpack based codec
• MessagePack reader/writer for Scala
• JMX monitoring
• Human-readable date/time units
• Object shape inspectors
• etc.
• It already has 15+ modules.
13
Scala Version Upgrades = History of My Experiments
• Scala 2.7 (2009)
• Almost useless for production use cases => Learned just for fun
• Scala 2.8
• Improved the compatibility with Java collection => Better Java => Migrating my Java projects into Scala => airframe-opts
• Scala 2.9
• Parallel collection (= easy MapReduce, multi-thread programming) => built a distributed engine
• Scala 2.10
• String interpolation (embed expressions into Strings) => airframe-log
• s”Hello ${world}”
• Scala 2.11
• Meta-programming with Scala Macros. => airframe-surface, airframe-codec
• Scala 2.12
• Java8 support => Using airframe with Presto libraries (which only supports Java8)
• Presto experience => Guice -> airframe DI
• Scala 2.13
• Compiler performance improvement
• Enhancement to the collection library (groupMap, etc.)
14
Scala Ninja
• Scala Ninja living in GitHub
• Upgrading Java/Scala versions, sbt/gradle/mvn versions, library versions, etc.
• Fixing documentations
• etc.
• Learning new technologies through small PRs
15
Tip 3: Build What You Actually Need
16
GitHub Stars Tell Nothing About Project Usability
• No Real or Active Users
• xerial/larray
• Large off-heap arrays and mmap files for Scala and Java (287 stars)
• Needed to manage human genomes (3GB) + FM-indexes (20GB or more) in JVM
• No longer used and maintained after leaving academia
• Airpal
• Web UI for PrestoDB (2346 stars) created by Airbnb
• Nobody is maintaining it for 2 years
• Only support old versions of Presto
• These tools look cool at first, but in reality, no use cases exist
17
What You Usually Need as A Software Engineer
• Daily Task Automation
• Packaging & Release
• sbt-pack
• sbt-sonatype
• Daily Debugging
• airframe-log (easy to configure and start logging)
• Application Development
• airframe DI (Helping service composition)
• airframe-codec (Data serialization)
• airframe-config (App configuration)
• etc.
• If you can save 1 minute for a daily task, spending 6 hours for such library development will
pay off
• 365 minutes ≒ 6 hours
18
Summary: Tips for Maintaining OSS Projects
• Automate Release Process
• Think Your Project Maintenance as Learning Opportunities
• Build What You Actually Need
19
Related: Blog Articles
• 3 Tips for Maintaining Your Scala Projects
• https://medium.com/@taroleo/3-tips-for-maintaining-your-scala-projects-
e54a2feea9c4
• Airframe: Lightweight Building Blocks for Scala
• https://medium.com/@taroleo/airframe-c5d044a97ec
• Airframe Log: A Modern Logging Library for Scala
• https://medium.com/@taroleo/airframe-log-a-modern-logging-library-for-
scala-56fbc2f950bc
20
T R E A S U R E D A T A
21

More Related Content

PDF
OSDC 2018 | Scaling & High Availability MySQL learnings from the past decade+...
PDF
Quarkus - a next-generation Kubernetes Native Java framework
PDF
DCSF19 Container Security: Theory & Practice at Netflix
PDF
The Next Generation Cloud: Unleashing the Power of the Unikernal
PPTX
Kubernetes at NU.nl (Kubernetes meetup 2019-09-05)
PDF
The new Netflix API
PPT
Docker in the Cloud
OSDC 2018 | Scaling & High Availability MySQL learnings from the past decade+...
Quarkus - a next-generation Kubernetes Native Java framework
DCSF19 Container Security: Theory & Practice at Netflix
The Next Generation Cloud: Unleashing the Power of the Unikernal
Kubernetes at NU.nl (Kubernetes meetup 2019-09-05)
The new Netflix API
Docker in the Cloud

What's hot (20)

PDF
Netflix Open Source Meetup Season 4 Episode 2
PDF
Fabric8 - Being devOps doesn't suck anymore
PDF
Bootstraping real world Jakarta EE/MicroProfile microservices with Maven Arch...
PPTX
KUBEBOOT - SPRING BOOT DEPLOYMENT ON KUBERNETES HAS NEVER BEEN SO EASY
PDF
How bigtop leveraged docker for build automation and one click hadoop provis...
PDF
CFWheels - Pragmatic, Beautiful Code
PPTX
Sas 2015 event_driven
PDF
Netflix: From Zero to Production-Ready in Minutes (QCon 2017)
PPTX
Saltconf 2016: Salt stack transport and concurrency
PDF
KubeCon EU 2016: Bringing an open source Containerized Container Platform to ...
PDF
DCSF 19 Modernizing Insurance with Docker Enterprise: The Physicians Mutual ...
PDF
Cloud native applications
PPTX
How bigtop leveraged docker for build automation and one click hadoop provis...
PPTX
Stacking up with OpenStack: Building for High Availability
PDF
PyCon India 2012: Celery Talk
PDF
Camel Desing Patterns Learned Through Blood, Sweat, and Tears
KEY
Firefox Crash Reporting (@ Open Source Bridge)
PDF
Kubernetes intro public - kubernetes user group 4-21-2015
PDF
Netflix oss season 2 episode 1 - meetup Lightning talks
PPTX
BigTop vm and docker provisioner
Netflix Open Source Meetup Season 4 Episode 2
Fabric8 - Being devOps doesn't suck anymore
Bootstraping real world Jakarta EE/MicroProfile microservices with Maven Arch...
KUBEBOOT - SPRING BOOT DEPLOYMENT ON KUBERNETES HAS NEVER BEEN SO EASY
How bigtop leveraged docker for build automation and one click hadoop provis...
CFWheels - Pragmatic, Beautiful Code
Sas 2015 event_driven
Netflix: From Zero to Production-Ready in Minutes (QCon 2017)
Saltconf 2016: Salt stack transport and concurrency
KubeCon EU 2016: Bringing an open source Containerized Container Platform to ...
DCSF 19 Modernizing Insurance with Docker Enterprise: The Physicians Mutual ...
Cloud native applications
How bigtop leveraged docker for build automation and one click hadoop provis...
Stacking up with OpenStack: Building for High Availability
PyCon India 2012: Celery Talk
Camel Desing Patterns Learned Through Blood, Sweat, and Tears
Firefox Crash Reporting (@ Open Source Bridge)
Kubernetes intro public - kubernetes user group 4-21-2015
Netflix oss season 2 episode 1 - meetup Lightning talks
BigTop vm and docker provisioner
Ad

Similar to Tips For Maintaining OSS Projects (20)

PDF
Introduction to Micronaut - JBCNConf 2019
PPTX
Kubernetes Manchester - 6th December 2018
PDF
Scala at Treasure Data
KEY
Ship It ! with Ruby/ Rails Ecosystem
PPTX
CT Software Developers Meetup: Using Docker and Vagrant Within A GitHub Pull ...
PDF
Ruby and Distributed Storage Systems
PPTX
Gradle.Enemy at the gates
KEY
Make It Cooler: Using Decentralized Version Control
PDF
Stackato v2
PDF
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
PPTX
Java Introduction
PDF
Polygot Java EE on the GraalVM
PDF
Peru JUG Micronaut & GraalVM
ODP
rsyslog meets docker
PPTX
Gerrit + Jenkins = Continuous Delivery For Big Data
PDF
Angular 2 overview
PDF
Leonid Vasilyev "Building, deploying and running production code at Dropbox"
PPTX
Hands on Gradle
PDF
Stackato
PPTX
Java script nirvana in netbeans [con5679]
Introduction to Micronaut - JBCNConf 2019
Kubernetes Manchester - 6th December 2018
Scala at Treasure Data
Ship It ! with Ruby/ Rails Ecosystem
CT Software Developers Meetup: Using Docker and Vagrant Within A GitHub Pull ...
Ruby and Distributed Storage Systems
Gradle.Enemy at the gates
Make It Cooler: Using Decentralized Version Control
Stackato v2
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
Java Introduction
Polygot Java EE on the GraalVM
Peru JUG Micronaut & GraalVM
rsyslog meets docker
Gerrit + Jenkins = Continuous Delivery For Big Data
Angular 2 overview
Leonid Vasilyev "Building, deploying and running production code at Dropbox"
Hands on Gradle
Stackato
Java script nirvana in netbeans [con5679]
Ad

More from Taro L. Saito (20)

PDF
Unifying Frontend and Backend Development with Scala - ScalaCon 2021
PDF
Journey of Migrating 1 Million Presto Queries - Presto Webinar 2020
PDF
Scala for Everything: From Frontend to Backend Applications - Scala Matsuri 2020
PDF
Airframe RPC
PDF
td-spark internals: Extending Spark with Airframe - Spark Meetup Tokyo #3 2020
PDF
Airframe Meetup #3: 2019 Updates & AirSpec
PDF
Presto At Arm Treasure Data - 2019 Updates
PDF
Reading The Source Code of Presto
PDF
How To Use Scala At Work - Airframe In Action at Arm Treasure Data
PDF
Airframe: Lightweight Building Blocks for Scala - Scale By The Bay 2018
PDF
Airframe: Lightweight Building Blocks for Scala @ TD Tech Talk 2018-10-17
PDF
Learning Silicon Valley Culture
PDF
Presto At Treasure Data
PDF
Introduction to Presto at Treasure Data
PDF
Workflow Hacks #1 - dots. Tokyo
PDF
Presto @ Treasure Data - Presto Meetup Boston 2015
PDF
Presto As A Service - Treasure DataでのPresto運用事例
PPTX
JNuma Library
PDF
Presto as a Service - Tips for operation and monitoring
PDF
Treasure Dataを支える技術 - MessagePack編
Unifying Frontend and Backend Development with Scala - ScalaCon 2021
Journey of Migrating 1 Million Presto Queries - Presto Webinar 2020
Scala for Everything: From Frontend to Backend Applications - Scala Matsuri 2020
Airframe RPC
td-spark internals: Extending Spark with Airframe - Spark Meetup Tokyo #3 2020
Airframe Meetup #3: 2019 Updates & AirSpec
Presto At Arm Treasure Data - 2019 Updates
Reading The Source Code of Presto
How To Use Scala At Work - Airframe In Action at Arm Treasure Data
Airframe: Lightweight Building Blocks for Scala - Scale By The Bay 2018
Airframe: Lightweight Building Blocks for Scala @ TD Tech Talk 2018-10-17
Learning Silicon Valley Culture
Presto At Treasure Data
Introduction to Presto at Treasure Data
Workflow Hacks #1 - dots. Tokyo
Presto @ Treasure Data - Presto Meetup Boston 2015
Presto As A Service - Treasure DataでのPresto運用事例
JNuma Library
Presto as a Service - Tips for operation and monitoring
Treasure Dataを支える技術 - MessagePack編

Recently uploaded (20)

PPTX
Geodesy 1.pptx...............................................
DOCX
573137875-Attendance-Management-System-original
PDF
Model Code of Practice - Construction Work - 21102022 .pdf
PDF
PPT on Performance Review to get promotions
PDF
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
PDF
Mitigating Risks through Effective Management for Enhancing Organizational Pe...
PPTX
UNIT-1 - COAL BASED THERMAL POWER PLANTS
PPTX
Lesson 3_Tessellation.pptx finite Mathematics
PPT
Project quality management in manufacturing
PPTX
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
PDF
composite construction of structures.pdf
PPTX
Lecture Notes Electrical Wiring System Components
PPTX
Recipes for Real Time Voice AI WebRTC, SLMs and Open Source Software.pptx
PPTX
bas. eng. economics group 4 presentation 1.pptx
PPTX
Sustainable Sites - Green Building Construction
PPTX
Internet of Things (IOT) - A guide to understanding
PDF
Arduino robotics embedded978-1-4302-3184-4.pdf
PPTX
Foundation to blockchain - A guide to Blockchain Tech
PPTX
Welding lecture in detail for understanding
PDF
July 2025 - Top 10 Read Articles in International Journal of Software Enginee...
Geodesy 1.pptx...............................................
573137875-Attendance-Management-System-original
Model Code of Practice - Construction Work - 21102022 .pdf
PPT on Performance Review to get promotions
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
Mitigating Risks through Effective Management for Enhancing Organizational Pe...
UNIT-1 - COAL BASED THERMAL POWER PLANTS
Lesson 3_Tessellation.pptx finite Mathematics
Project quality management in manufacturing
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
composite construction of structures.pdf
Lecture Notes Electrical Wiring System Components
Recipes for Real Time Voice AI WebRTC, SLMs and Open Source Software.pptx
bas. eng. economics group 4 presentation 1.pptx
Sustainable Sites - Green Building Construction
Internet of Things (IOT) - A guide to understanding
Arduino robotics embedded978-1-4302-3184-4.pdf
Foundation to blockchain - A guide to Blockchain Tech
Welding lecture in detail for understanding
July 2025 - Top 10 Read Articles in International Journal of Software Enginee...

Tips For Maintaining OSS Projects

  • 1. T R E A S U R E D A T A Tips for Maintaining Open Source Projects Lunch Session @ Treasure Data Tokyo Office 1 Taro L. Saito - GitHub:@xerial Ph.D., Software Engineer at Treasure Data, Inc.
  • 2. Target Scope • OSS projects that can be maintained by a single person = You! • Middle/Large size OSS projects • TD’s OSS projects: fluentd, embulk, digdag, etc. • Sada’s strategy: • Build a pluggable framework • Quickly delegate the future extension and maintenance to other people • Apache projects: Hadoop, Spark, etc. • Need some funding • Need to find paid contributors • Big projects essentially require company support = out of scope of this talk. 2
  • 3. 3
  • 4. sqlite-jdbc • JDBC driver for using SQLite in Java • SQLite: tiny database engine. 1 database = 1 file • Maintaining for more than 10 years • Why? • There was no handy database for Genome Science data management. • Installing PostgreSQL, MySQL was conversome • OS differences • Windows (development) / Linux (production) • How? • Embed pre-compiled SQLite binaries into a JAR file • For multiple CPU architectures • JDBC + SQLite + JNI + Runtime BinaryLoader 4
  • 5. snappy-java • Snappy compressor/decompressor for Java • Released just 1 week after Google open-sourced Snappy (C++) • Used the same techniques in sqlite-jdbc: pre-compile snappy -> embed to JAR • Used in Parquet => Apache Spark, Presto, etc. => 1.6M+ downloads / month • Building native libraries for 20+ CPU architecture x OS type combination • os.arch: x86, x86_64, arm, ppc, os.name: Windows, Mac, Linux, etc. • Previously VMWare was used to run native/cross-compilers • Now: • Using Docker • Linux images for cross compilers • Custom built GCC • Building native libraries in a single command 5
  • 6. Tip 1: Automate Release Process 6
  • 7. Traditional Release Process • Release Steps for JVM projects • Binary releases to Maven Central (hosted by Sonatype) • Compile -> Test -> Package + GPG Sign -> Deploy to Maven Central (staging) -> Check Maven Central Requirements -> Promote from staging to release • Java: mvn release • Don’t do that. It ruins your life. Instead, use: • mvn deploy -DperformRelease=true • Scala: sbt release • Follow the same practice with mvn release. • This also waists your life • It sequentially run: compile -> test -> publish steps • Too slow especially for cross-building + multi-module projects for Scala 2.11, 2.12, 2.13, etc. 7
  • 8. Deploying to Maven Central (Sonatype) • Painful Operation at Sonatype UI • Upload artifacts -> Close -> Release -> Drop • Need to login to Nexus Web UI • Many manual steps • Using Bintray? • Uploading to Bintray -> Automatic sync to Maven Central • Suffered from many incidents 8
  • 9. sbt-sonatype plugin • Enables one-command release to Maven Central • Using REST APIs of Sonatype NEXUS Repository Manager • Developed at 2015 New Year holiday • Jan 5: Test Nexus REST API • Jan 20: First release (Just 1 day effort) • Released sbt-sonatype using sbt-sonatype • 3,500+ projects are using sbt-sonatype • Can be used for Java project release • Maven Central sync is faster now • Less than 10 minutes (Since June 2017) 9
  • 10. Full Release Automation • Triggering a release process with git tag • Automatic versioning (sbt-dynver) • 0.51+3-99dc3f68 (snapshot) • 0.52 (release) • Separate test and release processes • Tagging only CI passed commits • Run release process on TravisCI • Packaging • GPG signature • Publishing to Maven Central • with sbt-sonatype • Finishes in about 10 minutes. • Scala 2.11, 2.12, 2.13-M3, Scala.js cross build for more than 15+ modules • with sbt-release, it took more than 2~3 hours • Airframe has 3 or more releases every month 10
  • 11. sbt-pack • Plugin for Packaging JVM Projects • With command line launch scripts • Collect all dependencies into a folder • Good for building Docker images • Folder Structure • bin/ - launch scripts • lib/ - Scala/Java libraries • Used for TD internal Scala projects • prestobase, prestop, presto-conductor, etc. 11
  • 12. Tip 2: Think Your Project Maintenance as Learning Opportunities 12
  • 13. Airframe • Lightweight library collection for Scala • Logging • App Configuration • Dependency Injection (DI) • Object Serialization • msgpack based codec • MessagePack reader/writer for Scala • JMX monitoring • Human-readable date/time units • Object shape inspectors • etc. • It already has 15+ modules. 13
  • 14. Scala Version Upgrades = History of My Experiments • Scala 2.7 (2009) • Almost useless for production use cases => Learned just for fun • Scala 2.8 • Improved the compatibility with Java collection => Better Java => Migrating my Java projects into Scala => airframe-opts • Scala 2.9 • Parallel collection (= easy MapReduce, multi-thread programming) => built a distributed engine • Scala 2.10 • String interpolation (embed expressions into Strings) => airframe-log • s”Hello ${world}” • Scala 2.11 • Meta-programming with Scala Macros. => airframe-surface, airframe-codec • Scala 2.12 • Java8 support => Using airframe with Presto libraries (which only supports Java8) • Presto experience => Guice -> airframe DI • Scala 2.13 • Compiler performance improvement • Enhancement to the collection library (groupMap, etc.) 14
  • 15. Scala Ninja • Scala Ninja living in GitHub • Upgrading Java/Scala versions, sbt/gradle/mvn versions, library versions, etc. • Fixing documentations • etc. • Learning new technologies through small PRs 15
  • 16. Tip 3: Build What You Actually Need 16
  • 17. GitHub Stars Tell Nothing About Project Usability • No Real or Active Users • xerial/larray • Large off-heap arrays and mmap files for Scala and Java (287 stars) • Needed to manage human genomes (3GB) + FM-indexes (20GB or more) in JVM • No longer used and maintained after leaving academia • Airpal • Web UI for PrestoDB (2346 stars) created by Airbnb • Nobody is maintaining it for 2 years • Only support old versions of Presto • These tools look cool at first, but in reality, no use cases exist 17
  • 18. What You Usually Need as A Software Engineer • Daily Task Automation • Packaging & Release • sbt-pack • sbt-sonatype • Daily Debugging • airframe-log (easy to configure and start logging) • Application Development • airframe DI (Helping service composition) • airframe-codec (Data serialization) • airframe-config (App configuration) • etc. • If you can save 1 minute for a daily task, spending 6 hours for such library development will pay off • 365 minutes ≒ 6 hours 18
  • 19. Summary: Tips for Maintaining OSS Projects • Automate Release Process • Think Your Project Maintenance as Learning Opportunities • Build What You Actually Need 19
  • 20. Related: Blog Articles • 3 Tips for Maintaining Your Scala Projects • https://medium.com/@taroleo/3-tips-for-maintaining-your-scala-projects- e54a2feea9c4 • Airframe: Lightweight Building Blocks for Scala • https://medium.com/@taroleo/airframe-c5d044a97ec • Airframe Log: A Modern Logging Library for Scala • https://medium.com/@taroleo/airframe-log-a-modern-logging-library-for- scala-56fbc2f950bc 20
  • 21. T R E A S U R E D A T A 21