I am afraid that until we have a Jenkins driven Windows CI we wouldn't be able to modernize any of the build or release plumbing.
Best regards, iilyak On 2019/08/20 12:28:12, Garren Smith <gar...@apache.org> wrote: > I'm a big +1 on this. Initially, I know we would have some teething issues > getting this working. But I don't think we can stay on rebar2 forever > either. Adding in erlang dependancies is becoming increasingly more > difficult as they expect rebar3. > > Cheers > Garren > > On Fri, Aug 16, 2019 at 2:02 PM Ilya Khlopotov <iil...@apache.org> wrote: > > > > > > > On 2019/08/15 18:51:29, Joan Touzet <woh...@apache.org> wrote: > > > Hi Ilya, > > > > > > > > > On 2019-08-15 10:09, Ilya Khlopotov wrote: > > > > Hello, > > > > > > > > There is an https://github.com/apache/couchdb/issues/1428 issue about > > migrating to rebar3 or mix. I did an experiment to switch from rebar into > > mix and wanted to share the results. The code for experiment is here > > https://github.com/apache/couchdb/compare/master...cloudant:switch-to-mix. > > Overall I am happy with the experiment. > > > > > > > > # Requirements > > > > > > > > 1. Should be able to compile dependencies which use either rebar or > > rebar3 > > > > 2. Should be able to lock dependencies to specific versions using > > references to commits > > > > 3. Should be able to call eunit test suite > > > > 4. Should be able to compile NIFs > > > > 5. Should be easy to install plugins > > > > 6. Should support dialyzer > > > > 7. Should support release managers > > > > 8. Support for raw dependencies > > > > 9. Produce source tarball suitable for offline compilation (ASF > > requirement) > > > > > > > > # How mix supports the requirements > > > > > > > > 1. Mix is able to figure out which build tool to use. There is also a > > possibility to specify build tool individually for a given dependency. > > > > `manager: mix | rebar | rebar3 | make`. There is also support for > > calling arbitrary shell command configured via `compile: <command>`. The > > manual step is required to install the needed tools `mix local.rebar > > --force`. > > > > However there are means to automate that step (we can use Makefile > > or define a `bootstrap` mix alias ) > > > > 2. Dependencies are locked via `mix.lock` file. > > > > > > I don't have any strong opinions one way or the other, but I did see > > > Garren asking about 'hex' instead of / in conjunction with 'mix' for > > > dependency management. Is this effort combined with his or independent? > > > I don't know the tools well enough. > > > > mix works very well with hex > > > > > > > > > 3. Eunit is supported via one of the mix plugins. Both plugins are > > very old but it should be easy to write our own (32 lines of code). > > > > - https://github.com/dantswain/mix_eunit > > > > - https://github.com/talentdeficit/mixunit > > > > 4. NIFs can be compiled using one of the following approaches: > > > > - specify `rebar` as build manager for a dependency (easiest) > > > > > > Are you considering staying with rebar2 here, or moving to rebar(3)? It > > > would be nice not to have to keep supporting (and shipping!) our fork of > > > rebar2. > > I considered to stay with rebar2 for first iteration. Could you remind me > > why we are forking rebar? > > I did check that our version has no differences from upstream. > > git remote -v > > origin https://github.com/apache/couchdb-rebar (fetch) > > origin https://github.com/apache/couchdb-rebar (push) > > upstream https://github.com/rebar/rebar (fetch) > > upstream https://github.com/rebar/rebar (push) > > > > git log --oneline origin/master | head > > 0c435f3 Update master with mainline rebar (v2) > > b6d3094 Merge pull request #620 from tuncer/travis-dialyze > > 8a2aca0 travis-ci: allow Dialyzer job to fail > > 16d5dfe travis-ci: update otp versions > > 4e372a3 travis-ci: enable 20.1 > > 73feb5f rebar_xref: ignore opaque type match Dialyzer warning > > b05882a rebar_cover: ignore opaque type match Dialyzer warning > > 903c89d rebar_utils: fix Dialyzer warning > > b36e72b Run Dialyzer on Travis-CI > > 4bd43fe Merge pull request #645 from Juliusan/log_fix > > > > git log --oneline upstream/master | head > > b6d3094 Merge pull request #620 from tuncer/travis-dialyze > > 8a2aca0 travis-ci: allow Dialyzer job to fail > > 16d5dfe travis-ci: update otp versions > > 4e372a3 travis-ci: enable 20.1 > > 73feb5f rebar_xref: ignore opaque type match Dialyzer warning > > b05882a rebar_cover: ignore opaque type match Dialyzer warning > > 903c89d rebar_utils: fix Dialyzer warning > > b36e72b Run Dialyzer on Travis-CI > > 4bd43fe Merge pull request #645 from Juliusan/log_fix > > 2276f85 Log out success message with newlines > > > > git diff origin/master upstream/master > > > > > > > > > - call a Makefile from mix.exs. See examples: > > > > - https://github.com/SweetIQ/expostal/blob/master/mix.exs#L9 > > > > - https://github.com/asaaki/discount.ex/blob/master/mix.exs#L6 > > > > - use https://github.com/davisp/erlang-native-compiler > > > > - use https://github.com/blt/port_compiler > > > > > > Paul left a comment about this on the roadmap issue just today. Can you > > > respond to his comment (it was related tot dependencies-of-dependencies, > > > i.e. jiffy) > > > > > > He also raised the concern that it may force us to use only the very > > > latest Erlang versions - can you comment on this? Does the current > > > hex/mix situation require a minimum version? What version is that? > > > > I did use erlang 20.3.8.14 and elixir 1.6.6. However 1.6.6. is supported > > on erlang 19 which is AFAIK a minimal erlang version CouchDB supports. > > > > > > 5. Installing plugins for mix is similar to rebar3. It is sufficient > > to just specify list of plugins in the deps in mix.exs > > > > 6. There are multiple dyalizer plugins to choose from > > > > - https://github.com/jeremyjh/dialyxir > > > > - https://github.com/gabrielgatu/mix-dialyzer > > > > > > I know this is a requirement for Cloudant, but today isn't for base > > > CouchDB. I would prefer not to introduce this requirement at the same > > > time as migrating build tool. > > > > The reason I mentioned it here is because we have 'make dialyze' command. > > > > > > 7. Multiple release managers are supported via mix plugins > > > > - distillery is supported via > > https://hexdocs.pm/distillery/Mix.Releases.Plugin.html > > > > - relx and reltools can be used via > > https://github.com/bitwalker/exrm (deprecated in favor of distillery) > > > > - we can also roll our own mix alias using > > https://github.com/okeuday/reltool_util > > > > - latest elixir versions have `release` command out of the box > > > > 8. Raw dependencies are supported via `compile: false` option > > > > 9. I think it is doable. In the worst case scenario we could just tar > > the content of `src` directory after calling `mix deps.get` > > > > > > > > # Warts of mix in the context of CouchDB project > > > > > > > > - CouchDB doesn't use standard elixir directories layout which caused > > include_lib directives to not work. To solve this issue absolute path to > > `<root>/src` need to be added into include path > > > > - for dependencies managed by mix it is done via `erlc_options` > > parameter > > > > - Unfortunately when we call out to rebar there is no way to modify > > arguments. The problem was solved via setting `ERL_COMPILER_OPTIONS` > > environment variable. Which is not very elegant solution. > > > > > > This may also cause problems on Windows, where we have very specific > > > requirements for compiler options so as to ensure the correct libraries > > > are linked for couchjs and so on. > > > > > > Have you tried compiling on that platform? ;) (Please don't make me do > > > all the work here, again...) > > > > > > > - We need to create empty `rebar.config` file for erlang applications > > which do not have `rebar.config` (all applications in couchdb repo). This > > problem can be fixed by adding mix.exs to dependencies we have control over. > > > > - The mix is slow when we have to call out to rebar. This problem can > > be fixed by adding mix.exs to dependencies we have control over. > > > > > > How much slower? Can you post a comparison of `time make couch` between > > > master and your branch? > > > > master: > > > time bin/rebar get-deps update-deps > > real 0m37.514s > > user 0m1.960s > > sys 0m3.300s > > > time make couch > > real 0m49.677s > > user 0m46.910s > > sys 0m22.210s > > > > mix: > > > time mix do deps.get > > real 0m24.405s > > user 0m1.590s > > sys 0m1.270s > > > time mix deps.compile > > real 3m47.968s > > user 0m0.860s > > sys 0m0.640s > > > > > > # Roadmap > > > > > > > > The full conversion would take some time and if we decide to go with > > mix it makes sense to do it incrementally. Possible roadmap could be: > > > > - initial PR > > > > - offload dependency fetching to mix.exs and generate rebar.config > > so release machinery still works > > > > - Update Makefile targets to call mix > > > > - Choose or implement eunit plugin for mix > > > > - Support running tests individually (replacement for `make eunit > > apps= tests= suites=`) > > > > - Replace rebar plugins we use with alternative solutions > > > > - Figure out how to use dialyzer > > > > - Figure out how to use mix for preparing release > > > > > > Anything that lands on master must support release preparation. If your > > > incremental approach breaks `make dist`, you'll need to stage all of > > > your incremental changes on a feature branch and fix `make dist` before > > > merging to master. master needs to be releasable at all times. > > +1000 > > > > > > Best regards, > > > > ILYA (aka iilyak) > > > > > > -Joan "release engineer hat is now off" Touzet > > > > > > > > >