I like the idea of going back to a single repo for core db features. I would like Fauxton to still be in its own repo. As someone who wrote some very basic erlang code for CouchDB recently. I found the multiple repos quite tricky to manage and I couldn't see how it made anything easier.
On Wed, Apr 13, 2016 at 8:35 AM, Alexander Shorin <[email protected]> wrote: > Hi Robert, > > Point about flattening to a single repository is valid: in the end, we > have our apps repos in broken state all the time as they are not > declare their decencies. So noone can pick fabric@master and run it - > he'll spend quite a lot of time to figure the deps of the right > versions. But the idea to solve the problem by reducing set of > repositories we have to test is good. > > > Hi Iliya, > > I have alternative solution for you: > > - Turn-off Travis CI everywhere where we cannot be sure about testing > without depended PRs (all except third-party modules, fauxton, docs, > and few more independent projects like couch-epi); > - Require everyone to submit additional PR to apache/couchdb repo with > commit hashes update; > - On this apache/couchdb PR we'll run CI testing; > - If you rebase/update any of your subcomponent PRs you must update > commit hash on apache/couchdb one; > > Pros: > - We won't forget to update rebar.config when new changes lands; > - We will always run complete integration testing with all the right > deps states; > - We won't have to invent any complicated integration solutions to > deal with sub-repos testing; > - No new new steps/files/work introduced, so there is no need to care > about learning curve; > > Cons: > - Need to be a bit tricky on Travis builder to realize on which remote > (fork) new rebar.config hashes are to correctly checkout them, though > that is not a rocket science since we have access to git information > there. > > The Jenkins CI role here is to ensure that we have master build right > and releases build right, on the various OSes. > > Sounds simpler and better for me, how it does for you? > > -- > ,,,^..^,,, > > > On Wed, Apr 13, 2016 at 12:37 AM, Robert Samuel Newson > <[email protected]> wrote: > > I'd like us to instead consider flattening to a single repository. I've > found no value and only pain from the multiple repositories approach (43 in > total!). > > > > The contention is that multiple repositories enforces application > boundaries (low coupling / high cohesion) but I've not felt that in > reality. We don't, and couldn't meaningfully, release any of our components > separately, and, as Ilya makes clear, many enhancements require changes to > multiple repositories, and we break this into multiple commits, losing the > ability to look at an enhancement in toto. > > > > If what Ilya is proposing is the solution, I think it's the solution to > a problem we should not have. > > > > B. > > > >> On 12 Apr 2016, at 16:22, Ilya Khlopotov <[email protected]> wrote: > >> > >> > >> > >> Dear community, > >> > >> > >> There is a problem with contributors workflow which renders our CI > system > >> useless. As you might know couchdb project consists of multiple > >> repositories. Most of the time changes cross the repositories > boundaries. > >> When this happens the push to any of the repositories causes CI > failures. > >> CI fails since it uses the old version of dependencies from main > repository > >> of the project. Here is what we can do about it. > >> > >> # Proposal > >> > >> Let's use multiple files for dependency management. > >> > >> - deps.json - serves the same purpose as dependencies list from current > >> rebar.config.script > >> - proposed.deps.json - here we specify list of PRs we want to commit > >> atomically > >> - override.deps.json - local file outside of version control which we > >> consult in order to include development tools specific to contributor > (code > >> reloader, debugger, tracer, profiler, binpp, ...) > >> > >> Bellow is the example of a content of these files: > >> > >> ## deps.json > >> { > >> "src/b64url": [ > >> "https://github.com/apache/couchdb-b64url", > >> "6895652d80f95cdf04efb14625abed868998f174" > >> ], > >> "src/cassim": [ > >> "https://github.com/apache/couchdb-cassim", > >> "9bbfe82125284fa7cb3317079e8bc1dc876a07bf" > >> ], > >> "src/chttpd": [ > >> "https://github.com/apache/couchdb-chttpd", > >> "54e8f6147486d9afc5245e0143d15a4dd1185654" > >> ], > >> "src/meck": [ > >> "https://github.com/apache/couchdb-meck", > >> "tree/0.8.2" > >> ], > >> .... > >> } > >> > >> ## proposed.deps.json > >> { > >> "src/couch": "https://github.com/apache/couchdb-couch/pull/124", > >> "src/chttpd": "https://github.com/apache/couchdb-chttpd/pull/108" > >> "src/couch_tests": [ > >> "https://github.com/apache/couchdb-erlang-tests", > >> "tree/branch" > >> ], > >> } > >> > >> # Interface > >> > >> I propose to write a simple CLI tool to work with this structure. > Bellow is > >> a list of commands which we need to support (for minimal version) > >> > >> ## Adding new dependency > >> > >> git propose add https://github.com/apache/couchdb-foo > >> a2d5ad2eedc960248b806f61df0a1009462bdb46 > >> git propose add https://github.com/apache/couchdb-bar tree/branch_name > >> > >> ## Adding new PR to the change set > >> > >> git propose add https://github.com/apache/couchdb-config/pull/4 > >> > >> ## Checking out right dependencies > >> > >> git propose checkout > >> > >> ## Checking out release > >> > >> git propose checkout --release # this would ignore proposed.deps.json > if it > >> exists > >> > >> ## Merge the change > >> > >> This command would do the following: > >> - Parse proposed.deps.json > >> - Retrieve merge commit sha for every PR (exit if dependency is not > merged > >> yet) > >> - Update dependencies in deps.json with correct merge commit sha > >> - remove proposed.deps.json > >> > >> # Workflow > >> > >> export GIT_EXEC_PATH=`pwd`/bin # or use tools like `direnv` > >> git checkout -b feature-ZZZ > >> cd src/X && hack dependency X > >> cd ../.. > >> cd src/Y && hack dependency Y > >> issue PRs for X and Y > >> cd ../.. > >> git propose add https://github.com/apache/couchdb-X/pull/4 > >> git propose add https://github.com/apache/couchdb-Y/pull/49 > >> git add proposed.deps.json > >> git commit -m "Commit feature {something} which does {a thing} and can > be > >> tested as {procedure}" > >> git push origin feature-ZZZ > >> ^ this would trigger our CI > >> CI would do > >> git propose checkout && ./configure && make check > >> > >> # Pros and Cons > >> > >> ## Pros > >> > >> - Changes are merged atomically > >> - CI runs against expected versions of deps > >> - Enables git bisect > >> - Reduce tasks that needs to be done by ASF committer (no need to update > >> rebar.config.script manually) > >> - Simplifies testing of PRs by reviewers > >> - Simplifies rebar.config since rebar is not used for managing deps > >> > >> ## Cons > >> > >> - some github.com specifics (concept of PRs and access to github API > to get > >> info about PR) > >> - we need to have github.com as one of the remotes > >> - we trigger CI only on push to main repository > >> > >> # Implementation > >> > >> We write a git-propose script in python and place it in ./bin. We add > ./bin > >> into either GIT_EXEC_PATH or PATH. You always can call the script > directly > >> (as ./bin/git-propose) if you don't like amending > >> your environment. > >> > >> # Later improvements > >> > >> - We can issue PRs from the tool itself > >> - We can merge from the tool itself > >> - We can implement support for multiple remotes (asf, github, private) > >> - We can implement support for multiple git transports (for the first > >> version all repositories in *.deps.json files would use https://) > >> > >> Sincerely, > >> ILYA KHLOPOTOV > > >
