blob: 60d647381713b9bc36d48528861175083e04a186 [file] [view]
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# Apache DataFusion Comet: Release Process
This documentation explains the release process for Apache DataFusion Comet.
## Creating the Release Candidate
This part of the process can be performed by any committer.
Here are the steps, using the 0.1.0 release as an example.
### Create Release Branch
This document assumes that GitHub remotes are set up as follows:
```shell
$ git remote -v
apache git@github.com:apache/datafusion-comet.git (fetch)
apache git@github.com:apache/datafusion-comet.git (push)
origin git@github.com:yourgithubid/datafusion-comet.git (fetch)
origin git@github.com:yourgithubid/datafusion-comet.git (push)
```
Create a release branch from the latest commit in main and push to the `apache` repo:
```shell
get fetch apache
git checkout main
git reset --hard apache/main
git checkout -b branch-0.1
git push apache branch-0.1
```
Update the `pom.xml` files in the release branch to update the Maven version from `0.1.0-SNAPSHOT` to `0.1.0`.
There is no need to update the Rust crate versions because they will already be `0.1.0`.
### Update Version in main
Create a PR against the main branch to prepare for developing the next release:
- Update the Rust crate version to `0.2.0`.
- Update the Maven version to `0.2.0-SNAPSHOT` (both in the `pom.xml` files and also in the diff files
under `dev/diffs`).
- Update the CI scripts under the `.github` directory.
### Generate the Change Log
Generate a change log to cover changes between the previous release and the release branch HEAD by running
the provided `generate-changelog.py` script.
It is recommended that you set up a virtual Python environment and then install the dependencies:
```shell
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
```
To generate the changelog, set the `GITHUB_TOKEN` environment variable to a valid token and then run the script
providing two commit ids or tags followed by the version number of the release being created. The following
example generates a change log of all changes between the previous version and the current release branch HEAD revision.
```shell
export GITHUB_TOKEN=<your-token-here>
python3 generate-changelog.py 0.0.0 HEAD 0.1.0 > ../changelog/0.1.0.md
```
Create a PR against the _main_ branch to add this change log and once this is approved and merged, cherry-pick the
commit into the release branch.
### Build the jars
#### Setup to do the build
The build process requires Docker. Download the latest Docker Desktop from https://www.docker.com/products/docker-desktop/.
If you have multiple docker contexts running switch to the context of the Docker Desktop. For example -
```shell
$ docker context ls
NAME DESCRIPTION DOCKER ENDPOINT ERROR
default Current DOCKER_HOST based configuration unix:///var/run/docker.sock
desktop-linux Docker Desktop unix:///Users/parth/.docker/run/docker.sock
my_custom_context * tcp://192.168.64.2:2376
$ docker context use desktop-linux
```
#### Run the build script
The `build-release-comet.sh` script will create a docker image for each architecture and use the image
to build the platform specific binaries. These builder images are created every time this script is run.
The script optionally allows overriding of the repository and branch to build the binaries from (Note that
the local git repo is not used in the building of the binaries, but it is used to build the final uber jar).
```shell
Usage: build-release-comet.sh [options]
This script builds comet native binaries inside a docker image. The image is named
"comet-rm" and will be generated by this script
Options are:
-r [repo] : git repo (default: https://github.com/apache/datafusion-comet.git)
-b [branch] : git branch (default: release)
-t [tag] : tag for the spark-rm docker image to use for building (default: "latest").
```
Example:
```shell
cd dev/release && ./build-release-comet.sh && cd ../..
```
#### Build output
The build output is installed to a temporary local maven repository. The build script will print the name of the
repository location at the end. This location will be required at the time of deploying the artifacts to a staging
repository
### Tag the Release Candidate
Tag the release branch with `0.1.0-rc1` and push to the `apache` repo
```shell
git fetch apache
git checkout branch-0.1
git reset --hard apache/branch-0.1
git tag 0.1.0-rc1
git push apache 0.1.0-rc1
```
Note that pushing a release candidate tag will trigger a GitHub workflow that will build a Docker image and publish
it to GitHub Container Registry at https://github.com/apache/datafusion-comet/pkgs/container/datafusion-comet
## Publishing the Release Candidate
This part of the process can mostly only be performed by a PMC member.
### Publish the maven artifacts
#### Setup maven
##### One time project setup
Setting up your project in the ASF Nexus Repository from here: https://infra.apache.org/publishing-maven-artifacts.html
##### Release Manager Setup
Set up your development environment from here: https://infra.apache.org/publishing-maven-artifacts.html
##### Build and publish a release candidate to nexus.
The script `publish-to-maven.sh` will publish the artifacts created by the `build-release-comet.sh` script.
The artifacts will be signed using the gpg key of the release manager and uploaded to the maven staging repository.
Note that installed GPG keys can be listed with `gpg --list-keys`. The gpg key is a 40 character hex string.
Note: This script needs `xmllint` to be installed. On MacOS xmllint is available by default.
On Ubuntu `apt-get install -y libxml2-utils`
On RedHat `yum install -y xmlstarlet`
```shell
/comet:$./dev/release/publish-to-maven.sh -h
usage: publish-to-maven.sh options
Publish signed artifacts to Maven.
Options
-u ASF_USERNAME - Username of ASF committer account
-r LOCAL_REPO - path to temporary local maven repo (created and written to by 'build-release-comet.sh')
The following will be prompted for -
ASF_PASSWORD - Password of ASF committer account
GPG_KEY - GPG key used to sign release artifacts
GPG_PASSPHRASE - Passphrase for GPG key
```
example
```shell
/comet:$./dev/release/publish-to-maven.sh -u release_manager_asf_id -r /tmp/comet-staging-repo-VsYOX
ASF Password :
GPG Key (Optional):
GPG Passphrase :
Creating Nexus staging repository
...
```
In the Nexus repository UI (https://repository.apache.org/) locate and verify the artifacts in
staging (https://central.sonatype.org/publish/release/#locate-and-examine-your-staging-repository).
If the artifacts appear to be correct, then close and release the repository so it is made visible (this should
actually happen automatically when running the script).
### Create the Release Candidate Tarball
Run the create-tarball script on the release candidate tag (`0.1.0-rc1`) to create the source tarball and upload it to
the dev subversion repository
```shell
./dev/release/create-tarball.sh 0.1.0 1
```
This will generate an email template for starting the vote.
### Start an Email Voting Thread
Send the email that is generated in the previous step to `dev@datafusion.apache.org`.
## Publishing Binary Releases
Once the vote passes, we can publish the source and binary releases.
### Publishing Source Tarball
Run the release-tarball script to move the tarball to the release subversion repository.
```shell
./dev/release/release-tarball.sh 0.1.0 1
```
### Create a release in the GitHub repository
Go to https://github.com/apache/datafusion-comet/releases and create a release for the release tag, and paste the
changelog in the description.
### Publishing Maven Artifacts
Promote the Maven artifacts from staging to production by visiting https://repository.apache.org/#stagingRepositories
and selecting the staging repository and then clicking the "release" button.
### Publishing Crates
Publish the `datafusion-comet-spark-expr` crate to crates.io so that other Rust projects can leverage the
Spark-compatible operators and expressions outside of Spark.
### Push a release tag to the repo
Push a release tag (`0.1.0`) to the `apache` repository.
```shell
git fetch apache
git checkout 0.1.0-rc1
git tag 0.1.0
git push apache 0.1.0
```
Note that pushing a release tag will trigger a GitHub workflow that will build a Docker image and publish
it to GitHub Container Registry at https://github.com/apache/datafusion-comet/pkgs/container/datafusion-comet
Reply to the vote thread to close the vote and announce the release.
## Update released version number in documentation
- We provide direct links to the jar files in Maven
- The Kubernetes page needs updating once the Docker image has been published to GitHub Container Regsistry
## Post Release Admin
Register the release with the [Apache Reporter Service](https://reporter.apache.org/addrelease.html?datafusion) using
a version such as `COMET-0.1.0`.
### Delete old RCs and Releases
See the ASF documentation on [when to archive](https://www.apache.org/legal/release-policy.html#when-to-archive)
for more information.
#### Deleting old release candidates from `dev` svn
Release candidates should be deleted once the release is published.
Get a list of DataFusion Comet release candidates:
```shell
svn ls https://dist.apache.org/repos/dist/dev/datafusion | grep comet
```
Delete a release candidate:
```shell
svn delete -m "delete old DataFusion Comet RC" https://dist.apache.org/repos/dist/dev/datafusion/apache-datafusion-comet-0.1.0-rc1/
```
#### Deleting old releases from `release` svn
Only the latest release should be available. Delete old releases after publishing the new release.
Get a list of DataFusion releases:
```shell
svn ls https://dist.apache.org/repos/dist/release/datafusion | grep comet
```
Delete a release:
```shell
svn delete -m "delete old DataFusion Comet release" https://dist.apache.org/repos/dist/release/datafusion/datafusion-comet-0.0.0
```
## Post Release Activities
Writing a blog post about the release is a great way to generate more interest in the project. We typically create a
Google document where the community can collaborate on a blog post. Once the content is agreed then a PR can be
created against the [datafusion-site](https://github.com/apache/datafusion-site) repository to add the blog post. Any
contributor can drive this process.