The situation
- Multi-module clojure-contrib has not worked well
- Build is compilicated and slow
- Still hard for authors to work on their libs
- We will have more projects under the org.clojure umbrella
- New contrib libraries: nrepl, unify, finger-tree
- More on the way
- Current Clojure release process involves manual steps
The goals, in order of priority
- For users
- 1. Find release versions
- 2. IDE / tool support
- 3. Get just the stuff they need, without stuff they don't
- 4. Easy-to-use distributions containing multiple libraries known to work together
- For developers
- 1. Build / release automation
- 2. Unified build / release process across projects
- 3. IDE / tool support
The process
- Git repositories
- https://github.com/clojure
- New contrib libs get their own repos under the "clojure" organization
- Each lib gets one or more "owners" who have commit access
- Library authors still use JIRA + patches to accept contributions
- All contributors must have a CA
- JIRA
- Each contrib lib will get its own JIRA
- Maven
- http://dev.clojure.org/display/design/Common+Contrib+Build
- Clojure and all contrib projects will be built with Maven 2
- All project POMs will inherit from a parent POM
- build.poms, containing:
- org.clojure : pom.oss-deploy
- Inherits from Sonatype's OSS POM
- Defines release process (OSS snapshots + staging)
- org.clojure : pom.baseline
- Inherits from pom.oss-deploy
- Sets license
- Configures Java 1.5 as a target
- org.clojure : pom.contrib
- Inherits from pom.baseline
- Sets common plugin/build configuration
- Defaults to source-only JAR, override to AOT-compile only when necessary
- org.clojure : pom.oss-deploy
- build.poms, containing:
- SNAPSHOT releases
- Push to github
- Hudson builds automatically
- Automatically deploys to Sonatype OSS SNAPSHOT repo
- Numbered releases
- http://build.clojure.org/job/clojure-testbuild/
- In Hudson, click "Perform Maven Release" link
- Specify a release version number and the next development version number
- In Hudson's local checkout of the project:
- modifies pom.xml with the release version number, commits, tags with version
- modifies pom.xml with the dev. version number, commits to master
- checks out the tagged release, builds & deploys to Sonatype OSS
- Creates a numbered "staging" repository
- Automatically closes and promotes the staging repo to Sonatype "releases"
- Sonatype automatically syncs to Maven Central
Choices to be made
- Automatic release from staging to central?
- YES
- Manual promotion from staging repository to central
- Permits additional testing before release
- Once in central, cannot be changed
- What to do with "classic" contrib?
- Freeze the old multi-module repository after 1.3.0 final release
- Most modules already released as source-only JARs, can still use w/ new Clojures
- Only AOT-compiled modules left are condition, fnmap, jmx, repl-ln
- Create new repositories to continue dev on popular libraries
- Freeze the old multi-module repository after 1.3.0 final release
Work to be done
- Investigating putting POMs in the clojure repository
- The patch: CLJ-681
- Changes:
- Real pom.xml
- Parent build configuration in org.clojure:pom.baseline
- build instructions in README
- 'slim' and 'distribution' assemblies
- bootstrap_compile.clj script to compile in correct order
- version.properties generated by the version in pom.xml
- Different format from old version.properties
- minor changes to clojure.core to generate clojure-version
- fix tests that assumed Ant as the test driver
- Final version ready shortly after this meeting
- Release as alpha4
- Changes:
- Redirect repositories at build.clojure.org to OSS Sonatype
- Assuming we roll all existing releases into central, we only need to set up redirects for /snapshots
- TODO Investigate moving parent POMs into the "clojure" repository
- Get clojure-maven-plugin under org.clojure
- TODO get this done before we apply CLJ-681
- Mark Derricut is willing
- Needs written permission from 30 past contributors
- Send email to the clojure-dev list giving permission
- TODO make standard form email
- They also need a CA
- Send email to the clojure-dev list giving permission
- We can rewrite the plugin if we can't get the necessary permissions
- Working on clojure-maven-plugin and clojure.lang.Compile
- Sometimes compilation pauses for a long time (minutes) at the end
- TODO figure out why
- core is dependent on compilation order
- TODO figure out why this happens
- Masked by the scripty nature of the Ant build
- Worked around with bootstrap script
- Current clojure-maven-plugin does not specify compile order
- Should this change?
- Sometimes compilation pauses for a long time (minutes) at the end
- Making the build process better
- Investigate Maven 3
- Investigate Polyglot Maven
- Documentation: how do I do X, Y, or Z?
- Write more plugins
- Not hard
- Possible in Clojure
- More portable than shell scripts
- Developing other non-Maven tools
- Will require a lot of work to match what Maven can do
- Not a Clojure/core priority
- Possible future development
- Leiningen support
- Ant build scripts for local development/testing
- Aggregate projects that package many contrib libraries in one distribution
- Testing harness to build/test many Clojure libraries with a locally-built Clojure JAR
Labels: