SlideShare a Scribd company logo
1 of 82
Download to read offline
Or Shachar,
Backend Engineer, Wix-CI
Migrating to a Bazel-based CI
system: 6 learnings
ors@wix.com linkedin/or-shachar github.com/or-shachar
Check emailCoffee break Ping pong
Reading news CAll your mom
<Pending mode>
Check emailCoffee break Ping pong
Reading news CAll your mom
Building...
Hi,
I'm Or.
CI
Build with Ant and Make๏ฌles
Maven CI Pipelines
Backend Engineering
โ€ฆ
Backend Engineering for2017
2011
2014
2019
Building...
Building...
We migrated
to Bazel
Codebase +
build de๏ฌnition
Build server
feedback
Build tool
deployables
~5M LOC
> 1000 repos
2000+ Maven modules
2017
Teamcity
Maven
feedback
deployables
~5M LOC
> 1000 repos
2000+ Maven modules
2017
Teamcity
Maven
feedback
deployables
building / broken
blockedblocked
blocked
blocked
2017
Master
stability
Push to
feedback
Push to
release
Often broken
Can take 1 hour
Can take hours
And so we
wait...
Find new machinery
thatโ€™s stable, fast, and can scale.
Master
stability
Push to
feedback
Push to
release
2019
Often broken
Can take 1 hour
Can take hours
2017
Master
stability
Push to
feedback
Push to
release
Mostly stable
5-10 minutes
15-25 minutes
6 LEARNINGS
FROM
MIGRATING
OUR BUILD
SYSTEM TO
BAZEL.
#1
Use a Migration tool
Massage it, validate it.
Migration 101 Bazel>>Maven >>
.
โ”œโ”€โ”€ foo-core [pom.xml]
โ”‚ โ””โ”€โ”€ src
โ”‚ โ”œโ”€โ”€ main
โ”‚ โ”‚ โ””โ”€โ”€ java
โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api]
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java
โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java
โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java
โ”‚ โ””โ”€โ”€ test
โ”‚ โ””โ”€โ”€ java
โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java
โ”‚ โ””โ”€โ”€ NameUtilsTest.java
โ””โ”€โ”€ foo-server [pom.xml]
โ””โ”€โ”€ src
โ””โ”€โ”€ main
โ””โ”€โ”€ java
โ””โ”€โ”€ [com.wix.foo.server]
โ””โ”€โ”€ FooServer.java
Migration 101 Bazel>>Maven >>
.
โ”œโ”€โ”€ foo-core [pom.xml]
โ”‚ โ””โ”€โ”€ src
โ”‚ โ”œโ”€โ”€ main
โ”‚ โ”‚ โ””โ”€โ”€ java
โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api]
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java
โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java
โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java
โ”‚ โ””โ”€โ”€ test
โ”‚ โ””โ”€โ”€ java
โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java
โ”‚ โ””โ”€โ”€ NameUtilsTest.java
โ””โ”€โ”€ foo-server [pom.xml]
โ””โ”€โ”€ src
โ””โ”€โ”€ main
โ””โ”€โ”€ java
โ””โ”€โ”€ [com.wix.foo.server]
โ””โ”€โ”€ FooServer.java
Migration 101 Maven Bazel>> >>
Choose
Granularity
.
โ”œโ”€โ”€ foo-core [pom.xml]
โ”‚ โ””โ”€โ”€ src
โ”‚ โ”œโ”€โ”€ main
โ”‚ โ”‚ โ””โ”€โ”€ java
โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api]
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java
โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java
โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java
โ”‚ โ””โ”€โ”€ test
โ”‚ โ””โ”€โ”€ java
โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java
โ”‚ โ””โ”€โ”€ NameUtilsTest.java
โ””โ”€โ”€ foo-server [pom.xml]
โ””โ”€โ”€ src
โ””โ”€โ”€ main
โ””โ”€โ”€ java
โ””โ”€โ”€ [com.wix.foo.server]
โ””โ”€โ”€ FooServer.java
Migration 101 Maven Bazel>> >>
Choose
Granularity
.
โ”œโ”€โ”€ foo-core [pom.xml]
โ”‚ โ””โ”€โ”€ src
โ”‚ โ”œโ”€โ”€ main
โ”‚ โ”‚ โ””โ”€โ”€ java
โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api]
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java
โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java
โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java
โ”‚ โ””โ”€โ”€ test
โ”‚ โ””โ”€โ”€ java
โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java
โ”‚ โ””โ”€โ”€ NameUtilsTest.java
โ””โ”€โ”€ foo-server [pom.xml]
โ””โ”€โ”€ src
โ””โ”€โ”€ main
โ””โ”€โ”€ java
โ””โ”€โ”€ [com.wix.foo.server]
โ””โ”€โ”€ FooServer.java
Migration 101 Maven Bazel>> >>
Choose
Granularity
.
โ”œโ”€โ”€ foo-core [pom.xml]
โ”‚ โ””โ”€โ”€ src
โ”‚ โ”œโ”€โ”€ main
โ”‚ โ”‚ โ””โ”€โ”€ java
โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api]
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java
โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java
โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java
โ”‚ โ””โ”€โ”€ test
โ”‚ โ””โ”€โ”€ java
โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java
โ”‚ โ””โ”€โ”€ NameUtilsTest.java
โ””โ”€โ”€ foo-server [pom.xml]
โ””โ”€โ”€ src
โ””โ”€โ”€ main
โ””โ”€โ”€ java
โ””โ”€โ”€ [com.wix.foo.server]
โ””โ”€โ”€ FooServer.java
Migration 101 Maven Bazel>> >>
Choose
Granularity
1:1:1 idiom - one target per
one directory, representing a
single package
.
โ”œโ”€โ”€ foo-core [pom.xml]
โ”‚ โ””โ”€โ”€ src
โ”‚ โ”œโ”€โ”€ main
โ”‚ โ”‚ โ””โ”€โ”€ java
โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api]
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java
โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java
โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java
โ”‚ โ””โ”€โ”€ test
โ”‚ โ””โ”€โ”€ java
โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java
โ”‚ โ””โ”€โ”€ NameUtilsTest.java
โ””โ”€โ”€ foo-server [pom.xml]
โ””โ”€โ”€ src
โ””โ”€โ”€ main
โ””โ”€โ”€ java
โ””โ”€โ”€ [com.wix.foo.server]
โ””โ”€โ”€ FooServer.java
Migration 101 Maven Bazel>> >>
Choose
Granularity
>>
Convert to
Bazel rules
java_library
java_library
java_test
java_image
.
โ”œโ”€โ”€ foo-core [pom.xml]
โ”‚ โ””โ”€โ”€ src
โ”‚ โ”œโ”€โ”€ main
โ”‚ โ”‚ โ””โ”€โ”€ java
โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api]
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java
โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java
โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java
โ”‚ โ””โ”€โ”€ test
โ”‚ โ””โ”€โ”€ java
โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java
โ”‚ โ””โ”€โ”€ NameUtilsTest.java
โ””โ”€โ”€ foo-server [pom.xml]
โ””โ”€โ”€ src
โ””โ”€โ”€ main
โ””โ”€โ”€ java
โ””โ”€โ”€ [com.wix.foo.server]
โ””โ”€โ”€ FooServer.java
java_library
java_library
java_test
java_binary
Migration 101 Maven Bazel>> >>
Choose
Granularity
>>
Convert to
Bazel rules
>>
internal
deps
java_library
java_library
java_test
java_image
.
โ”œโ”€โ”€ foo-core [pom.xml]
โ”‚ โ””โ”€โ”€ src
โ”‚ โ”œโ”€โ”€ main
โ”‚ โ”‚ โ””โ”€โ”€ java
โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api]
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java
โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java
โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java
โ”‚ โ””โ”€โ”€ test
โ”‚ โ””โ”€โ”€ java
โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java
โ”‚ โ””โ”€โ”€ NameUtilsTest.java
โ””โ”€โ”€ foo-server [pom.xml]
โ””โ”€โ”€ src
โ””โ”€โ”€ main
โ””โ”€โ”€ java
โ””โ”€โ”€ [com.wix.foo.server]
โ””โ”€โ”€ FooServer.java
java_library
java_library
java_test
java_binary
@junit
@jetty
@guava20
Migration 101 Maven Bazel>> >>
Choose
Granularity
>>
Convert to
Bazel rules
>>
external
deps
java_library
java_library
java_test
java_image
@guava28
.
โ”œโ”€โ”€ foo-core [pom.xml]
โ”‚ โ””โ”€โ”€ src
โ”‚ โ”œโ”€โ”€ main
โ”‚ โ”‚ โ””โ”€โ”€ java
โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api]
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java
โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java
โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java
โ”‚ โ””โ”€โ”€ test
โ”‚ โ””โ”€โ”€ java
โ”‚ โ””โ”€โ”€ [com.wix.foo.utils]
โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java
โ”‚ โ””โ”€โ”€ NameUtilsTest.java
โ””โ”€โ”€ foo-server [pom.xml]
โ””โ”€โ”€ src
โ””โ”€โ”€ main
โ””โ”€โ”€ java
โ””โ”€โ”€ [com.wix.foo.server]
โ””โ”€โ”€ FooServer.java
java_library
java_library
java_test
java_binary
@junit
@jetty
Migration 101 Maven Bazel>> >>
Choose
Granularity
>>
Convert to
Bazel rules
>>
external
deps
java_library
java_library
java_test
java_image
@guava28
. [WORKSPACE.bazel]
โ”œโ”€โ”€ foo-core [pom.xml]
โ”‚ โ””โ”€โ”€ src
โ”‚ โ”œโ”€โ”€ main
โ”‚ โ”‚ โ””โ”€โ”€ java
โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api] [BUILD.bazel]
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java
โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] [BUILD.bazel]
โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java
โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java
โ”‚ โ””โ”€โ”€ test
โ”‚ โ””โ”€โ”€ java
โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] [BUILD.bazel]
โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java
โ”‚ โ””โ”€โ”€ NameUtilsTest.java
โ””โ”€โ”€ foo-server [pom.xml]
โ””โ”€โ”€ src
โ””โ”€โ”€ main
โ””โ”€โ”€ java
โ””โ”€โ”€ [com.wix.foo.server] [BUILD.bazel]
โ””โ”€โ”€ FooServer.java
Migration 101 Maven Bazel>> >>
Choose
Granularity
>>
Convert to
Bazel rules
>>
Add
deps
>>
Write
Bazel ๏ฌles
Code graph >> Targets graph
Third party
de๏ฌnitions
>> >>
โœ“
wix/exodus
>>
Automatic tooling
is not enough
>> >>
!
bazel build
bazel test
migration
trustees
โœ– Missing compile/runtime deps
โœ– Third party alignment
โœ– Trying to read from ./src/test/resources
โœ– Tests that try to download during test runtime
โœ– More...
TECHNICAL DEBT == MORE WORK
exodus/troubleshooting
>> >> >>
?!
>>
bazel build
bazel test
Did I lose
anyting?
>> <<
Test reports Test reports
compare!
>> >> >>
?!
>>
>> >> >>
?!
>> >>
โœ“
>>
Exodus
Overrides
1 Use a migration tool
#2
Measure your system
but measure right.
2
3
4
5
1
2
3
4
1
2
3
1
2
7
0
1
0
1
WIX FRAMEWORK (2017)
Lines of code
2
5
0 7
Maven
modules
3
5
2 3
Bazel
Targets
2
5
89% reduction
Correct Build Times in Minutes
* 8-cores machine
89% reduction
Not Good
Enough
Correct Build Times in Minutes
* 8-cores machine
Push-to-deployable times per commit Stability rate
"Super-Artifact" CI Quality Board
Push-to-deployable times per commit Stability rate
"Super-Artifact" CI Quality Board
Push-to-deployable times per commit Stability rate
"Super-Artifact" CI Quality Board
1 Use a migration tool
2 Measure the system
#3
Local dev experience
donโ€™t forget your users!
CI & Console runs ๐Ÿค Build Tool
โœ– Dependency management
โœ– Code completion
โœ– Refactoring
โœ– MacOS cache issues
Developers and IDEs ๐Ÿค Build Tool
Local-dev velocity matters!
Bad CILocal dev
CIBad Local dev
โœ“ Bazel training
โœ“ IDE issues
โœ“ Develop solutions!
Think local development!
CIOkay Local dev
Wix Bazel Local dev team:
โ—‹Tooling alignment
โ—‹Dev Cache
โ—‹Wix IntelliJ Bazel Plugin
1 Use a migration tool
2 Measure the system
3 Think local dev experience
#4
Introduce a new CI pipline
but keep the old one too.
Code push
Trigger
Artifact
Deployment
backo๏ฌƒce
inform
GA/Testbed deployment
CI Pipeline
Production
Server
Code push
Trigger
Artifact
Deployment
backo๏ฌƒce
Inform
GA/Testbed Deployment
CI Pipeline
Production
Server
Replace
This part
โœ“ Remote cache and remote execution
โœ“ PR prechecks (no push to master)
โœ“ Automatic discovery of deployables
โœ“ Cloud based build server - no build queues
New Bazel CI Pipeline
Inform
Code push
Trigger
Artifact
Deployment
backo๏ฌƒce
GA/Testbed Deployment
CI Pipeline
Production
Server
Trigger
Bazel
Artifact
Bazel
Maven
โœ“
Two CI pipelines, side by side
Self-service switch
Bazel
Mavenโœ“
1 Use a migration tool
2 Measure the system
3 Think local dev experience
4 Run parallel CI pipelines
#5
Optimize for Speed
e.g., remote execution cache
How to make faster bazel builds?
โœ“ Remote cache - saves ~90% of execution
โœ“ Remote execution - improves throughput
5-8 minutes -
fully cached build
โœ“ Remote cache - saves ~90% of execution
โœ“ Remote execution - improves throughput
โœ“ Repository cache - Saves downloading http binaries
โœ“ Docker cache - Saves downloading docker images
โœ“ Remote cache - saves ~90% of execution
โœ“ Remote execution - improves throughput
โœ“ Repository cache - Saves downloading http binaries
โœ“ Docker cache - Saves downloading docker images
โœ“ Bazel ๏ฌ‚ags - builds without the bytes, multithread digest...
When we started
we compiled Bazel from sources
Bazel keeps evolving
Each release
brought a lot of value, but also
required us to adjust
Tap to important issues, in๏ฌ‚uence the priorities
Become a Bazel activist!
1 Use a migration tool
2 Measure the system
3 Think local dev experience
4 Run parallel CI pipelines
5 Optimize for speed
#6
Migrating poly repo is hard
but possible!
Bazel works well with mono repo
All code in one place
Single bazel execution
โœ“ Single CI job
It's too
much for
me!
I'm not
ready yet
Mono-repo
on Git
You
change
too much!
Mono RepoMercurial
Poly-Repo
on Git
โœ“
from 1000+ repos
...to just about 50.
Goal: Virtual mono repository
java_library(
name = "core",
srcs = [":sources"],
deps = [
"//src/main/java/com/wix/local",
"@framework//src/main/java/com/wix/external",
],
)
git_repository(
name = "framework",
url = "git@github.com:wix/framework.git",
commit = "<auto-updated>",
)
Virtual mono-repo:
Virtual Mono-Repo Service holds all
repos of wix with their latest HEAD
version
Bazel wrapper generates a local bzl ๏ฌle
with `git_repository` de๏ฌnition of all
repositories
Each WORKSPACE ๏ฌle loads the
de๏ฌnition from the generated bzl ๏ฌle.
framework(031d53ce983d26a861d053c760190de669aa458d)
users(1202d41c7dc0739deddde3176c7de34ed9b978b7)
events(ab6d1d07477e3742fbc9f9c1e81e0ec402650b1b)
external_repos.bzl
git_repository(
name = "framework",
Commit = "031d53ce983d2
)
...
WORKSPACE.bazel
1
2
3
~50 migrations
External Dependencies
Guava:25
Commons:7
Junit:3.2
wix-framework:1.0-SNAPSHOT
wix-utils:1.0.SNAPSHOT
...
External Dependencies
Guava:25
Commons:7
Junit:3.2
wix-framework:1.0-SNAPSHOT
wix-utils:1.0.SNAPSHOT
... java_library(
name = "core",
srcs = [":sources"],
deps = [
"//src/main/java/com/wix/local",
"@com_google_guava",
"@com_wix_framework",
],
)
Migration in "Isolation Mode"
โœ“ Faster move to Bazel CI
โœ“ Faster feedback
โœ“ Faster deployables
โœ– Keep Maven builds green
โœ– Reproducibility hit
โœ– Stale SNAPSHOT locally
Isolation Mode
Social Mode
java_library(
name = "core",
srcs = [":sources"],
deps = [
"//src/main/java/com/wix/local",
"@com_google_guava",
"@com_wix_framework",
],
)
scala_library(
name = "core",
srcs = [":sources"],
deps = [
"//src/main/java/com/wix/local",
"@com_google_guava",
"@framework//src/java/com/wixpress/lib",
],
)
โœ– Complex
โœ– Non-revertible
java_library(
name = "core",
srcs = [":sources"],
deps = [
"//src/main/java/com/wix/local",
"@com_google_guava",
"@com_wix_framework",
],
)
java_library(
name = "core",
srcs = [":sources"],
deps = [
"//src/main/java/com/wix/local",
"@com_google_guava",
"@framework//src/java/com/wixpress/lib",
],
)
java_library(
name = "core",
srcs = [":sources"],
deps = [
"//src/main/java/com/wix/local",
"@com_google_guava",
"@com_wix_framework",
],
)
external_binary(
name = "com_wix_framework",
artifact = "com.wix.framework:1.0-SNAPSHOT"
)
external_source(
name = "com_wix_framework",
exports = [
"@framework//src/java/com/wixpress/lib"
]
)
workspace_rule
external_binary external_source
@com_wix_framework
Current repo in
social mode?
Requested
module in
social mode?
no
no yes
yes
Social mode
โœ“ Global Third party alignment
โœ“ Missing runtime deps
โœ“ Testonly targets
โœ“ ...
1 Use a migration tool
2 Measure the system
3 Think local dev experience
4 Run parallel CI pipelines
5 Optimize for speed
6 Migrate poly-repo
Where are we now?
Safe haven
CLOSED
โœ“ No more SNAPSHOT consumption
โœ“ All deployable from bazel
โœ“ All developers use bazel only
1 Use a migration tool
2 Measure the system
3 Think local dev experience
4 Run parallel CI pipelines
5 Optimize for speed
6 Migrate poly-repo
Thank You
ors@wix.com
6 LEARNINGS FROM MIGRATING
OUR BUILD SYSTEM TO BAZEL
Q&A
ors@wix.com

