SlideShare une entreprise Scribd logo
1  sur  1
Télécharger pour lire hors ligne
Over the past 1.5 years LinkedIn has been using {py}gradle on over 800 different projects successfully. Given
the success of these projects we are going to offer the plugin to the open source community. We plan to open
source {py}gradle in it’s current state, after LinkedIn-isms are removed with a 0 major version. When it’s open
sourced, we will also present the plan forward for 1.0 and beyond.
OPEN SOURCE
BUILDING A POLYGLOT SERVICE?
A Polyglot Service has a backend API server written in Python that uses gunicorn, Flask, and other internal
and external Python dependencies, it has a frontend server written in Ember.js that uses NPM under the hood,
it uses Python clients generated from Rest.li interface definition language (IDL) using a Java tool, and must
emit the proper metadata that our deployment system uses to configure, canary, and deploy our service.
How can we build a Polyglot Service?
generateJava
generatePython
buildJava
buildEmber
buildRestli
buildPython
build
uploadMetadata
publish
uploadArtifacts
packDeployable
runPytest
pipInstallDeps
makeDists
createVenv
Gradle is an open source modular build system. Gradle started its life building JVM-based code, and
gained additional traction when they moved to Android and C/C++ over the past few years. Gradle
gives developers a rich API to implement plugins: the primitive units that compose a Gradle build
system. A plugin developer is able to implement a DSL to model any process or language that they
wish, ultimately enabling us to build polyglot build systems. A plugin can be reused, mixed and
matched with other plugins, extended, configured, and more. Gradle’s plugin architecture lets us
build better build systems.
ABOUT GRADLE
BUILD.GRADLE
apply plugin: 'python'
apply plugin: 'python-api-server'
def insertFromFile = { filePath ->
// Read a Python requirements.txt file...
}
dependencies {
// Installation requirements from file
installRequires insertFromFile('requirements.txt')
// Installation requirements
installRequires 'pypi:Flask:0.0.0'
installRequires 'linkedin:utils:0.0.0'
// Test requirements
testsRequire 'pypi:mock:0.0.0'
// Setup requirements
setupRequires 'pypi:setuptools-git:0.0.0'
// Front end static resources requirements
resource project(path: ':ember-frontend', configuration:
'static')
}
- Dependency management for FREE!
- No need to emit metadata. The build system does that for me.
- Different languages work together.
Some cases where Gradle works better for version conflict resolution than the traditional Python build
workflow.
- Python picks up a new version on each rebuild. Gradle can reproduce the builds.
- Python gets version conflict for major version updates. Gradle picks up the highest.
- Python gets version conflict when one branch of the graph blacklists version as bad, but another
branch does not. Gradle reliably blacklists the bad version.
In complex dependency systems, we may
want to do what LinkedIn calls “semantic
version” testing. Upon a change to D, we
want to test its changes against C, F, and G.
If the application does not pin all its dependencies,
it can get into cascading version conflicts during
dependency updates (see below). In this example
we can see that C, F, and G all depend on D at dif-
ferent major versions. What should we do?
Dependency management happens on graphs, where nodes represent packages and edges represent ver-
sions or ranges of versions on other nodes. We care about dependency management because it gives us
the ability to reproduce builds and safely evolve software as it changes time over time.
Dependency management is challenging to get right, and solutions exist on a spectrum. On one side,
we can practice version pinning in which a dependency pins all direct and transitive dependencies. This
approach achieves reproducible builds, but makes safely evolving difficult. On the other side, we can
employ floating versions and only specify direct dependencies. This approach achieves fluidity in evolv-
ing software but makes reproducible builds impossible and doesn’t make evolution necessarily safe.
DEPENDENCY MANAGEMENT
A
B
E
D
C
G
F
A
B
E
D
C
G
F
A
B
E
D
C
G
F
ABOUT SEMANTIC VERSIONING
[
V 1 2 5Major Minor Patch
[
[
A {py}gradle project uses setuptools, vir-
tualenv, and pip to maintain a development
and build environment that makes use of ev-
erything that a Python developer is already fa-
miliar with: setup.py, setup.cfg, require-
ments.txt, tox.ini, and more. A {py}gradle
project looks and feels like a Python project
and produces backwards-compatible artifacts
that work with non-{py}gradle-based Python
projects.
HOW TO USE
$ tree
├── build.gradle
├── gradlew
├── backend-api
│ ├── build.gradle
│ ├── setup.cfg
│ ├── setup.py
│ ├── src
│ │ └── backend
│ │ └── __init__.py
│ ├── requirements.txt
│ └── test
│ └── test_backend.py
├── <subproject>
│ └── ...
└── settings.gradle
$ ./gradlew build
{py}gradle uses the power of Ivy for dependency
management. Then, it goes out of your way and
lets you work as a pure Python developer. After
the first build, the standard virtualenv develope-
ment workflow can be used.
BUILD SYSTEM COMPARISON
ABSTRACT
As our Python development team grew over the years and the number of packages and interdepen-
dencies grew from tens to hundreds to thousands, we found that we were struggling to maintain
our code base using the standard tooling that was available to us: setuptools, virtualenv, and pip.
At the same time, our Java development team converged on a new build system – Gradle – that al-
lowed them to write extendable build logic. We found that Gradle wasn’t just for Java, and we wrote
a powerful and idiomatic Python build system that reused much of the build logic as our Java
peers, without changing the way our Python developers work.
{py}gradle
Stephen Holsapple (sholsapp@linkedin.com, , sholsapp)
Zvezdan Petković (zpetkovic@linkedin.com, zvezdan)
Ethan Hall (ethall@linkedin.com, ethankhall)
Loren Carvalho (lcarvalho@linkedin.com, sixninetynine)
Gradle Maven Ant Setuptools Buildout Pants CMake
Powerful
Dependency Resolution
API
Decoupled Dependency
Metadata
Ivy-based
Metadata
Pluggable
Scriptable
Human-readable
Build File
Natively Polyglot
Generic Artifact
Hosting Support
(*) to a certain extent, or not easily
*
*
*
Gradle allows us to have multiple projects, each in a separate directory, for each language used. Each project
uses the gradle plugin(s) specific to that language. The artifacts produced in a build of each project can be
used in another project. The ordering of build tasks gives us the full control of the overall service build. For
advanced use, one can exclude tasks from running, or use multiple languages in the same project.

Contenu connexe

Tendances

Manageable Data Pipelines With Airflow (and kubernetes) - GDG DevFest
Manageable Data Pipelines With Airflow (and kubernetes) - GDG DevFestManageable Data Pipelines With Airflow (and kubernetes) - GDG DevFest
Manageable Data Pipelines With Airflow (and kubernetes) - GDG DevFest
Jarek Potiuk
 
Setting up Notifications, Alerts & Webhooks with Flux v2 by Alison Dowdney
Setting up Notifications, Alerts & Webhooks with Flux v2 by Alison DowdneySetting up Notifications, Alerts & Webhooks with Flux v2 by Alison Dowdney
Setting up Notifications, Alerts & Webhooks with Flux v2 by Alison Dowdney
Weaveworks
 

Tendances (20)

Intro to Ratpack (CDJDN 2015-01-22)
Intro to Ratpack (CDJDN 2015-01-22)Intro to Ratpack (CDJDN 2015-01-22)
Intro to Ratpack (CDJDN 2015-01-22)
 
Introducing Kubeflow (w. Special Guests Tensorflow and Apache Spark)
Introducing Kubeflow (w. Special Guests Tensorflow and Apache Spark)Introducing Kubeflow (w. Special Guests Tensorflow and Apache Spark)
Introducing Kubeflow (w. Special Guests Tensorflow and Apache Spark)
 
給 RD 的 Kubernetes 初體驗 (EKS version)
給 RD 的 Kubernetes 初體驗 (EKS version)給 RD 的 Kubernetes 初體驗 (EKS version)
給 RD 的 Kubernetes 初體驗 (EKS version)
 
Manageable Data Pipelines With Airflow (and kubernetes) - GDG DevFest
Manageable Data Pipelines With Airflow (and kubernetes) - GDG DevFestManageable Data Pipelines With Airflow (and kubernetes) - GDG DevFest
Manageable Data Pipelines With Airflow (and kubernetes) - GDG DevFest
 
Spinnaker Summit 2019: Where are we heading? The Future of Continuous Delivery
Spinnaker Summit 2019: Where are we heading? The Future of Continuous DeliverySpinnaker Summit 2019: Where are we heading? The Future of Continuous Delivery
Spinnaker Summit 2019: Where are we heading? The Future of Continuous Delivery
 
Building Translate on Glass
Building Translate on GlassBuilding Translate on Glass
Building Translate on Glass
 
Setting up Notifications, Alerts & Webhooks with Flux v2 by Alison Dowdney
Setting up Notifications, Alerts & Webhooks with Flux v2 by Alison DowdneySetting up Notifications, Alerts & Webhooks with Flux v2 by Alison Dowdney
Setting up Notifications, Alerts & Webhooks with Flux v2 by Alison Dowdney
 
Importance of GCP: 30 Days of GCP
Importance of GCP: 30 Days of GCPImportance of GCP: 30 Days of GCP
Importance of GCP: 30 Days of GCP
 
Yannis Zarkadas. Enterprise data science workflows on kubeflow
Yannis Zarkadas. Enterprise data science workflows on kubeflowYannis Zarkadas. Enterprise data science workflows on kubeflow
Yannis Zarkadas. Enterprise data science workflows on kubeflow
 
Ratpack Web Framework
Ratpack Web FrameworkRatpack Web Framework
Ratpack Web Framework
 
給 RD 的 Kubernetes 初體驗
給 RD 的 Kubernetes 初體驗給 RD 的 Kubernetes 初體驗
給 RD 的 Kubernetes 初體驗
 
It's a Breeze to develop Apache Airflow (London Apache Airflow meetup)
It's a Breeze to develop Apache Airflow (London Apache Airflow meetup)It's a Breeze to develop Apache Airflow (London Apache Airflow meetup)
It's a Breeze to develop Apache Airflow (London Apache Airflow meetup)
 
Hands-on GitOps Patterns for Helm Users
Hands-on GitOps Patterns for Helm UsersHands-on GitOps Patterns for Helm Users
Hands-on GitOps Patterns for Helm Users
 
Terraform Code Reviews: Supercharged with Conftest
Terraform Code Reviews: Supercharged with ConftestTerraform Code Reviews: Supercharged with Conftest
Terraform Code Reviews: Supercharged with Conftest
 
Nanog75, Network Device Property as Code
Nanog75, Network Device Property as CodeNanog75, Network Device Property as Code
Nanog75, Network Device Property as Code
 
Gitlab ci, cncf.sk
Gitlab ci, cncf.skGitlab ci, cncf.sk
Gitlab ci, cncf.sk
 
Docker Enables DevOps
Docker Enables DevOpsDocker Enables DevOps
Docker Enables DevOps
 
Kube Your Enthusiasm - Paul Czarkowski
Kube Your Enthusiasm - Paul CzarkowskiKube Your Enthusiasm - Paul Czarkowski
Kube Your Enthusiasm - Paul Czarkowski
 
はじめての JFrog Artifactory
はじめての JFrog Artifactoryはじめての JFrog Artifactory
はじめての JFrog Artifactory
 
Netflix Open Source: Building a Distributed and Automated Open Source Program
Netflix Open Source:  Building a Distributed and Automated Open Source ProgramNetflix Open Source:  Building a Distributed and Automated Open Source Program
Netflix Open Source: Building a Distributed and Automated Open Source Program
 

Similaire à {py}gradle

Introduction to Gradio library in python.pptx
Introduction to Gradio library in python.pptxIntroduction to Gradio library in python.pptx
Introduction to Gradio library in python.pptx
vahid67ebrahimian
 
Introduction To Development And Operations
Introduction To Development And OperationsIntroduction To Development And Operations
Introduction To Development And Operations
teekhesawaal
 
Heroku for-team-collaboration
Heroku for-team-collaborationHeroku for-team-collaboration
Heroku for-team-collaboration
John Stevenson
 

Similaire à {py}gradle (20)

APIdays Paris 2019 - Delivering Exceptional User Experience with REST and Gra...
APIdays Paris 2019 - Delivering Exceptional User Experience with REST and Gra...APIdays Paris 2019 - Delivering Exceptional User Experience with REST and Gra...
APIdays Paris 2019 - Delivering Exceptional User Experience with REST and Gra...
 
Apigee deploy grunt plugin.1.0
Apigee deploy grunt plugin.1.0Apigee deploy grunt plugin.1.0
Apigee deploy grunt plugin.1.0
 
Django Framework Overview forNon-Python Developers
Django Framework Overview forNon-Python DevelopersDjango Framework Overview forNon-Python Developers
Django Framework Overview forNon-Python Developers
 
Introduction to Gradio library in python.pptx
Introduction to Gradio library in python.pptxIntroduction to Gradio library in python.pptx
Introduction to Gradio library in python.pptx
 
.NET Application Modernization with PAS and Azure DevOps
.NET Application Modernization with PAS and Azure DevOps.NET Application Modernization with PAS and Azure DevOps
.NET Application Modernization with PAS and Azure DevOps
 
Nitin devops
Nitin devopsNitin devops
Nitin devops
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository world
 
MOBILE APP DEVELOPMENT USING PYTHON
MOBILE APP DEVELOPMENT USING PYTHONMOBILE APP DEVELOPMENT USING PYTHON
MOBILE APP DEVELOPMENT USING PYTHON
 
MuleSoft Nashik Virtual Meetup#4 - Implementing CI/CD pipeline for deploying ...
MuleSoft Nashik Virtual Meetup#4 - Implementing CI/CD pipeline for deploying ...MuleSoft Nashik Virtual Meetup#4 - Implementing CI/CD pipeline for deploying ...
MuleSoft Nashik Virtual Meetup#4 - Implementing CI/CD pipeline for deploying ...
 
Top 10 python frameworks for web development in 2020
Top 10 python frameworks for web development in 2020Top 10 python frameworks for web development in 2020
Top 10 python frameworks for web development in 2020
 
Introduction To Development And Operations
Introduction To Development And OperationsIntroduction To Development And Operations
Introduction To Development And Operations
 
Weave GitOps - continuous delivery for any Kubernetes
Weave GitOps - continuous delivery for any KubernetesWeave GitOps - continuous delivery for any Kubernetes
Weave GitOps - continuous delivery for any Kubernetes
 
PRATIK MUNDRA
PRATIK MUNDRAPRATIK MUNDRA
PRATIK MUNDRA
 
Heroku for team collaboration
Heroku for team collaborationHeroku for team collaboration
Heroku for team collaboration
 
Heroku for-team-collaboration
Heroku for-team-collaborationHeroku for-team-collaboration
Heroku for-team-collaboration
 
Rajiv Profile
Rajiv ProfileRajiv Profile
Rajiv Profile
 
Top 10 Best DevOps tools in 2020
Top 10 Best DevOps tools in 2020Top 10 Best DevOps tools in 2020
Top 10 Best DevOps tools in 2020
 
What's new in Gradle 4.0
What's new in Gradle 4.0What's new in Gradle 4.0
What's new in Gradle 4.0
 
Mastinder singh visualcv_resume
Mastinder singh visualcv_resumeMastinder singh visualcv_resume
Mastinder singh visualcv_resume
 
Student Developer Kit for Developing Applications
Student Developer Kit for Developing ApplicationsStudent Developer Kit for Developing Applications
Student Developer Kit for Developing Applications
 

Dernier

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Dernier (20)

Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 

{py}gradle

  • 1. Over the past 1.5 years LinkedIn has been using {py}gradle on over 800 different projects successfully. Given the success of these projects we are going to offer the plugin to the open source community. We plan to open source {py}gradle in it’s current state, after LinkedIn-isms are removed with a 0 major version. When it’s open sourced, we will also present the plan forward for 1.0 and beyond. OPEN SOURCE BUILDING A POLYGLOT SERVICE? A Polyglot Service has a backend API server written in Python that uses gunicorn, Flask, and other internal and external Python dependencies, it has a frontend server written in Ember.js that uses NPM under the hood, it uses Python clients generated from Rest.li interface definition language (IDL) using a Java tool, and must emit the proper metadata that our deployment system uses to configure, canary, and deploy our service. How can we build a Polyglot Service? generateJava generatePython buildJava buildEmber buildRestli buildPython build uploadMetadata publish uploadArtifacts packDeployable runPytest pipInstallDeps makeDists createVenv Gradle is an open source modular build system. Gradle started its life building JVM-based code, and gained additional traction when they moved to Android and C/C++ over the past few years. Gradle gives developers a rich API to implement plugins: the primitive units that compose a Gradle build system. A plugin developer is able to implement a DSL to model any process or language that they wish, ultimately enabling us to build polyglot build systems. A plugin can be reused, mixed and matched with other plugins, extended, configured, and more. Gradle’s plugin architecture lets us build better build systems. ABOUT GRADLE BUILD.GRADLE apply plugin: 'python' apply plugin: 'python-api-server' def insertFromFile = { filePath -> // Read a Python requirements.txt file... } dependencies { // Installation requirements from file installRequires insertFromFile('requirements.txt') // Installation requirements installRequires 'pypi:Flask:0.0.0' installRequires 'linkedin:utils:0.0.0' // Test requirements testsRequire 'pypi:mock:0.0.0' // Setup requirements setupRequires 'pypi:setuptools-git:0.0.0' // Front end static resources requirements resource project(path: ':ember-frontend', configuration: 'static') } - Dependency management for FREE! - No need to emit metadata. The build system does that for me. - Different languages work together. Some cases where Gradle works better for version conflict resolution than the traditional Python build workflow. - Python picks up a new version on each rebuild. Gradle can reproduce the builds. - Python gets version conflict for major version updates. Gradle picks up the highest. - Python gets version conflict when one branch of the graph blacklists version as bad, but another branch does not. Gradle reliably blacklists the bad version. In complex dependency systems, we may want to do what LinkedIn calls “semantic version” testing. Upon a change to D, we want to test its changes against C, F, and G. If the application does not pin all its dependencies, it can get into cascading version conflicts during dependency updates (see below). In this example we can see that C, F, and G all depend on D at dif- ferent major versions. What should we do? Dependency management happens on graphs, where nodes represent packages and edges represent ver- sions or ranges of versions on other nodes. We care about dependency management because it gives us the ability to reproduce builds and safely evolve software as it changes time over time. Dependency management is challenging to get right, and solutions exist on a spectrum. On one side, we can practice version pinning in which a dependency pins all direct and transitive dependencies. This approach achieves reproducible builds, but makes safely evolving difficult. On the other side, we can employ floating versions and only specify direct dependencies. This approach achieves fluidity in evolv- ing software but makes reproducible builds impossible and doesn’t make evolution necessarily safe. DEPENDENCY MANAGEMENT A B E D C G F A B E D C G F A B E D C G F ABOUT SEMANTIC VERSIONING [ V 1 2 5Major Minor Patch [ [ A {py}gradle project uses setuptools, vir- tualenv, and pip to maintain a development and build environment that makes use of ev- erything that a Python developer is already fa- miliar with: setup.py, setup.cfg, require- ments.txt, tox.ini, and more. A {py}gradle project looks and feels like a Python project and produces backwards-compatible artifacts that work with non-{py}gradle-based Python projects. HOW TO USE $ tree ├── build.gradle ├── gradlew ├── backend-api │ ├── build.gradle │ ├── setup.cfg │ ├── setup.py │ ├── src │ │ └── backend │ │ └── __init__.py │ ├── requirements.txt │ └── test │ └── test_backend.py ├── <subproject> │ └── ... └── settings.gradle $ ./gradlew build {py}gradle uses the power of Ivy for dependency management. Then, it goes out of your way and lets you work as a pure Python developer. After the first build, the standard virtualenv develope- ment workflow can be used. BUILD SYSTEM COMPARISON ABSTRACT As our Python development team grew over the years and the number of packages and interdepen- dencies grew from tens to hundreds to thousands, we found that we were struggling to maintain our code base using the standard tooling that was available to us: setuptools, virtualenv, and pip. At the same time, our Java development team converged on a new build system – Gradle – that al- lowed them to write extendable build logic. We found that Gradle wasn’t just for Java, and we wrote a powerful and idiomatic Python build system that reused much of the build logic as our Java peers, without changing the way our Python developers work. {py}gradle Stephen Holsapple (sholsapp@linkedin.com, , sholsapp) Zvezdan Petković (zpetkovic@linkedin.com, zvezdan) Ethan Hall (ethall@linkedin.com, ethankhall) Loren Carvalho (lcarvalho@linkedin.com, sixninetynine) Gradle Maven Ant Setuptools Buildout Pants CMake Powerful Dependency Resolution API Decoupled Dependency Metadata Ivy-based Metadata Pluggable Scriptable Human-readable Build File Natively Polyglot Generic Artifact Hosting Support (*) to a certain extent, or not easily * * * Gradle allows us to have multiple projects, each in a separate directory, for each language used. Each project uses the gradle plugin(s) specific to that language. The artifacts produced in a build of each project can be used in another project. The ordering of build tasks gives us the full control of the overall service build. For advanced use, one can exclude tasks from running, or use multiple languages in the same project.