| <!--- | |
| 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. | |
| --> | |
| ## Process Overview | |
| As part of the Apache governance model, official releases consist of signed | |
| source tarballs approved by the DataFusion PMC. | |
| We then use the code in the approved artifacts to release to crates.io. | |
| ### Change Log | |
| We maintain a `CHANGELOG.md` so our users know what has been changed between releases. | |
| You will need a GitHub Personal Access Token for the following steps. Follow | |
| [these instructions](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) | |
| to generate one if you do not already have one. | |
| The changelog is generated using a Python script which needs `PyGitHub`, installed using pip: | |
| ```shell | |
| pip3 install PyGitHub | |
| ``` | |
| 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 first commit and the current HEAD revision. | |
| ```shell | |
| export GITHUB_TOKEN=<your-token-here> | |
| python ./dev/release/generate-changelog.py v0.51.0 HEAD 0.52.0 > changelog/0.52.0.md | |
| ``` | |
| This script creates a changelog from GitHub PRs based on the labels associated with them as well as looking for | |
| titles starting with `feat:`, `fix:`, or `docs:`. | |
| Add an entry to CHANGELOG.md for the new version | |
| ## Prepare release commits and PR | |
| ### Update Version | |
| Checkout the main commit to be released | |
| ```shell | |
| git fetch apache | |
| git checkout apache/main | |
| ``` | |
| Manually update the version in the root `Cargo.toml` to the release version (e.g. `0.52.0`). | |
| Lastly commit the version change: | |
| ```shell | |
| git commit -a -m 'Update version' | |
| ``` | |
| ## Prepare release candidate artifacts | |
| After the PR gets merged, you are ready to create release artifacts from the | |
| merged commit. | |
| (Note you need to be a committer to run these scripts as they upload to the apache svn distribution servers) | |
| ### Pick a Release Candidate (RC) number | |
| Pick numbers in sequential order, with `0` for `rc0`, `1` for `rc1`, etc. | |
| ### Create git tag for the release: | |
| While the official release artifacts are signed tarballs and zip files, we also | |
| tag the commit it was created for convenience and code archaeology. | |
| Using a string such as `v0.52.0` as the `<version>`, create and push the tag by running these commands: | |
| For example to tag version `0.52.0` | |
| ```shell | |
| git fetch apache | |
| git tag v0.52.0-rc1 apache/main | |
| # push tag to Github remote | |
| git push apache v0.52.0-rc1 | |
| ``` | |
| ### Create, sign, and upload artifacts | |
| Run `create-tarball.sh` with the `<version>` tag and `<rc>` and you found in previous steps: | |
| ```shell | |
| GITHUB_TOKEN=<TOKEN> ./dev/release/create-tarball.sh 0.52.0 1 | |
| ``` | |
| The `create-tarball.sh` script | |
| 1. creates and uploads all release candidate artifacts to the [datafusion | |
| dev](https://dist.apache.org/repos/dist/dev/datafusion) location on the | |
| apache distribution svn server | |
| 2. provide you an email template to | |
| send to dev@datafusion.apache.org for release voting. | |
| ### Vote on Release Candidate artifacts | |
| Send the email output from the script to dev@datafusion.apache.org. | |
| For the release to become "official" it needs at least three PMC members to vote +1 on it. | |
| ### Verifying Release Candidates | |
| The `dev/release/verify-release-candidate.sh` is a script in this repository that can assist in the verification process. Run it like: | |
| ```shell | |
| ./dev/release/verify-release-candidate.sh 0.52.0 1 | |
| ``` | |
| #### If the release is not approved | |
| If the release is not approved, fix whatever the problem is, merge changelog | |
| changes into main if there is any and try again with the next RC number. | |
| ## Finalize the release | |
| NOTE: steps in this section can only be done by PMC members. | |
| ### After the release is approved | |
| Move artifacts to the release location in SVN, using the `release-tarball.sh` script: | |
| ```shell | |
| ./dev/release/release-tarball.sh 0.52.0 1 | |
| ``` | |
| Promote the rc tag to the release tag | |
| ```shell | |
| git tag v0.52.0 v0.52.0-rc3 | |
| git push apache v0.52.0 | |
| ``` | |
| Congratulations! The release is now official! | |
| ### Publish on Crates.io | |
| Only approved releases of the tarball should be published to | |
| crates.io, in order to conform to Apache Software Foundation | |
| governance standards. | |
| A DataFusion committer can publish this crate after an official project release has | |
| been made to crates.io using the following instructions. | |
| Follow [these | |
| instructions](https://doc.rust-lang.org/cargo/reference/publishing.html) to | |
| create an account and login to crates.io before asking to be added as an owner | |
| to the sqlparser DataFusion crates. | |
| Download and unpack the official release tarball | |
| Verify that the Cargo.toml in the tarball contains the correct version | |
| (e.g. `version = "0.52.0"`) and then publish the crates by running the following commands | |
| ```shell | |
| cargo publish | |
| ``` | |
| If necessary, also publish the `sqlparser_derive` crate: | |
| crates.io homepage: https://crates.io/crates/sqlparser_derive | |
| ```shell | |
| (cd derive && cargo publish | |
| ``` |