More Related Content

What's hot

Ansible ๅฏฆๆˆฐ๏ผštop down ่ง€้ปž
Ansible ๅฏฆๆˆฐ๏ผštop down ่ง€้ปžAnsible ๅฏฆๆˆฐ๏ผštop down ่ง€้ปž
Ansible ๅฏฆๆˆฐ๏ผštop down ่ง€้ปžWilliam Yeh
ย 
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…] EFK Stack ์†Œ๊ฐœ์™€ ์„ค์น˜ ๋ฐฉ๋ฒ•
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…] EFK Stack ์†Œ๊ฐœ์™€ ์„ค์น˜ ๋ฐฉ๋ฒ•[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…] EFK Stack ์†Œ๊ฐœ์™€ ์„ค์น˜ ๋ฐฉ๋ฒ•
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…] EFK Stack ์†Œ๊ฐœ์™€ ์„ค์น˜ ๋ฐฉ๋ฒ•Open Source Consulting
ย 
Modern PHP Ch7 Provisioning Guide ๅฐŽ่ฎ€
Modern PHP Ch7 Provisioning Guide ๅฐŽ่ฎ€Modern PHP Ch7 Provisioning Guide ๅฐŽ่ฎ€
Modern PHP Ch7 Provisioning Guide ๅฐŽ่ฎ€Chen Cheng-Wei
ย 
PyCon US 2012 - Web Server Bottlenecks and Performance Tuning
PyCon US 2012 - Web Server Bottlenecks and Performance TuningPyCon US 2012 - Web Server Bottlenecks and Performance Tuning
PyCon US 2012 - Web Server Bottlenecks and Performance TuningGraham Dumpleton
ย 
Automated Deployments with Ansible
Automated Deployments with AnsibleAutomated Deployments with Ansible
Automated Deployments with AnsibleMartin Etmajer
ย 
Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...
Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...
Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...Puppet
ย 
Homer - Workshop at Kamailio World 2017
Homer - Workshop at Kamailio World 2017Homer - Workshop at Kamailio World 2017
Homer - Workshop at Kamailio World 2017Giacomo Vacca
ย 
modern module development - Ken Barber 2012 Edinburgh Puppet Camp
modern module development - Ken Barber 2012 Edinburgh Puppet Campmodern module development - Ken Barber 2012 Edinburgh Puppet Camp
modern module development - Ken Barber 2012 Edinburgh Puppet CampPuppet
ย 
Symfony Live NYC 2014 - Rock Solid Deployment of Symfony Apps
Symfony Live NYC 2014 -  Rock Solid Deployment of Symfony AppsSymfony Live NYC 2014 -  Rock Solid Deployment of Symfony Apps
Symfony Live NYC 2014 - Rock Solid Deployment of Symfony AppsPablo Godel
ย 
The Modern Developer Toolbox
The Modern Developer ToolboxThe Modern Developer Toolbox
The Modern Developer ToolboxPablo Godel
ย 
Puppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 EditionPuppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 EditionJoshua Thijssen
ย 
Go Faster with Ansible (PHP meetup)
Go Faster with Ansible (PHP meetup)Go Faster with Ansible (PHP meetup)
Go Faster with Ansible (PHP meetup)Richard Donkin
ย 
London devops logging
London devops loggingLondon devops logging
London devops loggingTomas Doran
ย 
Automate DBA Tasks With Ansible
Automate DBA Tasks With AnsibleAutomate DBA Tasks With Ansible
Automate DBA Tasks With AnsibleIvica Arsov
ย 
ๅฟซๅฟซๆจ‚ๆจ‚็”จHomestead
ๅฟซๅฟซๆจ‚ๆจ‚็”จHomesteadๅฟซๅฟซๆจ‚ๆจ‚็”จHomestead
ๅฟซๅฟซๆจ‚ๆจ‚็”จHomesteadChen Cheng-Wei
ย 
Ansible new paradigms for orchestration
Ansible new paradigms for orchestrationAnsible new paradigms for orchestration
Ansible new paradigms for orchestrationPaolo Tonin
ย 
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleStein Inge Morisbak
ย 
Getting started with Ansible
Getting started with AnsibleGetting started with Ansible
Getting started with AnsibleIvan Serdyuk
ย 
Taking Apache Camel For A Ride
Taking Apache Camel For A RideTaking Apache Camel For A Ride
Taking Apache Camel For A RideBruce Snyder
ย 
Mitchell Hashimoto, HashiCorp
Mitchell Hashimoto, HashiCorpMitchell Hashimoto, HashiCorp
Mitchell Hashimoto, HashiCorpOntico
ย 

