The process of building a new release and publishing to Maven Central is currently a partly manual process.
Each project has a Release
GitHub workflow that will push a release tag to the repo.
The pushing of the release tag will trigger a build, which will build and upload artifacts and create a GitHub release.
What is not currently automated is the updating of Creek's internal dependencies, e.g. once creek-base
is released,
updating other projects that depend on it to the new release version. This needs to be done manually.
PRs to switch to release dependencies prior to release, and to the new snapshot after release,
should be tagged with the chore
label, so that they do not show up in the release notes.
- Check SonaType Lift and review:
- issues: resolving / suppressing as required.
- Dependency security vulnerabilities: Update transient dependencies where fixes exist. Clear out older transient dependency bumps where no longer needed.
- Check Maven Deps for similar to above.
- Run Dependabot on all repos to check for updates to dependencies. This helps ensures all components use a consistent set of 3rd-party libraries.
- Ensure all Dependabot related PRs are building successfully and then merge.
Dependabot PRs will be tagged with the
dependencies
label. - For non-patch releases, set the next release version on all repos to be released, using the
Set Next Version
workflow on GitHub. - For each Creek repo, in the following order:
creek-test | creek-base | --------------------------------- | | creek-observability creek-json-schema | | creek-platform creek-json-schema-gradle-plugin | creek-service | creek-system-test | -------------------------------------- | | creek-kafka & all extensions creek-system-test-gradle-plugin
- ...follow these steps to release:
- Run GitHub dependency bot, e.g. the creek-base dependency bot
This will generate a PR to update the version of other Creek components the repo depends on to the release build.- Ignore any other non-Creek dependency update PRs for now. Merging them could result in inconsistent 3rd party library versions across the components.
- Label the Creek dependency PR with
chore
so that it is excluded from the release notes. - Ensure the PR builds and then merge.
- Wait for the triggered
Build
on themain
branch to complete.
- Run the
Release
workflow on GitHub e.g. Creek test Release. - Ensure the
Release
workflow, and the triggeredBuild
workflow on the release tag, complete successfully. - Ensure artefacts are correctly published to the OSSHR Nexus, and later available on Maven Central.
- Ensure Gradle plugins are published to the Gradle Plugin Portal, e.g. org.creekservice.schema.json
- Run GitHub dependency bot, e.g. the creek-base dependency bot
Once all components are released, follow these post release steps:
- For
creek-test
, commit a small change, e.g. a newline in a doc. This will trigger a new snapshot build to be created. Once build... - For each Creek repo, in the same order as above, namely
creek-test | creek-base | --------------------------------- | | creek-observability creek-json-schema | | creek-platform creek-json-schema-gradle-plugin | creek-service | creek-system-test | -------------------------------------- | | creek-kafka & all extensions creek-system-test-gradle-plugin | | -------------------------------------- | multi & single-module-template
- ...follow these steps to update to the next snapshot:
- Manually change the version to the new snapshot (Dependabot is broken for snapshot releases :'( ).
- Label the PR with
chore
so that it is excluded from the release notes. - Merge this PR once its green.
- Announce on main doc site https://github.com/creek-service/creek-service.github.io
e.g. creek-service/creek-service.github.io#11
- Create a post announcing the new release.
- Update
_pages/home.md
to reference new release version and announcement post.
The Creek organisation in GitHub has secrets containing:
- The GPG key and passphrase used for signing release artifacts. See https://central.sonatype.org/publish/requirements/gpg/ for more info.
- A Nexus API key used for uploading artifacts to Maven Central / OSSHR. See https://blog.solidsoft.pl/2015/09/08/deploy-to-maven-central-using-api-key-aka-auth-token/#nexus-api-key-generation for more info.
Nothing is required on a local developers machine.
However, creating a GPG key and adding it to ~/.gradle/gradle.properties
will mean locally created artifacts are signed before publishing, e.g. to mavenLocal()
.
This can be usual for testing the build scripts.