From 41ee3a9bbf76ca68c106f6b5366d5e23647080e9 Mon Sep 17 00:00:00 2001 From: cecemei Date: Tue, 21 Oct 2025 20:06:18 -0700 Subject: [PATCH 1/9] release --- distribution/asf-release-process-guide.md | 52 ++++++++++++++++++---- distribution/bin/tag-missing-milestones.py | 11 ++++- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/distribution/asf-release-process-guide.md b/distribution/asf-release-process-guide.md index 7799f9a1de5f..f5c536440a70 100644 --- a/distribution/asf-release-process-guide.md +++ b/distribution/asf-release-process-guide.md @@ -19,6 +19,45 @@ ## Getting Started +### 🚀 Release Checklist + +- [ ] [Announce intention to release](#Announce-intention-to-release) +- [ ] [Create a release branch](#Create-a-release-branch) + - [ ] [Preparing the release branch](#Preparing-the-release-branch) + - [ ] [Preparing the master branch for the next version after branching](#Preparing-the-master-branch-for-the-next-version-after-branching) + - [ ] [Backport PRs tagged with release milestone](#Backport-PRs-tagged-with-release-milestone) + - [ ] [Release branch hygiene](#Release-branch-hygiene) +- [ ] [Initial setup to create a release candidate](#Initial-setup-to-create-a-release-candidate) + - [ ] [SVN access](#SVN-access) + - [ ] [GPG key](#GPG-key) + - [ ] [Key propagation](#Key-propagation) + - [ ] [Maven credentials](#Maven-credentials) +- [ ] [LICENSE and NOTICE handling](#LICENSE-and-NOTICE-handling) +- [ ] [Release notes](#Release-notes) +- [ ] [Building a release candidate](#Building-a-release-candidate) + - [ ] [Update the release branch to have all commits needed](#Update-the-release-branch-to-have-all-commits-needed) + - [ ] [Set version and make a tag](#Set-version-and-make-a-tag) + - [ ] [Do a clean clone (so the source distribution does not pick up extra files)](#Do-a-clean-clone-so-the-source-distribution-does-not-pick-up-extra-files) + - [ ] [Switch to tag](#Switch-to-tag) + - [ ] [Build Artifacts](#Build-Artifacts) + - [ ] [Verify checksums](#Verify-checksums) + - [ ] [Verify GPG signatures](#Verify-GPG-signatures) + - [ ] [Commit artifacts to SVN repo](#Commit-artifacts-to-SVN-repo) + - [ ] [Update druid.staged.apache.org](#Update-druidstagedapacheorg) + - [ ] [Create staged Maven repo](#Create-staged-Maven-repo) + - [ ] [Release candidates and voting](#Release-candidates-and-voting) + - [ ] [Druid PMC vote result](#Druid-PMC-vote-result) +- [Final Release](#Final-Release) + - [ ] [Create git tag](#Create-git-tag) + - [ ] [Publish release artifacts to SVN](#Publish-release-artifacts-to-SVN) + - [ ] [Publish the staged Maven repo](#Publish-the-staged-Maven-repo) + - [ ] [Wait 24 hours then update druid.apache.org](#Wait-24-hours-then-update-druidapacheorg) + - [ ] [Draft a release on github](#draft-a-release-on-github) + - [ ] [Announce the release](#Announce-the-release) + - [ ] [Update Wikipedia](#Update-Wikipedia) + - [ ] [Remove old releases which are not 'active'](#remove-old-releases-which-are-not-active) + + ### Announce intention to release First up in performing an official release of Apache Druid is to announce in the dev mailing list, dev@druid.apache.org, that it is about time for the next (approximately) quarterly release, or, that there is a critical bug that warrants doing a bug fix release, whatever the reason happens to be. Check for any critical bugs that are still open, or issues or PRs tagged with the release milestone, and give the community a bit of heads up to try and wrap up anything that _needs_ to be in the next release. @@ -120,10 +159,8 @@ The sample [`docker-compose.yml`](https://github.com/apache/druid/blob/master/di Once this is completed, open a PR to the master branch. Also, be sure to confirm that these versions are all correct in the release branch, otherwise fix them and open a backport PR to the release branch. -#### Updating redirect links in the docs - -For docs, please make sure to add any relevant redirects in `website/redirects.json`. This has to be done before building the new website. - +### Backport PRs tagged with release milestone +If a PR is merged into the master branch after the release branch is created and tagged with the release version, then the commit must be backported to the release branch. ### Release branch hygiene @@ -134,7 +171,7 @@ To check the CI status on a release branch, you can go to the commits page e.g. a green ✔ in the commit description. If the commit has a failed build, please click on red ✕ icon in the commit description to go to travis build job and investigate. You can restart a failed build via travis if it is flaky. -The release manager should also keep an eye-out for `Cron Job Unit Tests` failures: https://github.com/apache/druid/actions/workflows/cron-job-unit-tests.yml. If there are failures, we need to fix them before creating an RC. +The release manager should also keep an eye-out for `Cron Job ITS` failures: https://github.com/apache/druid/actions/workflows/cron-job-its.yml. If there are failures, we need to fix them before creating an RC. Once all issues and PRs that are still tagged with the release milestone have been merged, closed, or removed from the milestone and CI on branch is green, the next step is to put together a release candidate. @@ -626,15 +663,12 @@ Returning to the staged repo you created for the Druid PMC vote ( https://reposi https://central.sonatype.org/pages/releasing-the-deployment.html#close-and-drop-or-release-your-staging-repository -### Wait 24 hours +### Wait 24 hours then update druid.apache.org Apache policy requires projects to wait at least 24 hours after uploading artifacts before announcing a release, to allow time for the release artifacts to propagate across mirrors. http://www.apache.org/legal/release-policy.html#release-announcements - -### Update druid.apache.org - > Before you start, you need the following: Python 3.11 (or later) and Node 16.14 (or later). This repo (`druid`) is the source of truth for the Markdown files. The Markdown files get copied to `druid-website-src` and built there as part of the release process. It's all handled by a script in that repo called `do_all_things`. diff --git a/distribution/bin/tag-missing-milestones.py b/distribution/bin/tag-missing-milestones.py index cf41afd63b65..9fb731106355 100755 --- a/distribution/bin/tag-missing-milestones.py +++ b/distribution/bin/tag-missing-milestones.py @@ -53,8 +53,15 @@ continue if pr['milestone'] is None: print("Tagging Pull Request {} with milestone {}".format(pr_number, milestone)) - url = "https://api.github.com/repos/apache/druid/issues/{}".format(pr_number) - requests.patch(url, json=milestone_json, auth=(github_username, os.environ["GIT_TOKEN"])) + if os.environ.get("DRY_RUN", "true").lower() == "false": + url = "https://api.github.com/repos/apache/druid/issues/{}".format(pr_number) + response = requests.patch(url, json=milestone_json, auth=(github_username, os.environ["GIT_TOKEN"])) + if response.status_code == 200: + print("✅ Tagged Pull Request {}".format(pr['html_url'])) + else: + print("❌ Response: {}".format(response.json())) + else: + print("💤 Dry run mode, not tagging Pull Request {}".format(pr['html_url'])) else: print("Skipping Pull Request {} since it's already tagged with milestone {}".format(pr_number, pr['milestone']['number'])) From 54b10b290011d1887f35067190a9e2bae2a156d6 Mon Sep 17 00:00:00 2001 From: cecemei Date: Fri, 24 Oct 2025 16:37:22 -0700 Subject: [PATCH 2/9] prior-to-starting --- distribution/asf-release-process-guide.md | 166 ++++++++++----------- distribution/bin/find-missing-backports.py | 8 +- distribution/bin/tag-missing-milestones.py | 2 +- 3 files changed, 88 insertions(+), 88 deletions(-) diff --git a/distribution/asf-release-process-guide.md b/distribution/asf-release-process-guide.md index f5c536440a70..cad15dadb04a 100644 --- a/distribution/asf-release-process-guide.md +++ b/distribution/asf-release-process-guide.md @@ -17,21 +17,19 @@ ~ under the License. --> -## Getting Started - -### 🚀 Release Checklist +## 🚀 Release Checklist +- [ ] [Prior to starting, initial setup for release access](#prior-to-starting-initial-setup-for-release-access) + - [ ] [SVN access](#SVN-access) + - [ ] [GPG key](#GPG-key) + - [ ] [Key propagation](#Key-propagation) + - [ ] [Maven credentials](#Maven-credentials) - [ ] [Announce intention to release](#Announce-intention-to-release) - [ ] [Create a release branch](#Create-a-release-branch) - [ ] [Preparing the release branch](#Preparing-the-release-branch) - [ ] [Preparing the master branch for the next version after branching](#Preparing-the-master-branch-for-the-next-version-after-branching) - [ ] [Backport PRs tagged with release milestone](#Backport-PRs-tagged-with-release-milestone) - [ ] [Release branch hygiene](#Release-branch-hygiene) -- [ ] [Initial setup to create a release candidate](#Initial-setup-to-create-a-release-candidate) - - [ ] [SVN access](#SVN-access) - - [ ] [GPG key](#GPG-key) - - [ ] [Key propagation](#Key-propagation) - - [ ] [Maven credentials](#Maven-credentials) - [ ] [LICENSE and NOTICE handling](#LICENSE-and-NOTICE-handling) - [ ] [Release notes](#Release-notes) - [ ] [Building a release candidate](#Building-a-release-candidate) @@ -58,11 +56,77 @@ - [ ] [Remove old releases which are not 'active'](#remove-old-releases-which-are-not-active) -### Announce intention to release +## Prior to starting, initial setup for release access + +### SVN access + +Make sure that you have Apache SVN access set up, as several steps in the release process will require you to make SVN commits. + +### GPG key + +First, make sure you've set up a GPG key according to ASF instructions: https://www.apache.org/dev/openpgp.html + +### Key propagation + +The Apache guide suggests using the MIT keyserver, but if there are availability issues consider using https://sks-keyservers.net/ or http://pgp.surfnet.nl/ + +After your key has been propagated to public key servers, add your key fingerprint as your `OpenPGP Public Key Primary Fingerprint` at https://id.apache.org. + +The key fingerprint can be seen with `gpg --list-keys`, e.g.: + +```plaintext +... +pub rsa4096 2019-02-28 [SC] + 0495E031C35D132479C241EC9283C4921AC4483E +uid [ultimate] Jonathan Wei (CODE SIGNING KEY) +sub rsa4096 2019-02-28 [E] +... +``` + +`0495E031C35D132479C241EC9283C4921AC4483E` is the fingerprint in the example above. + +If all goes well, your Apache account will be associated with that key, which you can check at https://people.apache.org/committer-index.html + +You will also need to add your key to our project KEYS file: https://dist.apache.org/repos/dist/release/druid/KEYS, this repo can be pulled with: + +```bash +$ svn co https://dist.apache.org/repos/dist/release/druid +``` + +Add your entry to the file and commit: + +```bash +$ svn commit -m 'add key for jonwei@apache.org' +``` + +### Maven credentials + +You'll need to configure Maven with your Apache credentials by adding the following to `~/.m2/settings.xml`. Encrypt the password you store here, see https://maven.apache.org/guides/mini/guide-encryption.html for details. + +```xml + + + + + apache.snapshots.https + your-apache-username + {your-encrypted-password} + + + + apache.releases.https + your-apache-username + {your-encrypted-password} + + + +``` + +## Announce intention to release First up in performing an official release of Apache Druid is to announce in the dev mailing list, dev@druid.apache.org, that it is about time for the next (approximately) quarterly release, or, that there is a critical bug that warrants doing a bug fix release, whatever the reason happens to be. Check for any critical bugs that are still open, or issues or PRs tagged with the release milestone, and give the community a bit of heads up to try and wrap up anything that _needs_ to be in the next release. -### Create a release branch +## Create a release branch Next up is creating the release branch off of master (or the previous release branch for a bug fix release). Be sure to do this from the apache git repo, _not your fork_. Name the branch for the release version that is being created, omitting the `druid` prefix that will appear on the release candidate and release tags: @@ -78,7 +142,7 @@ $ git checkout origin/master $ git checkout -b 0.17.0 ``` -#### Preparing the release branch +### Preparing the release branch Ensure that the web console and docker-compose file are in the correct state in the release branch. [package.json](../web-console/package.json) and [package-lock.json](../web-console/package-lock.json) should match the release version. If they do not, run: @@ -124,7 +188,7 @@ The sample [`docker-compose.yml`](https://github.com/apache/druid/blob/master/di Once everything is ready, then push the branch to `origin`. -#### Preparing the master branch for the next version after branching +### Preparing the master branch for the next version after branching If doing a quarterly release, it will also be necessary to prepare master for the release _after_ the release you are working on, by setting the version to the next release snapshot: ```bash @@ -160,7 +224,9 @@ The sample [`docker-compose.yml`](https://github.com/apache/druid/blob/master/di Once this is completed, open a PR to the master branch. Also, be sure to confirm that these versions are all correct in the release branch, otherwise fix them and open a backport PR to the release branch. ### Backport PRs tagged with release milestone -If a PR is merged into the master branch after the release branch is created and tagged with the release version, then the commit must be backported to the release branch. +If a PR is merged into the master branch after the release branch is created and tagged with the release version, then the commit must be backported to the release branch. Following tools can be helpful: +- [tag-missing-milestones](bin/tag-missing-milestones.py) +- [find-missing-backports](bin/find-missing-backports.py) ### Release branch hygiene @@ -175,81 +241,15 @@ The release manager should also keep an eye-out for `Cron Job ITS` failures: htt Once all issues and PRs that are still tagged with the release milestone have been merged, closed, or removed from the milestone and CI on branch is green, the next step is to put together a release candidate. -## Initial setup to create a release candidate - -### SVN access - -Make sure that you have Apache SVN access set up, as several steps in the release process will require you to make SVN commits. - -### GPG key - -First, make sure you've set up a GPG key according to ASF instructions: https://www.apache.org/dev/openpgp.html - -### Key propagation - -The Apache guide suggests using the MIT keyserver, but if there are availability issues consider using https://sks-keyservers.net/ or http://pgp.surfnet.nl/ - -After your key has been propagated to public key servers, add your key fingerprint as your `OpenPGP Public Key Primary Fingerprint` at https://id.apache.org. - -The key fingerprint can be seen with `gpg --list-keys`, e.g.: - -```plaintext -... -pub rsa4096 2019-02-28 [SC] - 0495E031C35D132479C241EC9283C4921AC4483E -uid [ultimate] Jonathan Wei (CODE SIGNING KEY) -sub rsa4096 2019-02-28 [E] -... -``` - -`0495E031C35D132479C241EC9283C4921AC4483E` is the fingerprint in the example above. - -If all goes well, your Apache account will be associated with that key, which you can check at https://people.apache.org/committer-index.html - -You will also need to add your key to our project KEYS file: https://dist.apache.org/repos/dist/release/druid/KEYS, this repo can be pulled with: - -```bash -$ svn co https://dist.apache.org/repos/dist/release/druid -``` - -Add your entry to the file and commit: - -```bash -$ svn commit -m 'add key for jonwei@apache.org' -``` - -### Maven credentials - -You'll need to configure Maven with your Apache credentials by adding the following to `~/.m2/settings.xml`. Encrypt the password you store here, see https://maven.apache.org/guides/mini/guide-encryption.html for details. - -```xml - - - - - apache.snapshots.https - your-apache-username - {your-encrypted-password} - - - - apache.releases.https - your-apache-username - {your-encrypted-password} - - - -``` - ## LICENSE and NOTICE handling -Before cutting a release candidate, the release manager should ensure that the contents of our `LICENSE` and `NOTICE` files are up-to-date. You should specifically check that copyright YEAR is updated in the `NOTICE` file. +The license check has been handle by CI. This section is for informational purposes only in most cases. However, if this is the first release of the year, you should ensure that copyright `YEAR` in the `NOTICE` file has been updated. The following links are helpful for understanding Apache's third-party licensing policies: -http://www.apache.org/dev/licensing-howto.html -http://www.apache.org/legal/src-headers.html -http://www.apache.org/legal/resolved.html +- http://www.apache.org/dev/licensing-howto.html +- http://www.apache.org/legal/src-headers.html +- http://www.apache.org/legal/resolved.html There are in effect 2 versions of the `LICENSE` and `NOTICE` file needed to perform a release, one set for the official ASF source release which are the actual `LICENSE` and `NOTICE` file in the root directory, and second for the convenience binary release which includes all of Druid's dependencies which we synthesize using some tools we have developed over the initial set of releases. diff --git a/distribution/bin/find-missing-backports.py b/distribution/bin/find-missing-backports.py index e412527d00f9..9f3400c0118e 100755 --- a/distribution/bin/find-missing-backports.py +++ b/distribution/bin/find-missing-backports.py @@ -57,7 +57,7 @@ def find_next_url(links): if link.find("rel=\"next\"") >= 0: match_result = re.match("", link) if match_result is None: - raise Exception("Next link[{}] is found but can't find url".format(link)) + raise Exception("❌ Next link[{}] is found but can't find url".format(link)) else: url_holder = match_result.group(0) return url_holder[1:-1] @@ -84,7 +84,7 @@ def find_next_url(links): previous_branch_first_commit = subprocess.check_output(command, shell=True).decode('UTF-8') match_result = re.match("(\w+) .*", previous_branch_first_commit) if match_result is None: - raise Exception("Can't find the first commit of the previous release.") + raise Exception("❌ Can't find the first commit of the previous release.") previous_branch_first_commit = match_result.group(1) print("Previous branch: {}, first commit: {}".format(previous_branch, previous_branch_first_commit)) @@ -110,14 +110,14 @@ def find_next_url(links): pr_url = "https://api.github.com/search/issues?per_page=50&page={}&q=milestone:{}+type:pr+is:merged+is:closed+repo:apache/druid".format(page,milestone_title) pr_resp = requests.get(pr_url, auth=(github_username, os.environ["GIT_TOKEN"])).json() if pr_resp['incomplete_results']: - sys.stderr.write('This script cannot handle incomplete results') + sys.stderr.write('❌ This script cannot handle incomplete results') sys.exit(1) pr_items.extend(pr_resp['items']) if len(pr_resp['items']) < 50: print("Total PRs for current milestone: {}".format(len(pr_items))) print("Total expected count: {}".format(pr_resp['total_count'])) if pr_resp['total_count'] != len(pr_items): - sys.stderr.write('Expected PR count does not match with number of PRs fetched') + sys.stderr.write('❌ Expected PR count does not match with number of PRs fetched') sys.exit(1) break find_missing_backports(pr_items, release_pr_subjects, release_pr_numbers) diff --git a/distribution/bin/tag-missing-milestones.py b/distribution/bin/tag-missing-milestones.py index 9fb731106355..2a797d3e9cbd 100755 --- a/distribution/bin/tag-missing-milestones.py +++ b/distribution/bin/tag-missing-milestones.py @@ -66,6 +66,6 @@ print("Skipping Pull Request {} since it's already tagged with milestone {}".format(pr_number, pr['milestone']['number'])) except Exception as e: - print("Got exception for commit: {} ex: {}".format(sha, e)) + print("❌ Got exception for commit: {} ex: {}".format(sha, e)) continue From 975db022f4af4ad735475febc93f3a1524b10186 Mon Sep 17 00:00:00 2001 From: cecemei Date: Tue, 28 Oct 2025 11:21:31 -0700 Subject: [PATCH 3/9] docs --- distribution/asf-release-process-guide.md | 24 +++++++++++++---------- distribution/bin/get-milestone-prs.py | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/distribution/asf-release-process-guide.md b/distribution/asf-release-process-guide.md index cad15dadb04a..7d3731885c3c 100644 --- a/distribution/asf-release-process-guide.md +++ b/distribution/asf-release-process-guide.md @@ -319,10 +319,10 @@ The [make-linkable-release-notes](bin/make-linkable-release-notes.py) script can The release branch should have all commits merged before you create a tag. A commit must be in the release branch if 1) it is merged into the master branch before the release branch is created. In this case, the PR corresponding -to the commit might not have the milestone tagged. The `tag-missing-milestones` script can be useful to find such PRs and +to the commit might not have the milestone tagged. The [tag-missing-milestones](bin/tag-missing-milestones.py) script can be useful to find such PRs and tag them properly. See the above [Release notes](#release-notes) section for more details about the script. 2) it is merged into the master branch after the release branch is created and tagged with the release version. -In this case, the commit must be backported to the release branch. The `find-missing-backports` script can be used to +In this case, the commit must be backported to the release branch. The [find-missing-backports](bin/find-missing-backports.py) script can be used to find such commits that have not been backported. Note that this script relies on the milestone tagged in the PR, so PRs must be tagged properly to make this script working. See the above [Release notes](#release-notes) section for more details about the script. @@ -417,7 +417,7 @@ $ svn commit -m 'add 0.17.0-rc3 artifacts' > Before you start, you need the following: Python 3.11 (or later) and Node 16.14 (or later). -This repo (`druid`) is the source of truth for the Markdown files. The Markdown files get copied to `druid-website-src` and built there as part of the release process. It's all handled by a script in that repo called `do_all_things`. +This repo (`druid-release`) is the source of truth for the Markdown files. The Markdown files get copied to `druid-website-src` and built there as part of the release process. It's all handled by a script in that repo called `do_all_things`. For more thorough instructions and a description of what the `do_all_things` script does, see the [`druid-website-src` README](https://github.com/apache/druid-website-src) @@ -439,15 +439,17 @@ For more thorough instructions and a description of what the `do_all_things` scr 4. Make a PR to the src repo (https://github.com/apache/druid-website-src) for the release branch. In the changed files, you should see the following: - - In `published_versions` directory: HTML files for `docs/VERSION` , `docs/latest`, and assorted HTML and non-HTML files + - In `build` directory: HTML files for `docs/VERSION` , `docs/latest`, and assorted HTML and non-HTML files - In the `docs` directory at the root of the repo, the new Markdown files. All these files should be part of your PR to `druid-website-src`. - Verify the site looks fine and that the versions on the homepage and Downloads page look correct. You can run `http-server` or something similar in `published_versions`. + Verify the site looks fine and that the versions on the homepage and Downloads page look correct. You can run `http-server` or something similar in `build`. - The PR to `druid-website-src` should not be merged. Leave it in draft for reference. It can be closed when you're ready to push to production. -5. Make a PR to the website repo (https://github.com/apache/druid-website) for the `asf-staging` branch using the contents of `published_versions` in `druid-website-src`. Once the website PR is pushed to `asf-staging`, https://druid.staged.apache.org/ will be updated near immediately with the new docs. +5. Make a PR to the website repo (https://github.com/apache/druid-website) for the `asf-staging` branch using the contents of `build` in `druid-website-src`. + - From `druid-website`, run `rsync -av ../druid-website-src/build/* .`, this overwrites assets/docs and doesn't delete docs from previous versions. + - Once the website PR is pushed to `asf-staging`, https://druid.staged.apache.org/ will be updated near immediately with the new docs. ### Create staged Maven repo @@ -696,15 +698,17 @@ For more thorough instructions and a description of what the `do_all_things` scr 5. Add the files to a PR to the src repo (https://github.com/apache/druid-website-src) for the release branch you just created. In the changed files, you should see the following: - - In `published_versions` directory: HTML files for `docs/VERSION` , `docs/latest`, and assorted HTML and non-HTML files. + - In `build` directory: HTML files for `docs/VERSION` , `docs/latest`, and assorted HTML and non-HTML files. - In the `docs` directory at the root of the repo, the new Markdown files. All these files should be part of your PR to `druid-website-src`. - Verify the site looks fine and that the versions on the homepage and Downloads page look correct. You can run `http-server` or something similar in `published_versions`. + Verify the site looks fine and that the versions on the homepage and Downloads page look correct. You can run `http-server` or something similar in `build`. -6. Make a PR to the website repo (https://github.com/apache/druid-website) for the `asf-site` branch using the contents of `published_versions` in `druid-website-src`. Once the website PR is pushed to `asf-site`, https://druid.apache.org/ will be updated near immediately with the new docs. +6. Make a PR to the website repo (https://github.com/apache/druid-website) for the `asf-site` branch using the contents of `build` in `druid-website-src`. + - From `druid-website`, run `rsync -av ../druid-website-src/build/* .`, this overwrites assets/docs and doesn't delete docs from previous versions. + - Once the website PR is pushed to `asf-site`, https://druid.apache.org/ will be updated near immediately with the new docs. -7. When the site is published, the release PR to `druid-website-src` can also be merged. `asf-site` in `druid-website` and `published_versions` on the `master` branch in `druid-website-src` should align. +7. When the site is published, the release PR to `druid-website-src` can also be merged. `asf-site` in `druid-website` and `build` on the `master` branch in `druid-website-src` should align. ### Draft a release on github diff --git a/distribution/bin/get-milestone-prs.py b/distribution/bin/get-milestone-prs.py index 28e05968082b..e86a2b024bdd 100755 --- a/distribution/bin/get-milestone-prs.py +++ b/distribution/bin/get-milestone-prs.py @@ -71,7 +71,7 @@ milestone = pr["milestone"] if milestone is not None: milestone_found = True - print("COMMIT: {}, PR#: {}, MILESTONE: {}".format(commit_id, pr["number"], pr["milestone"]["url"])) + print("COMMIT: {}, PR#: {}, MILESTONE: {}".format(commit_id, pr["html_url"], pr["milestone"]["url"])) if not milestone_found: print("NO MILESTONE FOUND FOR COMMIT: {}, CLOSED PRs: {}".format(commit_id, closed_pr_nums)) From dc19e1b868e1fc787625c76c17583651da6307e9 Mon Sep 17 00:00:00 2001 From: cecemei Date: Mon, 10 Nov 2025 00:23:12 -0800 Subject: [PATCH 4/9] 35 --- distribution/asf-release-process-guide.md | 96 ++++++++++------------- 1 file changed, 40 insertions(+), 56 deletions(-) diff --git a/distribution/asf-release-process-guide.md b/distribution/asf-release-process-guide.md index 7d3731885c3c..6d83a5c1e302 100644 --- a/distribution/asf-release-process-guide.md +++ b/distribution/asf-release-process-guide.md @@ -475,7 +475,7 @@ provider inserts linebreaks beyond a certain length. ##### Subject ```plaintext -[VOTE] Release Apache Druid 0.17.0 [RC3] +[VOTE] Release Apache Druid 35.0.0 [RC1] ``` ##### Body @@ -483,81 +483,67 @@ provider inserts linebreaks beyond a certain length. ```plaintext Hi all, -I have created a build for Apache Druid 0.17.0, release -candidate 3. +I have created a build for Apache Druid 35.0.0, release candidate 1. -Thanks for everyone who has helped contribute to the release! You can read -the proposed release notes here: -https://github.com/apache/druid/issues/9066 +Thanks to everyone who has helped contribute to the release! You can read the proposed release notes here: +https://github.com/apache/druid/issues/18630 -The release candidate has been tagged in GitHub as -druid-0.17.0-rc3 (54d29e438a4df34d75e2385af6cefd1092c4ebb3), -available here: -https://github.com/apache/druid/releases/tag/druid-0.17.0-rc3 +The release candidate has been tagged in GitHub as druid-35.0.0-rc1 (f6712c6694a2b95961607c3ceac0123418641d40), +available here: https://github.com/apache/druid/releases/tag/druid-35.0.0-rc1 The artifacts to be voted on are located here: -https://dist.apache.org/repos/dist/dev/druid/0.17.0-rc3/ +https://dist.apache.org/repos/dist/dev/druid/35.0.0-rc1/ A staged Maven repository is available for review at: -https://repository.apache.org/content/repositories/orgapachedruid-1016/ +https://repository.apache.org/content/repositories/orgapachedruid-1091/ Staged druid.apache.org website documentation is available here: -https://druid.staged.apache.org/docs/0.17.0/design/index.html +https://druid.staged.apache.org/docs/35.0.0/design/index.html -A Docker image containing the binary of the release candidate can be -retrieved via: -docker pull apache/druid:0.17.0-rc3 +A Docker image containing the binary of the release candidate can be retrieved via: +docker pull apache/druid:35.0.0-rc1 artifact checksums src: -1f25c55e83069cf7071a97c1e0d56732437dbac4ef373ed1ed72b5b618021b74c107269642226e80081354c8da2e92dc26f1541b01072a4720fd6cfe8dc161a8 +831c273d3c9806d2e73a8f216a29b33a4a10eed12f812258b01d0d1cb063d96806b420cd758dda8641beaf7e813855dafb676bfb1c706391a69ad524a16fe45c bin: -0c4b71f077e28d2f4d3bc3f072543374570b98ec6a1918a5e1828e1da7e3871b5efb04070a8bcdbc172a817e43254640ce28a99757984be7d8dd3d607f1d870e -docker: df9b900d3726ce123a5c054768da1ea08eba6efe635ced5abc3ad72d6c835e2c +28d9efef40d3e9e4328694bbb9fb449f19470b77c859d3cf83a0e475b6bd5f0dd0e8c9fe596e0801cf9105f2daf424ed3f136b9209d70a434bc6b43dc4d441cf +docker: +1c48677ee8a8dc633edcc5f2b29393a09b35d0e5f065cf2863872c02c47485b3 Release artifacts are signed with the following key: -https://people.apache.org/keys/committer/cwylie.asc +https://people.apache.org/keys/committer/yqm.asc -This key and the key of other committers can also be found in the project's -KEYS file here: +This key and the key of other committers can also be found in the project's KEYS file here: https://dist.apache.org/repos/dist/release/druid/KEYS -(If you are a committer, please feel free to add your own key to that file -by following the instructions in the file's header.) - +(If you are a committer, please feel free to add your own key to that file by following the instructions in the file's header.) Verify checksums: -diff <(shasum -a512 apache-druid-0.17.0-src.tar.gz | \ -cut -d ' ' -f1) \ -<(cat apache-druid-0.17.0-src.tar.gz.sha512 ; echo) +diff <(shasum -a512 apache-druid-35.0.0-src.tar.gz | cut -d ' ' -f1) \ +<(cat apache-druid-35.0.0-src.tar.gz.sha512 ; echo) -diff <(shasum -a512 apache-druid-0.17.0-bin.tar.gz | \ -cut -d ' ' -f1) \ -<(cat apache-druid-0.17.0-bin.tar.gz.sha512 ; echo) +diff <(shasum -a512 apache-druid-35.0.0-bin.tar.gz | cut -d ' ' -f1) \ +<(cat apache-druid-35.0.0-bin.tar.gz.sha512 ; echo) Verify signatures: -gpg --verify apache-druid-0.17.0-src.tar.gz.asc \ -apache-druid-0.17.0-src.tar.gz +gpg --verify apache-druid-35.0.0-src.tar.gz.asc apache-druid-35.0.0-src.tar.gz -gpg --verify apache-druid-0.17.0-bin.tar.gz.asc \ -apache-druid-0.17.0-bin.tar.gz +gpg --verify apache-druid-35.0.0-bin.tar.gz.asc apache-druid-35.0.0-bin.tar.gz -Please review the proposed artifacts and vote. Note that Apache has -specific requirements that must be met before +1 binding votes can be cast -by PMC members. Please refer to the policy at -http://www.apache.org/legal/release-policy.html#policy for more details. +Please review the proposed artifacts and vote. +Note that Apache has specific requirements that must be met before +1 binding votes can be cast by PMC members. +Please refer to the policy at https://www.apache.org/legal/release-policy.html#policy for more details. -As part of the validation process, the release artifacts can be generated -from source by running: +As part of the validation process, the release artifacts can be generated from source by running: mvn clean install -Papache-release,dist -Dgpg.skip The RAT license check can be run from source by: mvn apache-rat:check -Prat -This vote will be open for at least 72 hours. The vote will pass if a -majority of at least three +1 PMC votes are cast. +This vote will be open for at least 72 hours. The vote will pass if a majority of at least three +1 PMC votes are cast. -[ ] +1 Release this package as Apache Druid 0.17.0 +[ ] +1 Release this package as Apache Druid 35.0.0 [ ] 0 I don't feel strongly about it, but I'm okay with the release [ ] -1 Do not release this package because... @@ -599,7 +585,7 @@ Once the Druid community vote passes (or fails), close the vote with a thread li ##### Subject ```plaintext -[RESULT][VOTE] Release Apache Druid 0.17.0 [RC3] +[RESULT][VOTE] Release Apache Druid 35.0.0 [RC1] ``` ##### Body @@ -607,13 +593,11 @@ Once the Druid community vote passes (or fails), close the vote with a thread li ```plaintext Thanks to everyone who participated in the vote! The results are as follows: -Clint Wylie: +1 (non-binding) -Jihoon Son: +1 (binding) -Furkan KAMACI: +1 (non-binding) -Julian Hyde: +1 (binding) -David Lim: +1 (binding) -Surekha Saharan: +1 (non-binding) +Lucas Capistrant: +1 (binding) +Clint Wylie: +1 (binding) +Kashif Faraz: +1 (binding) +The vote has passed with 3 binding +1 votes! ... ``` @@ -641,9 +625,9 @@ Once a release candidate has passed the Druid PMC vote, you'll need to do the fo Tag the rc that passed vote as the release tag and push to github. ```bash -$ git checkout druid-0.17.0-rc3 -$ git tag druid-0.17.0 -$ git push origin tag druid-0.17.0 +$ git checkout druid-35.0.0-rc1 +$ git tag druid-35.0.0 +$ git push origin tag druid-35.0.0 ``` ### Publish release artifacts to SVN @@ -653,11 +637,11 @@ The final release artifacts are kept in the `https://dist.apache.org/repos/dist/ Use `svn mv` to publish the release artifacts as below: ```bash -$ svn mv https://dist.apache.org/repos/dist/dev/druid/0.17.0-rc3 https://dist.apache.org/repos/dist/release/druid/0.17.0 -m 'add 0.17.0 artifacts' +$ svn mv https://dist.apache.org/repos/dist/dev/druid/35.0.0-rc1 https://dist.apache.org/repos/dist/release/druid/35.0.0 -m 'add 35.0.0 artifacts' ``` Replace the versions of the release candidate and the release with the ones you are currently working on. This command will drop those artifacts from the dev repo but add them to the release repo. -Once the `svn mv` command succeeds, you should be able to see the release artifacts in `https://dist.apache.org/repos/dist/release/druid/0.17.0`. +Once the `svn mv` command succeeds, you should be able to see the release artifacts in `https://dist.apache.org/repos/dist/release/druid/35.0.0`. ### Publish the staged Maven repo Returning to the staged repo you created for the Druid PMC vote ( https://repository.apache.org/#stagingRepositories), "Release" the repo to publish the Maven artifacts. From 67c51050bdb0eab40fdfe2c7a4d279b480825a83 Mon Sep 17 00:00:00 2001 From: cecemei Date: Fri, 10 Apr 2026 14:21:45 -0700 Subject: [PATCH 5/9] format --- distribution/asf-release-process-guide.md | 33 +++++++++++++--------- distribution/bin/find-missing-backports.py | 2 ++ distribution/bin/get-milestone-prs.py | 6 ++-- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/distribution/asf-release-process-guide.md b/distribution/asf-release-process-guide.md index 1d951125e472..ef367b90867d 100644 --- a/distribution/asf-release-process-guide.md +++ b/distribution/asf-release-process-guide.md @@ -25,6 +25,7 @@ - [ ] [Key propagation](#Key-propagation) - [ ] [Maven credentials](#Maven-credentials) - [ ] [Announce intention to release](#Announce-intention-to-release) +- [ ] [Security vulnerabilities](#Security-vulnerabilities) - [ ] [Create a release branch](#Create-a-release-branch) - [ ] [Preparing the release branch](#Preparing-the-release-branch) - [ ] [Preparing the master branch for the next version after branching](#Preparing-the-master-branch-for-the-next-version-after-branching) @@ -126,20 +127,23 @@ You'll need to configure Maven with your Apache credentials by adding the follow First up in performing an official release of Apache Druid is to announce in the dev mailing list, dev@druid.apache.org, that it is about time for the next (approximately) quarterly release, or, that there is a critical bug that warrants doing a bug fix release, whatever the reason happens to be. Check for any critical bugs that are still open, or issues or PRs tagged with the release milestone, and give the community a bit of heads up to try and wrap up anything that _needs_ to be in the next release. +## Security vulnerabilities +The release manager should also keep an eye-out for `Cron Job ITS` failures: https://github.com/apache/druid/actions/workflows/cron-job-its.yml. If there are security vulnerabilities, we need to fix them before creating an RC. + ## Create a release branch Next up is creating the release branch off of master (or the previous release branch for a bug fix release). Be sure to do this from the apache git repo, _not your fork_. Name the branch for the release version that is being created, omitting the `druid` prefix that will appear on the release candidate and release tags: ```bash -$ git checkout origin/0.17.0 +$ git checkout origin/master ... -$ git checkout -b 0.17.1 +$ git checkout -b 37.0.0 ``` ```bash -$ git checkout origin/master +$ git checkout origin/37.0.0 ... -$ git checkout -b 0.17.0 +$ git checkout -b 37.0.1 ``` ### Preparing the release branch @@ -148,18 +152,18 @@ Ensure that the web console and docker-compose file are in the correct state in [package.json](../web-console/package.json) and [package-lock.json](../web-console/package-lock.json) should match the release version. If they do not, run: ```bash -npm version 0.17.0 +npm version 37.0.0 ``` [unified-console.html](../web-console/unified-console.html), Javascript script tag must match the package.json version: ```html - + ``` [`links.ts`](../web-console/src/links.ts) needs to be adjusted from `'latest'` to the release version: ``` -const DRUID_DOCS_VERSION = '0.17.0'; +const DRUID_DOCS_VERSION = '37.0.0'; ``` After this is done, run: @@ -181,7 +185,7 @@ The sample [`docker-compose.yml`](https://github.com/apache/druid/blob/master/di ```yaml ... coordinator: - image: apache/druid:0.17.0 + image: apache/druid:37.0.0 container_name: coordinator ... ``` @@ -192,13 +196,13 @@ Once everything is ready, then push the branch to `origin`. If doing a quarterly release, it will also be necessary to prepare master for the release _after_ the release you are working on, by setting the version to the next release snapshot: ```bash -$ mvn versions:set -DnewVersion=0.18.0-SNAPSHOT +$ mvn versions:set -DnewVersion=38.0.0-SNAPSHOT ``` You should also prepare the web-console for the next release, by bumping the [package.json](../web-console/package.json) and [package-lock.json](../web-console/package-lock.json) version: ```bash -npm version 0.18.0 +npm version 38.0.0 ``` which will update `package.json` and `package-lock.json`. @@ -206,7 +210,7 @@ which will update `package.json` and `package-lock.json`. You will also need to manually update the top level html file, [unified-console.html](../web-console/unified-console.html), to ensure that the Javascript script tag is set to match the package.json version: ```html - + ``` [`DRUID_DOCS_VERSION` in `links.ts`](../web-console/src/links.ts) should already be set to `'latest'` in the master branch, and so should not have to be adjusted. @@ -216,12 +220,13 @@ The sample [`docker-compose.yml`](https://github.com/apache/druid/blob/master/di ```yaml ... coordinator: - image: apache/druid:0.18.0 + image: apache/druid:38.0.0 container_name: coordinator ... ``` Once this is completed, open a PR to the master branch. Also, be sure to confirm that these versions are all correct in the release branch, otherwise fix them and open a backport PR to the release branch. +You must finish this step right after the branch cut, this affects [auto-add-milestone](../.github/scripts/auto-add-milestone.sh) github action. ### Backport PRs tagged with release milestone If a PR is merged into the master branch after the release branch is created and tagged with the release version, then the commit must be backported to the release branch. Following tools can be helpful: @@ -233,11 +238,11 @@ If a PR is merged into the master branch after the release branch is created and The only additions to the release branch after branching should be bug fixes, which should be back-ported from the master branch, via a second PR or a cherry-pick, not with a direct PR to the release branch. Release manager must also ensure that CI is passing successfully on the release branch. Since CI on branch can contain additional tests such as ITs for different JVM flavours. (Note that CI is sometimes flaky for older branches). -To check the CI status on a release branch, you can go to the commits page e.g. https://github.com/apache/druid/commits/24.0.0. On this page, latest commit should show +To check the CI status on a release branch, you can go to the commits page e.g. https://github.com/apache/druid/commits/37.0.0. On this page, latest commit should show a green ✔ in the commit description. If the commit has a failed build, please click on red ✕ icon in the commit description to go to travis build job and investigate. You can restart a failed build via travis if it is flaky. -The release manager should also keep an eye-out for `Cron Job ITS` failures: https://github.com/apache/druid/actions/workflows/cron-job-its.yml. If there are failures, we need to fix them before creating an RC. +Make sure [Cron Job ITS](https://github.com/apache/druid/actions/workflows/cron-job-its.yml) passes. Once all issues and PRs that are still tagged with the release milestone have been merged, closed, or removed from the milestone and CI on branch is green, the next step is to put together a release candidate. diff --git a/distribution/bin/find-missing-backports.py b/distribution/bin/find-missing-backports.py index 9f3400c0118e..e273c61ef5e0 100755 --- a/distribution/bin/find-missing-backports.py +++ b/distribution/bin/find-missing-backports.py @@ -35,6 +35,8 @@ def extract_pr_title_from_commit_message(commit_msg): def extract_pr_numbers_from_commit_message(commit_msg): extracted_numbers = re.findall(pr_number_pattern, commit_msg) + if len(extracted_numbers) == 0: + print("No pr number found from commit: {}".format(commit_msg)) return extracted_numbers def find_missing_backports(pr_jsons, release_pr_subjects, release_pr_numbers): diff --git a/distribution/bin/get-milestone-prs.py b/distribution/bin/get-milestone-prs.py index e86a2b024bdd..2289d149dddf 100755 --- a/distribution/bin/get-milestone-prs.py +++ b/distribution/bin/get-milestone-prs.py @@ -61,19 +61,19 @@ resp_json = resp.json() milestone_found = False - closed_pr_nums = [] + closed_prs = [] if (resp_json.get("items") is None): print("Could not get PRs for commit ID {}, resp: {}".format(commit_id, resp_json)) continue for pr in resp_json["items"]: - closed_pr_nums.append(pr["number"]) + closed_prs.append(pr["html_url"]) milestone = pr["milestone"] if milestone is not None: milestone_found = True print("COMMIT: {}, PR#: {}, MILESTONE: {}".format(commit_id, pr["html_url"], pr["milestone"]["url"])) if not milestone_found: - print("NO MILESTONE FOUND FOR COMMIT: {}, CLOSED PRs: {}".format(commit_id, closed_pr_nums)) + print("NO MILESTONE FOUND FOR COMMIT: {}, CLOSED PRs: {}".format(commit_id, closed_prs)) except Exception as e: print("Got exception for commitID: {} ex: {}".format(commit_id, e)) From bd8ba493286b46a4ed7bfa53aab27cf8e70cdef1 Mon Sep 17 00:00:00 2001 From: cecemei Date: Tue, 28 Apr 2026 15:25:24 -0700 Subject: [PATCH 6/9] release --- distribution/asf-release-process-guide.md | 92 ++++++++++++----------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/distribution/asf-release-process-guide.md b/distribution/asf-release-process-guide.md index ef367b90867d..cf6dbe64a5c3 100644 --- a/distribution/asf-release-process-guide.md +++ b/distribution/asf-release-process-guide.md @@ -335,10 +335,11 @@ must be tagged properly to make this script working. See the above [Release note Once the release branch is good for an RC, you can build a new tag with: ```bash -$ mvn -Pwebsite-docs -DreleaseVersion=0.17.0 -DdevelopmentVersion=0.18.0-SNAPSHOT -Dtag=druid-0.17.0-rc3 -DpushChanges=false -DskipTests -Darguments=-DskipTests clean release:clean release:prepare +$ mvn -Pwebsite-docs -DreleaseVersion=37.0.0 -DdevelopmentVersion=38.0.0-SNAPSHOT -Dtag=druid-37.0.0-rc1 -DpushChanges=false -DskipTests -Darguments=-DskipTests clean release:clean release:prepare +$ git push origin tag druid-37.0.0-rc1 ``` -In this example it will create a tag, `druid-0.17.0-rc3`. If this release passes vote then we can add the final `druid-0.17.0` release tag later. +In this example it will create a tag, `druid-37.0.0-rc1`. If this release passes vote then we can add the final `druid-37.0.0` release tag later. We added `website-docs` profile, because otherwise, website module is not updated with rc version. @@ -353,7 +354,7 @@ $ git clone git@github.com:apache/druid.git druid-release ### Switch to tag ```bash -$ git checkout druid-0.17.0-rc3 +$ cd druid-release && git checkout druid-37.0.0-rc1 ``` ### Build Artifacts @@ -365,12 +366,12 @@ $ mvn clean install -Papache-release,dist,rat -DskipTests -Dgpg.keyname= The commit might fail with the following message if the tarball exceeds 450MB in size (the current limit on the size of a single commit). If this happens, ensure that the tar does not include any superfluous dependencies. If the size is still not within 450MB, raise a ticket with asfinfra to increase the limit. > ``` -> $ svn commit -m 'add 0.17.0-rc3 artifacts' -> Adding (bin) apache-druid-25.0.0-bin.tar.gz +> $ svn commit -m 'add 37.0.0-rc1 artifacts' +> Adding (bin) apache-druid-37.0.0-bin.tar.gz > Transmitting file data .svn: E175002: Commit failed (details follow): > svn: E175002: PUT request on '/repos/dist/!svn/txr/58803-1dhj/dev/druid/25.0.0-rc1/apache-druid-25.0.0-bin.tar.gz' failed > ``` @@ -429,7 +431,7 @@ For more thorough instructions and a description of what the `do_all_things` scr 2. From `druid-website`, checkout a staging branch based off of the `asf-staging` branch. -3. From `druid-website-src`, create a release branch from `master`, such as `27.0.0-staging`. +3. From `druid-website-src`, create a release branch from `master`, such as `37.0.0-staging`. 1. Update the version list in `static/js/version.js` with the version you're releasing. The highest release version goes in position 0. Make sure to remove older releases. We only keep the 3 most recent listed in the file. If this is a patch release, replace the prior release of that version. For example, replace `27.0.0` with `27.0.1`. Don't add a new entry. 2. In this file, also update the release date. This is a placeholder date since the final date isn't decided until voting completes. You'll need to update it again before doing the production steps. 3. In `scripts`, run: @@ -438,7 +440,7 @@ For more thorough instructions and a description of what the `do_all_things` scr # Include `--skip-install` if you already have Docusaurus 2 installed in druid-website-src. # The script assumes you use `npm`. If you use `yarn`, include `--yarn`. - python do_all_things.py -v VERSION --source /my/path/to/apache/druid + python do_all_things.py -v VERSION --source /my/path/to/apache/druid-release ``` @@ -479,7 +481,7 @@ provider inserts linebreaks beyond a certain length. ##### Subject ```plaintext -[VOTE] Release Apache Druid 35.0.0 [RC1] +[VOTE] Release Apache Druid 37.0.0 [RC2] ``` ##### Body @@ -487,33 +489,33 @@ provider inserts linebreaks beyond a certain length. ```plaintext Hi all, -I have created a build for Apache Druid 35.0.0, release candidate 1. +I have created a build for Apache Druid 37.0.0, release candidate 2. Thanks to everyone who has helped contribute to the release! You can read the proposed release notes here: -https://github.com/apache/druid/issues/18630 +https://github.com/apache/druid/issues/19287 -The release candidate has been tagged in GitHub as druid-35.0.0-rc1 (f6712c6694a2b95961607c3ceac0123418641d40), -available here: https://github.com/apache/druid/releases/tag/druid-35.0.0-rc1 +The release candidate has been tagged in GitHub as druid-37.0.0-rc2 (b206640c830bc2c3bdc2867cfb317c902a0e1acb), +available here: https://github.com/apache/druid/releases/tag/druid-37.0.0-rc2 The artifacts to be voted on are located here: -https://dist.apache.org/repos/dist/dev/druid/35.0.0-rc1/ +https://dist.apache.org/repos/dist/dev/druid/37.0.0-rc2/ A staged Maven repository is available for review at: -https://repository.apache.org/content/repositories/orgapachedruid-1091/ +https://repository.apache.org/content/repositories/orgapachedruid-1098/ Staged druid.apache.org website documentation is available here: -https://druid.staged.apache.org/docs/35.0.0/design/index.html +https://druid.staged.apache.org/docs/37.0.0/design/index.html A Docker image containing the binary of the release candidate can be retrieved via: -docker pull apache/druid:35.0.0-rc1 +docker pull apache/druid:37.0.0-rc2 artifact checksums src: -831c273d3c9806d2e73a8f216a29b33a4a10eed12f812258b01d0d1cb063d96806b420cd758dda8641beaf7e813855dafb676bfb1c706391a69ad524a16fe45c +f0ba5dbd3897b61d8956b5e9d1075d3f1681ff6905db505ac674c8f5b5bc899876cc3fee52b1799323a4fff8282d61d693dfef15d037cab656945952c2abefa2 bin: -28d9efef40d3e9e4328694bbb9fb449f19470b77c859d3cf83a0e475b6bd5f0dd0e8c9fe596e0801cf9105f2daf424ed3f136b9209d70a434bc6b43dc4d441cf -docker: -1c48677ee8a8dc633edcc5f2b29393a09b35d0e5f065cf2863872c02c47485b3 +ba2f23755676a057df93e6ceb5cc9d158d1b0c8f693a9b189d7048c57aea161773b039076bfeb5d2eb1bc1cd318d8f80a5030bcb6ab7deaf30ba8b019cfb57be +docker: +15be98e21ac7c63cab1a60d26a0499c362173970e38046ae73624e01ae387641 Release artifacts are signed with the following key: https://people.apache.org/keys/committer/yqm.asc @@ -524,16 +526,16 @@ https://dist.apache.org/repos/dist/release/druid/KEYS (If you are a committer, please feel free to add your own key to that file by following the instructions in the file's header.) Verify checksums: -diff <(shasum -a512 apache-druid-35.0.0-src.tar.gz | cut -d ' ' -f1) \ -<(cat apache-druid-35.0.0-src.tar.gz.sha512 ; echo) +diff <(shasum -a512 apache-druid-37.0.0-src.tar.gz | cut -d ' ' -f1) \ +<(cat apache-druid-37.0.0-src.tar.gz.sha512 ; echo) -diff <(shasum -a512 apache-druid-35.0.0-bin.tar.gz | cut -d ' ' -f1) \ -<(cat apache-druid-35.0.0-bin.tar.gz.sha512 ; echo) +diff <(shasum -a512 apache-druid-37.0.0-bin.tar.gz | cut -d ' ' -f1) \ +<(cat apache-druid-37.0.0-bin.tar.gz.sha512 ; echo) Verify signatures: -gpg --verify apache-druid-35.0.0-src.tar.gz.asc apache-druid-35.0.0-src.tar.gz +gpg --verify apache-druid-37.0.0-src.tar.gz.asc apache-druid-37.0.0-src.tar.gz -gpg --verify apache-druid-35.0.0-bin.tar.gz.asc apache-druid-35.0.0-bin.tar.gz +gpg --verify apache-druid-37.0.0-bin.tar.gz.asc apache-druid-37.0.0-bin.tar.gz Please review the proposed artifacts and vote. Note that Apache has specific requirements that must be met before +1 binding votes can be cast by PMC members. @@ -547,7 +549,7 @@ mvn apache-rat:check -Prat This vote will be open for at least 72 hours. The vote will pass if a majority of at least three +1 PMC votes are cast. -[ ] +1 Release this package as Apache Druid 35.0.0 +[ ] +1 Release this package as Apache Druid 37.0.0 [ ] 0 I don't feel strongly about it, but I'm okay with the release [ ] -1 Do not release this package because... @@ -589,7 +591,7 @@ Once the Druid community vote passes (or fails), close the vote with a thread li ##### Subject ```plaintext -[RESULT][VOTE] Release Apache Druid 35.0.0 [RC1] +[RESULT][VOTE] Release Apache Druid 37.0.0 [RC1] ``` ##### Body @@ -629,9 +631,9 @@ Once a release candidate has passed the Druid PMC vote, you'll need to do the fo Tag the rc that passed vote as the release tag and push to github. ```bash -$ git checkout druid-35.0.0-rc1 -$ git tag druid-35.0.0 -$ git push origin tag druid-35.0.0 +$ git checkout druid-37.0.0-rc1 +$ git tag druid-37.0.0 +$ git push origin tag druid-37.0.0 ``` ### Publish release artifacts to SVN @@ -641,11 +643,11 @@ The final release artifacts are kept in the `https://dist.apache.org/repos/dist/ Use `svn mv` to publish the release artifacts as below: ```bash -$ svn mv https://dist.apache.org/repos/dist/dev/druid/35.0.0-rc1 https://dist.apache.org/repos/dist/release/druid/35.0.0 -m 'add 35.0.0 artifacts' +$ svn mv https://dist.apache.org/repos/dist/dev/druid/37.0.0-rc1 https://dist.apache.org/repos/dist/release/druid/37.0.0 -m 'add 37.0.0 artifacts' ``` Replace the versions of the release candidate and the release with the ones you are currently working on. This command will drop those artifacts from the dev repo but add them to the release repo. -Once the `svn mv` command succeeds, you should be able to see the release artifacts in `https://dist.apache.org/repos/dist/release/druid/35.0.0`. +Once the `svn mv` command succeeds, you should be able to see the release artifacts in `https://dist.apache.org/repos/dist/release/druid/37.0.0`. ### Publish the staged Maven repo Returning to the staged repo you created for the Druid PMC vote ( https://repository.apache.org/#stagingRepositories), "Release" the repo to publish the Maven artifacts. From c5f51c9e2833e61ba33c23f76b9d5a2dd1ec31f2 Mon Sep 17 00:00:00 2001 From: cecemei Date: Fri, 8 May 2026 15:44:09 -0700 Subject: [PATCH 7/9] release --- distribution/asf-release-process-guide.md | 43 +++++++++++++---------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/distribution/asf-release-process-guide.md b/distribution/asf-release-process-guide.md index cf6dbe64a5c3..f8fc0c37e459 100644 --- a/distribution/asf-release-process-guide.md +++ b/distribution/asf-release-process-guide.md @@ -591,7 +591,7 @@ Once the Druid community vote passes (or fails), close the vote with a thread li ##### Subject ```plaintext -[RESULT][VOTE] Release Apache Druid 37.0.0 [RC1] +[RESULT][VOTE] Release Apache Druid 37.0.0 [RC2] ``` ##### Body @@ -601,7 +601,7 @@ Thanks to everyone who participated in the vote! The results are as follows: Lucas Capistrant: +1 (binding) Clint Wylie: +1 (binding) -Kashif Faraz: +1 (binding) +Cece Mei: +1 (binding) The vote has passed with 3 binding +1 votes! ... @@ -609,7 +609,7 @@ The vote has passed with 3 binding +1 votes! ### Cancelling a vote -If for any reason during the Druid PMC vote a blocking issue becomes apparent, a vote should be officially cancelled by sending an email with the following subject line: `[CANCEL][VOTE] Release Apache Druid 0.17.0 [RC3]` and the reasons for the cancellation in the body. +If for any reason during the Druid PMC vote a blocking issue becomes apparent, a vote should be officially cancelled by sending an email with the following subject line: `[CANCEL][VOTE] Release Apache Druid 37.0.0 [RC3]` and the reasons for the cancellation in the body. ### Previous vote threads for additional examples @@ -631,7 +631,7 @@ Once a release candidate has passed the Druid PMC vote, you'll need to do the fo Tag the rc that passed vote as the release tag and push to github. ```bash -$ git checkout druid-37.0.0-rc1 +$ git checkout druid-37.0.0-rc2 $ git tag druid-37.0.0 $ git push origin tag druid-37.0.0 ``` @@ -643,14 +643,14 @@ The final release artifacts are kept in the `https://dist.apache.org/repos/dist/ Use `svn mv` to publish the release artifacts as below: ```bash -$ svn mv https://dist.apache.org/repos/dist/dev/druid/37.0.0-rc1 https://dist.apache.org/repos/dist/release/druid/37.0.0 -m 'add 37.0.0 artifacts' +$ svn mv https://dist.apache.org/repos/dist/dev/druid/37.0.0-rc2 https://dist.apache.org/repos/dist/release/druid/37.0.0 -m 'add 37.0.0 artifacts' ``` Replace the versions of the release candidate and the release with the ones you are currently working on. This command will drop those artifacts from the dev repo but add them to the release repo. Once the `svn mv` command succeeds, you should be able to see the release artifacts in `https://dist.apache.org/repos/dist/release/druid/37.0.0`. ### Publish the staged Maven repo -Returning to the staged repo you created for the Druid PMC vote ( https://repository.apache.org/#stagingRepositories), "Release" the repo to publish the Maven artifacts. +Returning to the staged repo you created for the Druid PMC vote (https://repository.apache.org/#stagingRepositories), "Release" the repo to publish the Maven artifacts. https://central.sonatype.org/pages/releasing-the-deployment.html#close-and-drop-or-release-your-staging-repository @@ -713,32 +713,39 @@ Additionally, announce it to the Druid official ASF Slack channel, https://druid ##### Subject ```plaintext -[ANNOUNCE] Apache Druid 0.17.0 release +[ANNOUNCE] Apache Druid 37.0.0 release ``` ##### Body ```plaintext -The Apache Druid team is proud to announce the release of Apache Druid 0.17.0. +The Apache Druid team is proud to announce the release of Apache Druid 37.0.0. Druid is a high performance analytics data store for event-driven data. -Apache Druid 0.17.0 contains over 350 new features, performance -enhancements, bug fixes, and major documentation improvements from 50 +Apache Druid 37.0.0 contains over 255 new features, performance +enhancements, bug fixes, and major documentation improvements from 29 contributors. Major new features and improvements include: -- 'Vectorized' query processing -- 'Minor' compaction -- Native parallel indexing with shuffle -- New 'indexer' process -- Huge improvements to the web console -- New documentation website -- Official Docker image +- Removed hadoop-based ingestion +- Dynamic query blocklist +- Dynamic default query context on Broker +- Broker tier selection for real-time servers +- Manual Broker routing in the web console +- Minor compaction to compact only fragmented segments for Overlord-based compaction +- Fingerprinting mechanism to track compaction states for Overlord-based compaction +- Cascading reindexing to apply different compaction configurations based on the age of your data +- Read-only authorizer +- Thrift input format +- sys.queries table for Dart engine +- New Consul contrib extension for service discovery and Coordinator/Overlord leader election + +Also, Auto-compaction using compaction supervisors, Multi-supervisor ingestion, Incremental cache, Kubernetes-based task management are now generally available! Source and binary distributions can be downloaded from: https://druid.apache.org/downloads.html Release notes are at: -https://github.com/apache/druid/releases/tag/druid-0.17.0 +https://github.com/apache/druid/releases/tag/druid-37.0.0 A big thank you to all the contributors in this milestone release! ``` From 3162459a477b6c5fe2b2f21a04b26e6d5840d24d Mon Sep 17 00:00:00 2001 From: cecemei Date: Tue, 6 Oct 2026 16:17:53 -0700 Subject: [PATCH 8/9] review --- distribution/asf-release-process-guide.md | 5 ++++- distribution/bin/tag-missing-milestones.py | 5 +++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/distribution/asf-release-process-guide.md b/distribution/asf-release-process-guide.md index f8fc0c37e459..b5c8076c010f 100644 --- a/distribution/asf-release-process-guide.md +++ b/distribution/asf-release-process-guide.md @@ -140,6 +140,8 @@ $ git checkout origin/master $ git checkout -b 37.0.0 ``` +For a hotfix or minor version release, branch off of the previous release branch instead: + ```bash $ git checkout origin/37.0.0 ... @@ -405,6 +407,7 @@ $ svn checkout https://dist.apache.org/repos/dist/dev/druid Copy the `src` and `bin` artifacts to a folder for the release version and add it to SVN and publish the artifacts: ```bash +$ mkdir 37.0.0-rc1 $ cp ../druid-release/distribution/target/apache* ./37.0.0-rc1/. $ svn add 37.0.0-rc1 ... @@ -609,7 +612,7 @@ The vote has passed with 3 binding +1 votes! ### Cancelling a vote -If for any reason during the Druid PMC vote a blocking issue becomes apparent, a vote should be officially cancelled by sending an email with the following subject line: `[CANCEL][VOTE] Release Apache Druid 37.0.0 [RC3]` and the reasons for the cancellation in the body. +If for any reason during the Druid PMC vote a blocking issue becomes apparent, a vote should be officially cancelled by sending an email with the following subject line: `[CANCEL][VOTE] Release Apache Druid 37.0.0 [RC2]` and the reasons for the cancellation in the body. ### Previous vote threads for additional examples diff --git a/distribution/bin/tag-missing-milestones.py b/distribution/bin/tag-missing-milestones.py index 2a797d3e9cbd..8b9e420c02df 100755 --- a/distribution/bin/tag-missing-milestones.py +++ b/distribution/bin/tag-missing-milestones.py @@ -25,6 +25,7 @@ sys.stderr.write(" e.g., program myusername 75c70c2ccc 29f3a328da 30\n") sys.stderr.write(" e.g., The milestone number for Druid 30 is 56, since the milestone has the url https://github.com/apache/druid/milestone/56\n") sys.stderr.write(" It is also necessary to set a GIT_TOKEN environment variable containing a personal access token.\n") + sys.stderr.write(" Set the APPLY_TAGS environment variable to 'false' to preview changes without actually tagging any pull requests (defaults to 'true').\n") sys.exit(1) expected_apache_html_url_prefix = "https://github.com/apache/druid/pull/" @@ -53,7 +54,7 @@ continue if pr['milestone'] is None: print("Tagging Pull Request {} with milestone {}".format(pr_number, milestone)) - if os.environ.get("DRY_RUN", "true").lower() == "false": + if os.environ.get("APPLY_TAGS", "true").lower() == "true": url = "https://api.github.com/repos/apache/druid/issues/{}".format(pr_number) response = requests.patch(url, json=milestone_json, auth=(github_username, os.environ["GIT_TOKEN"])) if response.status_code == 200: @@ -61,7 +62,7 @@ else: print("❌ Response: {}".format(response.json())) else: - print("💤 Dry run mode, not tagging Pull Request {}".format(pr['html_url'])) + print("💤 APPLY_TAGS is false, not tagging Pull Request {}".format(pr['html_url'])) else: print("Skipping Pull Request {} since it's already tagged with milestone {}".format(pr_number, pr['milestone']['number'])) From a703a4d8e169fcb7bcdfecfbc8bbc0799250330b Mon Sep 17 00:00:00 2001 From: cecemei Date: Wed, 7 Oct 2026 10:44:24 -0700 Subject: [PATCH 9/9] lowercase --- distribution/asf-release-process-guide.md | 66 +++++++++++------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/distribution/asf-release-process-guide.md b/distribution/asf-release-process-guide.md index b5c8076c010f..2d11997970d6 100644 --- a/distribution/asf-release-process-guide.md +++ b/distribution/asf-release-process-guide.md @@ -20,40 +20,40 @@ ## 🚀 Release Checklist - [ ] [Prior to starting, initial setup for release access](#prior-to-starting-initial-setup-for-release-access) - - [ ] [SVN access](#SVN-access) - - [ ] [GPG key](#GPG-key) - - [ ] [Key propagation](#Key-propagation) - - [ ] [Maven credentials](#Maven-credentials) -- [ ] [Announce intention to release](#Announce-intention-to-release) -- [ ] [Security vulnerabilities](#Security-vulnerabilities) -- [ ] [Create a release branch](#Create-a-release-branch) - - [ ] [Preparing the release branch](#Preparing-the-release-branch) - - [ ] [Preparing the master branch for the next version after branching](#Preparing-the-master-branch-for-the-next-version-after-branching) - - [ ] [Backport PRs tagged with release milestone](#Backport-PRs-tagged-with-release-milestone) - - [ ] [Release branch hygiene](#Release-branch-hygiene) -- [ ] [LICENSE and NOTICE handling](#LICENSE-and-NOTICE-handling) -- [ ] [Release notes](#Release-notes) -- [ ] [Building a release candidate](#Building-a-release-candidate) - - [ ] [Update the release branch to have all commits needed](#Update-the-release-branch-to-have-all-commits-needed) - - [ ] [Set version and make a tag](#Set-version-and-make-a-tag) - - [ ] [Do a clean clone (so the source distribution does not pick up extra files)](#Do-a-clean-clone-so-the-source-distribution-does-not-pick-up-extra-files) - - [ ] [Switch to tag](#Switch-to-tag) - - [ ] [Build Artifacts](#Build-Artifacts) - - [ ] [Verify checksums](#Verify-checksums) - - [ ] [Verify GPG signatures](#Verify-GPG-signatures) - - [ ] [Commit artifacts to SVN repo](#Commit-artifacts-to-SVN-repo) - - [ ] [Update druid.staged.apache.org](#Update-druidstagedapacheorg) - - [ ] [Create staged Maven repo](#Create-staged-Maven-repo) - - [ ] [Release candidates and voting](#Release-candidates-and-voting) - - [ ] [Druid PMC vote result](#Druid-PMC-vote-result) -- [Final Release](#Final-Release) - - [ ] [Create git tag](#Create-git-tag) - - [ ] [Publish release artifacts to SVN](#Publish-release-artifacts-to-SVN) - - [ ] [Publish the staged Maven repo](#Publish-the-staged-Maven-repo) - - [ ] [Wait 24 hours then update druid.apache.org](#Wait-24-hours-then-update-druidapacheorg) + - [ ] [SVN access](#svn-access) + - [ ] [GPG key](#gpg-key) + - [ ] [Key propagation](#key-propagation) + - [ ] [Maven credentials](#maven-credentials) +- [ ] [Announce intention to release](#announce-intention-to-release) +- [ ] [Security vulnerabilities](#security-vulnerabilities) +- [ ] [Create a release branch](#create-a-release-branch) + - [ ] [Preparing the release branch](#preparing-the-release-branch) + - [ ] [Preparing the master branch for the next version after branching](#preparing-the-master-branch-for-the-next-version-after-branching) + - [ ] [Backport PRs tagged with release milestone](#backport-prs-tagged-with-release-milestone) + - [ ] [Release branch hygiene](#release-branch-hygiene) +- [ ] [LICENSE and NOTICE handling](#license-and-notice-handling) +- [ ] [Release notes](#release-notes) +- [ ] [Building a release candidate](#building-a-release-candidate) + - [ ] [Update the release branch to have all commits needed](#update-the-release-branch-to-have-all-commits-needed) + - [ ] [Set version and make a tag](#set-version-and-make-a-tag) + - [ ] [Do a clean clone (so the source distribution does not pick up extra files)](#do-a-clean-clone-so-the-source-distribution-does-not-pick-up-extra-files) + - [ ] [Switch to tag](#switch-to-tag) + - [ ] [Build Artifacts](#build-artifacts) + - [ ] [Verify checksums](#verify-checksums) + - [ ] [Verify GPG signatures](#verify-gpg-signatures) + - [ ] [Commit artifacts to SVN repo](#commit-artifacts-to-svn-repo) + - [ ] [Update druid.staged.apache.org](#update-druidstagedapacheorg) + - [ ] [Create staged Maven repo](#create-staged-maven-repo) + - [ ] [Release candidates and voting](#release-candidates-and-voting) + - [ ] [Druid PMC vote result](#druid-pmc-vote-result) +- [Final Release](#final-release) + - [ ] [Create git tag](#create-git-tag) + - [ ] [Publish release artifacts to SVN](#publish-release-artifacts-to-svn) + - [ ] [Publish the staged Maven repo](#publish-the-staged-maven-repo) + - [ ] [Wait 24 hours then update druid.apache.org](#wait-24-hours-then-update-druidapacheorg) - [ ] [Draft a release on github](#draft-a-release-on-github) - - [ ] [Announce the release](#Announce-the-release) - - [ ] [Update Wikipedia](#Update-Wikipedia) + - [ ] [Announce the release](#announce-the-release) + - [ ] [Update Wikipedia](#update-wikipedia) - [ ] [Remove old releases which are not 'active'](#remove-old-releases-which-are-not-active)