What's hot (20)

Ansible ๅฏฆๆˆฐ๏ผštop down ่ง€้ปž
Ansible ๅฏฆๆˆฐ๏ผštop down ่ง€้ปžAnsible ๅฏฆๆˆฐ๏ผštop down ่ง€้ปž
Ansible ๅฏฆๆˆฐ๏ผštop down ่ง€้ปž
ย 
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…] EFK Stack ์†Œ๊ฐœ์™€ ์„ค์น˜ ๋ฐฉ๋ฒ•
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…] EFK Stack ์†Œ๊ฐœ์™€ ์„ค์น˜ ๋ฐฉ๋ฒ•[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…] EFK Stack ์†Œ๊ฐœ์™€ ์„ค์น˜ ๋ฐฉ๋ฒ•
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…] EFK Stack ์†Œ๊ฐœ์™€ ์„ค์น˜ ๋ฐฉ๋ฒ•
ย 
Modern PHP Ch7 Provisioning Guide ๅฐŽ่ฎ€
Modern PHP Ch7 Provisioning Guide ๅฐŽ่ฎ€Modern PHP Ch7 Provisioning Guide ๅฐŽ่ฎ€
Modern PHP Ch7 Provisioning Guide ๅฐŽ่ฎ€
ย 
PyCon US 2012 - Web Server Bottlenecks and Performance Tuning
PyCon US 2012 - Web Server Bottlenecks and Performance TuningPyCon US 2012 - Web Server Bottlenecks and Performance Tuning
PyCon US 2012 - Web Server Bottlenecks and Performance Tuning
ย 
Automated Deployments with Ansible
Automated Deployments with AnsibleAutomated Deployments with Ansible
Automated Deployments with Ansible
ย 
Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...
Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...
Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...
ย 
Homer - Workshop at Kamailio World 2017
Homer - Workshop at Kamailio World 2017Homer - Workshop at Kamailio World 2017
Homer - Workshop at Kamailio World 2017
ย 
modern module development - Ken Barber 2012 Edinburgh Puppet Camp
modern module development - Ken Barber 2012 Edinburgh Puppet Campmodern module development - Ken Barber 2012 Edinburgh Puppet Camp
modern module development - Ken Barber 2012 Edinburgh Puppet Camp
ย 
Symfony Live NYC 2014 - Rock Solid Deployment of Symfony Apps
Symfony Live NYC 2014 -  Rock Solid Deployment of Symfony AppsSymfony Live NYC 2014 -  Rock Solid Deployment of Symfony Apps
Symfony Live NYC 2014 - Rock Solid Deployment of Symfony Apps
ย 
The Modern Developer Toolbox
The Modern Developer ToolboxThe Modern Developer Toolbox
The Modern Developer Toolbox
ย 
Puppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 EditionPuppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 Edition
ย 
Go Faster with Ansible (PHP meetup)
Go Faster with Ansible (PHP meetup)Go Faster with Ansible (PHP meetup)
Go Faster with Ansible (PHP meetup)
ย 
London devops logging
London devops loggingLondon devops logging
London devops logging
ย 
Automate DBA Tasks With Ansible
Automate DBA Tasks With AnsibleAutomate DBA Tasks With Ansible
Automate DBA Tasks With Ansible
ย 
ๅฟซๅฟซๆจ‚ๆจ‚็”จHomestead
ๅฟซๅฟซๆจ‚ๆจ‚็”จHomesteadๅฟซๅฟซๆจ‚ๆจ‚็”จHomestead
ๅฟซๅฟซๆจ‚ๆจ‚็”จHomestead
ย 
Ansible new paradigms for orchestration
Ansible new paradigms for orchestrationAnsible new paradigms for orchestration
Ansible new paradigms for orchestration
ย 
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with Ansible
ย 
Getting started with Ansible
Getting started with AnsibleGetting started with Ansible
Getting started with Ansible
ย 
Taking Apache Camel For A Ride
Taking Apache Camel For A RideTaking Apache Camel For A Ride
Taking Apache Camel For A Ride
ย 
Mitchell Hashimoto, HashiCorp
Mitchell Hashimoto, HashiCorpMitchell Hashimoto, HashiCorp
Mitchell Hashimoto, HashiCorp
ย 

Similar to Or Shachar: 6 Learnings from Migrating a Large Codebase to Bazel

How to successfully migrate to Bazel from Maven or Gradle - JeeConf
How to successfully migrate to Bazel from Maven or Gradle - JeeConfHow to successfully migrate to Bazel from Maven or Gradle - JeeConf
How to successfully migrate to Bazel from Maven or Gradle - JeeConfNatan Silnitsky
ย 
How to successfully migrate to Bazel from Maven or Gradle - Riga Dev Days
How to successfully migrate to Bazel from Maven or Gradle - Riga Dev DaysHow to successfully migrate to Bazel from Maven or Gradle - Riga Dev Days
How to successfully migrate to Bazel from Maven or Gradle - Riga Dev DaysNatan Silnitsky
ย 
Continuous Integration Testing in Django
Continuous Integration Testing in DjangoContinuous Integration Testing in Django
Continuous Integration Testing in DjangoKevin Harvey
ย 
maven
mavenmaven
mavenakd11
ย 
Cloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh VariaCloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh VariaAmazon Web Services
ย 
Building a Large Java Codebase with Bazel - Natan Silnitsky
Building a Large Java Codebase with Bazel - Natan Silnitsky Building a Large Java Codebase with Bazel - Natan Silnitsky
Building a Large Java Codebase with Bazel - Natan Silnitsky Wix Engineering
ย 
A Fabric/Puppet Build/Deploy System
A Fabric/Puppet Build/Deploy SystemA Fabric/Puppet Build/Deploy System
A Fabric/Puppet Build/Deploy Systemadrian_nye
ย 
Towards Continuous Deployment with Django
Towards Continuous Deployment with DjangoTowards Continuous Deployment with Django
Towards Continuous Deployment with DjangoRoger Barnes
ย 
Docker presentasjon java bin
Docker presentasjon java binDocker presentasjon java bin
Docker presentasjon java binOlve Hansen
ย 
Deployment with Fabric
Deployment with FabricDeployment with Fabric
Deployment with Fabricandymccurdy
ย 
Java Builds with Maven and Ant
Java Builds with Maven and AntJava Builds with Maven and Ant
Java Builds with Maven and AntDavid Noble
ย 
Docker for Java developers at JavaLand
Docker for Java developers at JavaLandDocker for Java developers at JavaLand
Docker for Java developers at JavaLandJohan Janssen
ย 
Building JBoss AS 7 for Fedora
Building JBoss AS 7 for FedoraBuilding JBoss AS 7 for Fedora
Building JBoss AS 7 for Fedorawolfc71
ย 
Continuous Integration with Fabric
Continuous Integration with FabricContinuous Integration with Fabric
Continuous Integration with FabricVarun Batra
ย 
Autoscaling OpenStack Natively with Heat, Ceilometer and LBaaS
Autoscaling OpenStack Natively with Heat, Ceilometer and LBaaSAutoscaling OpenStack Natively with Heat, Ceilometer and LBaaS
Autoscaling OpenStack Natively with Heat, Ceilometer and LBaaSShixiong Shang
ย 
Retrofitting Continuous Delivery
Retrofitting Continuous Delivery Retrofitting Continuous Delivery
Retrofitting Continuous Delivery Alan Norton
ย 
Continous Delivering a PHP application
Continous Delivering a PHP applicationContinous Delivering a PHP application
Continous Delivering a PHP applicationJavier Lรณpez
ย 
WordPress Development Environments
WordPress Development Environments WordPress Development Environments
WordPress Development Environments Ohad Raz
ย 
Antons Kranga Building Agile Infrastructures
Antons Kranga   Building Agile InfrastructuresAntons Kranga   Building Agile Infrastructures
Antons Kranga Building Agile InfrastructuresAntons Kranga
ย 
One commit, one release. Continuously delivering a Symfony project.
One commit, one release. Continuously delivering a Symfony project.One commit, one release. Continuously delivering a Symfony project.
One commit, one release. Continuously delivering a Symfony project.Javier Lรณpez
ย 

Similar to Or Shachar: 6 Learnings from Migrating a Large Codebase to Bazel (20)

How to successfully migrate to Bazel from Maven or Gradle - JeeConf
How to successfully migrate to Bazel from Maven or Gradle - JeeConfHow to successfully migrate to Bazel from Maven or Gradle - JeeConf
How to successfully migrate to Bazel from Maven or Gradle - JeeConf
ย 
How to successfully migrate to Bazel from Maven or Gradle - Riga Dev Days
How to successfully migrate to Bazel from Maven or Gradle - Riga Dev DaysHow to successfully migrate to Bazel from Maven or Gradle - Riga Dev Days
How to successfully migrate to Bazel from Maven or Gradle - Riga Dev Days
ย 
Continuous Integration Testing in Django
Continuous Integration Testing in DjangoContinuous Integration Testing in Django
Continuous Integration Testing in Django
ย 
maven
mavenmaven
maven
ย 
Cloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh VariaCloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
ย 
Building a Large Java Codebase with Bazel - Natan Silnitsky
Building a Large Java Codebase with Bazel - Natan Silnitsky Building a Large Java Codebase with Bazel - Natan Silnitsky
Building a Large Java Codebase with Bazel - Natan Silnitsky
ย 
A Fabric/Puppet Build/Deploy System
A Fabric/Puppet Build/Deploy SystemA Fabric/Puppet Build/Deploy System
A Fabric/Puppet Build/Deploy System
ย 
Towards Continuous Deployment with Django
Towards Continuous Deployment with DjangoTowards Continuous Deployment with Django
Towards Continuous Deployment with Django
ย 
Docker presentasjon java bin
Docker presentasjon java binDocker presentasjon java bin
Docker presentasjon java bin
ย 
Deployment with Fabric
Deployment with FabricDeployment with Fabric
Deployment with Fabric
ย 
Java Builds with Maven and Ant
Java Builds with Maven and AntJava Builds with Maven and Ant
Java Builds with Maven and Ant
ย 
Docker for Java developers at JavaLand
Docker for Java developers at JavaLandDocker for Java developers at JavaLand
Docker for Java developers at JavaLand
ย 
Building JBoss AS 7 for Fedora
Building JBoss AS 7 for FedoraBuilding JBoss AS 7 for Fedora
Building JBoss AS 7 for Fedora
ย 
Continuous Integration with Fabric
Continuous Integration with FabricContinuous Integration with Fabric
Continuous Integration with Fabric
ย 
Autoscaling OpenStack Natively with Heat, Ceilometer and LBaaS
Autoscaling OpenStack Natively with Heat, Ceilometer and LBaaSAutoscaling OpenStack Natively with Heat, Ceilometer and LBaaS
Autoscaling OpenStack Natively with Heat, Ceilometer and LBaaS
ย 
Retrofitting Continuous Delivery
Retrofitting Continuous Delivery Retrofitting Continuous Delivery
Retrofitting Continuous Delivery
ย 
Continous Delivering a PHP application
Continous Delivering a PHP applicationContinous Delivering a PHP application
Continous Delivering a PHP application
ย 
WordPress Development Environments
WordPress Development Environments WordPress Development Environments
WordPress Development Environments
ย 
Antons Kranga Building Agile Infrastructures
Antons Kranga   Building Agile InfrastructuresAntons Kranga   Building Agile Infrastructures
Antons Kranga Building Agile Infrastructures
ย 
One commit, one release. Continuously delivering a Symfony project.
One commit, one release. Continuously delivering a Symfony project.One commit, one release. Continuously delivering a Symfony project.
One commit, one release. Continuously delivering a Symfony project.
ย 

Recently uploaded

Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
ย 
cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningVitsRangannavar
ย 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
ย 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptkotipi9215
ย 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
ย 
(Genuine) Escort Service Lucknow | Starting โ‚น,5K To @25k with A/C ๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿป 89...
(Genuine) Escort Service Lucknow | Starting โ‚น,5K To @25k with A/C ๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿป 89...(Genuine) Escort Service Lucknow | Starting โ‚น,5K To @25k with A/C ๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿป 89...
(Genuine) Escort Service Lucknow | Starting โ‚น,5K To @25k with A/C ๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿป 89...gurkirankumar98700
ย 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
ย 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
ย 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
ย 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number SystemsJheuzeDellosa
ย 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
ย 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
ย 
XpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsXpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsMehedi Hasan Shohan
ย 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
ย 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...Christina Lin
ย 
Call Girls in Naraina Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”
Call Girls in Naraina Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”Call Girls in Naraina Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”
Call Girls in Naraina Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”soniya singh
ย 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
ย 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
ย 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
ย 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
ย 

Recently uploaded (20)

Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
ย 
cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learning
ย 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
ย 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.ppt
ย 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
ย 
(Genuine) Escort Service Lucknow | Starting โ‚น,5K To @25k with A/C ๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿป 89...
(Genuine) Escort Service Lucknow | Starting โ‚น,5K To @25k with A/C ๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿป 89...(Genuine) Escort Service Lucknow | Starting โ‚น,5K To @25k with A/C ๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿป 89...
(Genuine) Escort Service Lucknow | Starting โ‚น,5K To @25k with A/C ๐Ÿง‘๐Ÿฝโ€โค๏ธโ€๐Ÿง‘๐Ÿป 89...
ย 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
ย 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
ย 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
ย 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number Systems
ย 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
ย 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
ย 
XpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsXpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software Solutions
ย 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
ย 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ย 
Call Girls in Naraina Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”
Call Girls in Naraina Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”Call Girls in Naraina Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”
Call Girls in Naraina Delhi ๐Ÿ’ฏCall Us ๐Ÿ”8264348440๐Ÿ”
ย 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
ย 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
ย 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
ย 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
ย 

Or Shachar: 6 Learnings from Migrating a Large Codebase to Bazel

  • 1. Or Shachar, Backend Engineer, Wix-CI Migrating to a Bazel-based CI system: 6 learnings ors@wix.com linkedin/or-shachar github.com/or-shachar
  • 2. Check emailCoffee break Ping pong Reading news CAll your mom <Pending mode>
  • 3. Check emailCoffee break Ping pong Reading news CAll your mom Building...
  • 4. Hi, I'm Or. CI Build with Ant and Make๏ฌles Maven CI Pipelines Backend Engineering โ€ฆ Backend Engineering for2017 2011 2014 2019
  • 6. Codebase + build de๏ฌnition Build server feedback Build tool deployables
  • 7. ~5M LOC > 1000 repos 2000+ Maven modules 2017 Teamcity Maven feedback deployables
  • 8. ~5M LOC > 1000 repos 2000+ Maven modules 2017 Teamcity Maven feedback deployables building / broken blockedblocked blocked blocked
  • 9. 2017 Master stability Push to feedback Push to release Often broken Can take 1 hour Can take hours
  • 11. Find new machinery thatโ€™s stable, fast, and can scale.
  • 12. Master stability Push to feedback Push to release 2019 Often broken Can take 1 hour Can take hours 2017 Master stability Push to feedback Push to release Mostly stable 5-10 minutes 15-25 minutes
  • 14. #1 Use a Migration tool Massage it, validate it.
  • 16. . โ”œโ”€โ”€ foo-core [pom.xml] โ”‚ โ””โ”€โ”€ src โ”‚ โ”œโ”€โ”€ main โ”‚ โ”‚ โ””โ”€โ”€ java โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api] โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java โ”‚ โ””โ”€โ”€ test โ”‚ โ””โ”€โ”€ java โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java โ”‚ โ””โ”€โ”€ NameUtilsTest.java โ””โ”€โ”€ foo-server [pom.xml] โ””โ”€โ”€ src โ””โ”€โ”€ main โ””โ”€โ”€ java โ””โ”€โ”€ [com.wix.foo.server] โ””โ”€โ”€ FooServer.java Migration 101 Bazel>>Maven >>
  • 17. . โ”œโ”€โ”€ foo-core [pom.xml] โ”‚ โ””โ”€โ”€ src โ”‚ โ”œโ”€โ”€ main โ”‚ โ”‚ โ””โ”€โ”€ java โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api] โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java โ”‚ โ””โ”€โ”€ test โ”‚ โ””โ”€โ”€ java โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java โ”‚ โ””โ”€โ”€ NameUtilsTest.java โ””โ”€โ”€ foo-server [pom.xml] โ””โ”€โ”€ src โ””โ”€โ”€ main โ””โ”€โ”€ java โ””โ”€โ”€ [com.wix.foo.server] โ””โ”€โ”€ FooServer.java Migration 101 Maven Bazel>> >> Choose Granularity
  • 18. . โ”œโ”€โ”€ foo-core [pom.xml] โ”‚ โ””โ”€โ”€ src โ”‚ โ”œโ”€โ”€ main โ”‚ โ”‚ โ””โ”€โ”€ java โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api] โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java โ”‚ โ””โ”€โ”€ test โ”‚ โ””โ”€โ”€ java โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java โ”‚ โ””โ”€โ”€ NameUtilsTest.java โ””โ”€โ”€ foo-server [pom.xml] โ””โ”€โ”€ src โ””โ”€โ”€ main โ””โ”€โ”€ java โ””โ”€โ”€ [com.wix.foo.server] โ””โ”€โ”€ FooServer.java Migration 101 Maven Bazel>> >> Choose Granularity
  • 19. . โ”œโ”€โ”€ foo-core [pom.xml] โ”‚ โ””โ”€โ”€ src โ”‚ โ”œโ”€โ”€ main โ”‚ โ”‚ โ””โ”€โ”€ java โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api] โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java โ”‚ โ””โ”€โ”€ test โ”‚ โ””โ”€โ”€ java โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java โ”‚ โ””โ”€โ”€ NameUtilsTest.java โ””โ”€โ”€ foo-server [pom.xml] โ””โ”€โ”€ src โ””โ”€โ”€ main โ””โ”€โ”€ java โ””โ”€โ”€ [com.wix.foo.server] โ””โ”€โ”€ FooServer.java Migration 101 Maven Bazel>> >> Choose Granularity
  • 20. . โ”œโ”€โ”€ foo-core [pom.xml] โ”‚ โ””โ”€โ”€ src โ”‚ โ”œโ”€โ”€ main โ”‚ โ”‚ โ””โ”€โ”€ java โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api] โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java โ”‚ โ””โ”€โ”€ test โ”‚ โ””โ”€โ”€ java โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java โ”‚ โ””โ”€โ”€ NameUtilsTest.java โ””โ”€โ”€ foo-server [pom.xml] โ””โ”€โ”€ src โ””โ”€โ”€ main โ””โ”€โ”€ java โ””โ”€โ”€ [com.wix.foo.server] โ””โ”€โ”€ FooServer.java Migration 101 Maven Bazel>> >> Choose Granularity 1:1:1 idiom - one target per one directory, representing a single package
  • 21. . โ”œโ”€โ”€ foo-core [pom.xml] โ”‚ โ””โ”€โ”€ src โ”‚ โ”œโ”€โ”€ main โ”‚ โ”‚ โ””โ”€โ”€ java โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api] โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java โ”‚ โ””โ”€โ”€ test โ”‚ โ””โ”€โ”€ java โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java โ”‚ โ””โ”€โ”€ NameUtilsTest.java โ””โ”€โ”€ foo-server [pom.xml] โ””โ”€โ”€ src โ””โ”€โ”€ main โ””โ”€โ”€ java โ””โ”€โ”€ [com.wix.foo.server] โ””โ”€โ”€ FooServer.java Migration 101 Maven Bazel>> >> Choose Granularity >> Convert to Bazel rules java_library java_library java_test java_image
  • 22. . โ”œโ”€โ”€ foo-core [pom.xml] โ”‚ โ””โ”€โ”€ src โ”‚ โ”œโ”€โ”€ main โ”‚ โ”‚ โ””โ”€โ”€ java โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api] โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java โ”‚ โ””โ”€โ”€ test โ”‚ โ””โ”€โ”€ java โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java โ”‚ โ””โ”€โ”€ NameUtilsTest.java โ””โ”€โ”€ foo-server [pom.xml] โ””โ”€โ”€ src โ””โ”€โ”€ main โ””โ”€โ”€ java โ””โ”€โ”€ [com.wix.foo.server] โ””โ”€โ”€ FooServer.java java_library java_library java_test java_binary Migration 101 Maven Bazel>> >> Choose Granularity >> Convert to Bazel rules >> internal deps java_library java_library java_test java_image
  • 23. . โ”œโ”€โ”€ foo-core [pom.xml] โ”‚ โ””โ”€โ”€ src โ”‚ โ”œโ”€โ”€ main โ”‚ โ”‚ โ””โ”€โ”€ java โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api] โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java โ”‚ โ””โ”€โ”€ test โ”‚ โ””โ”€โ”€ java โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java โ”‚ โ””โ”€โ”€ NameUtilsTest.java โ””โ”€โ”€ foo-server [pom.xml] โ””โ”€โ”€ src โ””โ”€โ”€ main โ””โ”€โ”€ java โ””โ”€โ”€ [com.wix.foo.server] โ””โ”€โ”€ FooServer.java java_library java_library java_test java_binary @junit @jetty @guava20 Migration 101 Maven Bazel>> >> Choose Granularity >> Convert to Bazel rules >> external deps java_library java_library java_test java_image @guava28
  • 24. . โ”œโ”€โ”€ foo-core [pom.xml] โ”‚ โ””โ”€โ”€ src โ”‚ โ”œโ”€โ”€ main โ”‚ โ”‚ โ””โ”€โ”€ java โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api] โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java โ”‚ โ””โ”€โ”€ test โ”‚ โ””โ”€โ”€ java โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java โ”‚ โ””โ”€โ”€ NameUtilsTest.java โ””โ”€โ”€ foo-server [pom.xml] โ””โ”€โ”€ src โ””โ”€โ”€ main โ””โ”€โ”€ java โ””โ”€โ”€ [com.wix.foo.server] โ””โ”€โ”€ FooServer.java java_library java_library java_test java_binary @junit @jetty Migration 101 Maven Bazel>> >> Choose Granularity >> Convert to Bazel rules >> external deps java_library java_library java_test java_image @guava28
  • 25. . [WORKSPACE.bazel] โ”œโ”€โ”€ foo-core [pom.xml] โ”‚ โ””โ”€โ”€ src โ”‚ โ”œโ”€โ”€ main โ”‚ โ”‚ โ””โ”€โ”€ java โ”‚ โ”‚ โ”œโ”€โ”€ [com.wix.foo.api] [BUILD.bazel] โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ FooBar.java โ”‚ โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] [BUILD.bazel] โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.java โ”‚ โ”‚ โ””โ”€โ”€ NameUtils.java โ”‚ โ””โ”€โ”€ test โ”‚ โ””โ”€โ”€ java โ”‚ โ””โ”€โ”€ [com.wix.foo.utils] [BUILD.bazel] โ”‚ โ”œโ”€โ”€ TimeUtilsTest.java โ”‚ โ””โ”€โ”€ NameUtilsTest.java โ””โ”€โ”€ foo-server [pom.xml] โ””โ”€โ”€ src โ””โ”€โ”€ main โ””โ”€โ”€ java โ””โ”€โ”€ [com.wix.foo.server] [BUILD.bazel] โ””โ”€โ”€ FooServer.java Migration 101 Maven Bazel>> >> Choose Granularity >> Convert to Bazel rules >> Add deps >> Write Bazel ๏ฌles
  • 26.
  • 27. Code graph >> Targets graph Third party de๏ฌnitions >> >> โœ“ wix/exodus >>
  • 28. Automatic tooling is not enough >> >> ! bazel build bazel test migration trustees
  • 29. โœ– Missing compile/runtime deps โœ– Third party alignment โœ– Trying to read from ./src/test/resources โœ– Tests that try to download during test runtime โœ– More... TECHNICAL DEBT == MORE WORK exodus/troubleshooting
  • 30. >> >> >> ?! >> bazel build bazel test Did I lose anyting?
  • 31. >> << Test reports Test reports compare! >> >> >> ?! >>
  • 32. >> >> >> ?! >> >> โœ“ >> Exodus Overrides
  • 33. 1 Use a migration tool
  • 34. #2 Measure your system but measure right.
  • 35. 2 3 4 5 1 2 3 4 1 2 3 1 2 7 0 1 0 1 WIX FRAMEWORK (2017) Lines of code 2 5 0 7 Maven modules 3 5 2 3 Bazel Targets 2 5
  • 36. 89% reduction Correct Build Times in Minutes * 8-cores machine
  • 37. 89% reduction Not Good Enough Correct Build Times in Minutes * 8-cores machine
  • 38. Push-to-deployable times per commit Stability rate "Super-Artifact" CI Quality Board
  • 39. Push-to-deployable times per commit Stability rate "Super-Artifact" CI Quality Board
  • 40. Push-to-deployable times per commit Stability rate "Super-Artifact" CI Quality Board
  • 41. 1 Use a migration tool 2 Measure the system
  • 43. CI & Console runs ๐Ÿค Build Tool
  • 44. โœ– Dependency management โœ– Code completion โœ– Refactoring โœ– MacOS cache issues Developers and IDEs ๐Ÿค Build Tool
  • 45. Local-dev velocity matters! Bad CILocal dev CIBad Local dev
  • 46. โœ“ Bazel training โœ“ IDE issues โœ“ Develop solutions! Think local development! CIOkay Local dev Wix Bazel Local dev team: โ—‹Tooling alignment โ—‹Dev Cache โ—‹Wix IntelliJ Bazel Plugin
  • 47. 1 Use a migration tool 2 Measure the system 3 Think local dev experience
  • 48. #4 Introduce a new CI pipline but keep the old one too.
  • 51. โœ“ Remote cache and remote execution โœ“ PR prechecks (no push to master) โœ“ Automatic discovery of deployables โœ“ Cloud based build server - no build queues New Bazel CI Pipeline
  • 53. Bazel Maven โœ“ Two CI pipelines, side by side Self-service switch Bazel Mavenโœ“
  • 54. 1 Use a migration tool 2 Measure the system 3 Think local dev experience 4 Run parallel CI pipelines
  • 55. #5 Optimize for Speed e.g., remote execution cache
  • 56. How to make faster bazel builds?
  • 57. โœ“ Remote cache - saves ~90% of execution โœ“ Remote execution - improves throughput 5-8 minutes - fully cached build
  • 58. โœ“ Remote cache - saves ~90% of execution โœ“ Remote execution - improves throughput โœ“ Repository cache - Saves downloading http binaries โœ“ Docker cache - Saves downloading docker images
  • 59. โœ“ Remote cache - saves ~90% of execution โœ“ Remote execution - improves throughput โœ“ Repository cache - Saves downloading http binaries โœ“ Docker cache - Saves downloading docker images โœ“ Bazel ๏ฌ‚ags - builds without the bytes, multithread digest...
  • 60. When we started we compiled Bazel from sources Bazel keeps evolving Each release brought a lot of value, but also required us to adjust Tap to important issues, in๏ฌ‚uence the priorities Become a Bazel activist!
  • 61. 1 Use a migration tool 2 Measure the system 3 Think local dev experience 4 Run parallel CI pipelines 5 Optimize for speed
  • 62. #6 Migrating poly repo is hard but possible!
  • 63. Bazel works well with mono repo All code in one place Single bazel execution โœ“ Single CI job
  • 64. It's too much for me! I'm not ready yet Mono-repo on Git You change too much! Mono RepoMercurial Poly-Repo on Git โœ“
  • 65. from 1000+ repos ...to just about 50.
  • 66. Goal: Virtual mono repository java_library( name = "core", srcs = [":sources"], deps = [ "//src/main/java/com/wix/local", "@framework//src/main/java/com/wix/external", ], ) git_repository( name = "framework", url = "git@github.com:wix/framework.git", commit = "<auto-updated>", )
  • 67. Virtual mono-repo: Virtual Mono-Repo Service holds all repos of wix with their latest HEAD version Bazel wrapper generates a local bzl ๏ฌle with `git_repository` de๏ฌnition of all repositories Each WORKSPACE ๏ฌle loads the de๏ฌnition from the generated bzl ๏ฌle. framework(031d53ce983d26a861d053c760190de669aa458d) users(1202d41c7dc0739deddde3176c7de34ed9b978b7) events(ab6d1d07477e3742fbc9f9c1e81e0ec402650b1b) external_repos.bzl git_repository( name = "framework", Commit = "031d53ce983d2 ) ... WORKSPACE.bazel 1 2 3
  • 70. External Dependencies Guava:25 Commons:7 Junit:3.2 wix-framework:1.0-SNAPSHOT wix-utils:1.0.SNAPSHOT ... java_library( name = "core", srcs = [":sources"], deps = [ "//src/main/java/com/wix/local", "@com_google_guava", "@com_wix_framework", ], )
  • 71. Migration in "Isolation Mode" โœ“ Faster move to Bazel CI โœ“ Faster feedback โœ“ Faster deployables โœ– Keep Maven builds green โœ– Reproducibility hit โœ– Stale SNAPSHOT locally
  • 72. Isolation Mode Social Mode java_library( name = "core", srcs = [":sources"], deps = [ "//src/main/java/com/wix/local", "@com_google_guava", "@com_wix_framework", ], ) scala_library( name = "core", srcs = [":sources"], deps = [ "//src/main/java/com/wix/local", "@com_google_guava", "@framework//src/java/com/wixpress/lib", ], )
  • 73. โœ– Complex โœ– Non-revertible java_library( name = "core", srcs = [":sources"], deps = [ "//src/main/java/com/wix/local", "@com_google_guava", "@com_wix_framework", ], ) java_library( name = "core", srcs = [":sources"], deps = [ "//src/main/java/com/wix/local", "@com_google_guava", "@framework//src/java/com/wixpress/lib", ], )
  • 74. java_library( name = "core", srcs = [":sources"], deps = [ "//src/main/java/com/wix/local", "@com_google_guava", "@com_wix_framework", ], ) external_binary( name = "com_wix_framework", artifact = "com.wix.framework:1.0-SNAPSHOT" ) external_source( name = "com_wix_framework", exports = [ "@framework//src/java/com/wixpress/lib" ] ) workspace_rule
  • 75. external_binary external_source @com_wix_framework Current repo in social mode? Requested module in social mode? no no yes yes
  • 76. Social mode โœ“ Global Third party alignment โœ“ Missing runtime deps โœ“ Testonly targets โœ“ ...
  • 77. 1 Use a migration tool 2 Measure the system 3 Think local dev experience 4 Run parallel CI pipelines 5 Optimize for speed 6 Migrate poly-repo
  • 78. Where are we now?
  • 79. Safe haven CLOSED โœ“ No more SNAPSHOT consumption โœ“ All deployable from bazel โœ“ All developers use bazel only
  • 80. 1 Use a migration tool 2 Measure the system 3 Think local dev experience 4 Run parallel CI pipelines 5 Optimize for speed 6 Migrate poly-repo
  • 81. Thank You ors@wix.com 6 LEARNINGS FROM MIGRATING OUR BUILD SYSTEM TO BAZEL